【问题标题】:transform vector<Foo> to a vector<double> and find the minimum将 vector<Foo> 转换为 vector<double> 并找到最小值
【发布时间】:2015-08-20 04:57:40
【问题描述】:

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

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

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

【问题讨论】:

  • 这需要很快吗?如果没有,不要担心临时向量,这是一个完全合理的解决方案。
  • 这个问题是出于好奇而不是实用性而提出的......这不是性能关键代码本身,所以同意,临时向量不是什么大问题......我只是想知道是否有标准提供的更好的解决方案......(我可能只是使用 for 循环。)

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


【解决方案1】:

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

【讨论】:

  • 我不认为这是滥用;完全正常使用左折叠。
  • 这就是我正在寻找的例子。谢谢!
  • 有没有办法计算最小值所在的索引?
【解决方案2】:

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

【讨论】:

  • 问题在于结果是一个 Foo 迭代器。我必须将该 Foo 转换回双精度才能得到我的最终答案。 (完全有效,只是寻找更直接的东西)。
猜你喜欢
  • 2022-01-24
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2014-10-11
相关资源
最近更新 更多