std::min_element
将返回operator<(T,T)
由自定义谓词或自定义谓词定义的最小元素bool Pred(T,T)
。是否有类似的函数返回投影函数f(T)->R
取最小值的元素?
显然我可以定义bool Pred(t1,t2) { return f(t1) < f(t2); }
,但是当 f 是 lambda 时这有点不方便。
std::min_element
将返回operator<(T,T)
由自定义谓词或自定义谓词定义的最小元素bool Pred(T,T)
。是否有类似的函数返回投影函数f(T)->R
取最小值的元素?
显然我可以定义bool Pred(t1,t2) { return f(t1) < f(t2); }
,但是当 f 是 lambda 时这有点不方便。
为什么不使用Boost.Iterator 库boost::transform_iterator
中的(以前称为projection_iterator_adaptor
)
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
与编写特殊的 less 谓词相比,这样做的优点是您可以将这种方法重用于所有其他算法(例如,std::max_element
您需要一个特殊的更大谓词等)。
为什么不直接定义一个谓词生成器less_by
,它接受一个 lambda,返回一个为您完成工作的函子?
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 …;}));