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

use*_*709 0 c++ vector std c++11

我有一个vector<Foo>和一些函数double toDouble(const Foo& foo),我想在向量中的所有Foos上运行toDouble函数后找到最小的double值.

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

一个想法是用来std::transform转换vector<Foo>为a vector<double> 然后std::min_element用来找到最小的double值,但这需要填充一个新的临时向量...是否有更直接的解决方案?

Bar*_*rry 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));
                             });
Run Code Online (Sandbox Code Playgroud)

或者甚至,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));
                             });
Run Code Online (Sandbox Code Playgroud)