2013-07-18 16 views
8

std::min_element sẽ trả lại phần tử nhỏ nhất như được xác định theo operator<(T,T) hoặc theo biến vị ngữ tùy chỉnh bool Pred(T,T). Có chức năng tương tự trả về phần tử mà chức năng chiếu f(T)->R có giá trị tối thiểu không?Có biến thể nào của min_element có chức năng chiếu không?

Rõ ràng tôi có thể xác định bool Pred(t1,t2) { return f(t1) < f(t2); } nhưng đó là một chút bất tiện khi f là lambda.

+2

Tính đạo hàm của 'f'. * Ok ok Tôi biết đó là một trò đùa xấu * –

+0

Nhưng khi các ngân hàng sử dụng các dẫn xuất, nó gây ra một cuộc khủng hoảng tài chính _Even tệ hơn joke_: P – MSalters

+1

Nếu 'f' là lambda, bạn có thể chuyển nó sang C++ 1y cao hơn lambda đa hình '[] (auto f) {return [] (tự động t1, tự động t2) {return f (t1) Potatoswatter

Trả lời

4

Tại sao không chỉ xác định trình tạo biến vị ngữ less_by trong đó, lấy một lambda, trả về một hàm functor thực hiện công việc cho bạn?

template <typename Proj> 
struct less_by_t { 
    Proj p; 

    template <typename T> 
    bool operator()(T const& a, T const& b) const { 
     return p(a) < p(b); 
    } 
}; 

template <typename Proj> 
less_by_t<Proj> less_by(Proj p) { 
    return {p}; 
} 
auto result = std::min_element(begin, end, less_by([](T const& x){return …;})); 
4

Tại sao không sử dụng một boost::transform_iterator (mà thường được gọi là projection_iterator_adaptor) từ Boost.Iterator library

auto Pred = [](some_value_type const& x){ /* your lambda here */ }; 
auto result = std::min_element(
    boost::make_transform_iterator(begin(container), Pred),  
    boost::make_transform_iterator(end(container), Pred) 
).base(); 
//^^^^^^^ <-- to get back an iterator to the original sequence 

Ưu điểm của việc này trên viết một ít vị đặc biệt mà bạn có thể tái sử dụng phương pháp này cho tất cả các thuật toán khác (ví dụ: đối với std::max_element, bạn sẽ cần một vị từ đặc biệt lớn hơn, v.v.).

Các vấn đề liên quan