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

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

本文关键字:lt gt 向量 最小值 Foo 转换 double      更新时间:2023-10-16

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

这是一个很容易解决的问题,使用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));
                             });

如果知道v不为空,甚至不使用numeric_limits:

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