计算最小值的最时髦的方法是什么?

时间:2015-12-08 13:14:37

标签: c++ boost c++14 min

我想使用自定义比较器计算一组值中的最小值。目前,我的代码看起来大致如下:

SomeStructure best;
for  (int i = 0; i < 100; ++i)
{
    SomeStructure cur = getValue(i);
    if (isLess(cur, best))
    {
        best = cur;
    }
}

我发现这种方式不太明确。例如,如果我使用标准比较器,我可以写得更漂亮:

accumulator_set<SomeStructure, stats<tag::min>> min;
for (int i = 0; i < 100; ++i))
{
  min(getValue(i));
}
extract::min(min);

所以,问题是:我怎么能写第二个例子,但是使用自定义比较器呢? 我的项目使用C++14boost,因此解决方案可以使用其功能 C++17很有意思,虽然不是很有用。

更新:看起来我在这个问题上不是很精确。

  • getValue是一个复杂的函数,根据索引计算某个值,而不仅仅是从容器中检索它。
  • 我可以将所有数据存储在容器中,然后只使用std::min_element,但我确定没有这样的显式方法。

2 个答案:

答案 0 :(得分:3)

如果您想比较std::min中包含的两个元素或一组元素,以及自定义比较器,则可以使用initializer_list。 有关详细信息,请参阅here。还有一堆例子 否则,您可以使用std::min_element作为范围。 Here文档。

修改

据我所知,你的问题/评论中,你没有一个可以迭代的容器,而是想要比较一组不相关的值。
它遵循一个例子,即文档中略有减少的例子:

std::min( { "foo", "bar", "hello" },
    [](const std::string& s1, const std::string& s2) {
        return s1.size() < s2.size();
    });

使用变量代替并动态创建初始化列表,不再需要容器。

编辑2

关于问题的更新,它遵循一个可能的解决方案 迭代整个集合时,您可以一次比较两个元素。例如,将第一个元素放在一个名为min的变量中,然后为每个后续元素将min与当前正在详细说明的元素进行比较,如果前者大于后者,则更新{ {1}}变量。
当迭代结束时,您可以使用您要查找的元素正确设置min。在这种情况下,带有自定义比较器的min似乎是最佳解决方案。

答案 1 :(得分:1)

只需使用std::min之类的内容(假设您已定义operator<):

SomeStructure best;
for  (int i = 0; i < 100; ++i)
    best = std::min(best, getValue(i));