将向量<Foo> 转换为向量<double> 并找到最小值
transform vector<Foo> to a vector<double> and find the minimum
我有一个 vector<Foo>
和一些函数 double toDouble(const Foo& foo)
,我想在 运行 向量中所有 Foos 的 toDouble 函数之后找到最小双精度值。
使用 for 循环很容易解决这个问题,但出于好奇,是否有使用标准库算法的巧妙方法来解决这个问题?
一个想法是使用 std::transform
将 vector<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 的最小版本。
我有一个 vector<Foo>
和一些函数 double toDouble(const Foo& foo)
,我想在 运行 向量中所有 Foos 的 toDouble 函数之后找到最小双精度值。
使用 for 循环很容易解决这个问题,但出于好奇,是否有使用标准库算法的巧妙方法来解决这个问题?
一个想法是使用 std::transform
将 vector<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 的最小版本。