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

transform vector<Foo> to a vector<double> and find the minimum

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

使用 for 循环很容易解决这个问题,但出于好奇,是否有使用标准库算法的巧妙方法来解决这个问题?

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

你可能会滥用 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));
                             });

您可以使用带有比较器并在此比较器中调用 toDouble 的最小版本。