将vector <foo>转换为vector <double>并找到最小值

时间:2015-08-19 20:21:49

标签: c++ c++11 vector std

我有一个double toDouble(const Foo& foo)和一些函数std::transform,我希望在向量中的所有Foo上运行toDouble函数后找到最小的double值。

使用for循环解决这个问题很容易,但出于好奇,有没有一种方法可以使用标准库算法来做到这一点?

一个想法是使用vector<Foo>vector<double>转换为std::min_element,然后使用android:focusable="true" android:focusableInTouchMode="true" 查找最小的double值,但这需要填写新的临时矢量......有更直接的解决方案吗?

2 个答案:

答案 0 :(得分:6)

您可以滥用std::accumulate

vector<Foo> v = ...;

double min = std::accumulate(std::begin(v), std::end(v),
                             std::numeric_limits<double>::max(),
                             [](double so_far, Foo const& next) {
                                 return std::min(so_far, toDouble(next));
                             });

或者,如果您知道numeric_limits非空,则不使用v

double min = std::accumulate(std::next(std::begin(v)), std::end(v),
                             toDouble(v[0]),
                             [](double so_far, Foo const& next) {
                                 return std::min(so_far, toDouble(next));
                             });

答案 1 :(得分:1)

你可以使用一个min版本,它带有一个比较器并在这个比较器中调用toDouble。