我想使用自定义比较器计算一组值中的最小值。目前,我的代码看起来大致如下:
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++14
和boost
,因此解决方案可以使用其功能
C++17
很有意思,虽然不是很有用。
更新:看起来我在这个问题上不是很精确。
getValue
是一个复杂的函数,根据索引计算某个值,而不仅仅是从容器中检索它。std::min_element
,但我确定没有这样的显式方法。答案 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));