计算最小值最时髦的方法是什么?
What is the most fashionable way of calculating minimum value?
我想使用自定义比较器计算一组值中的最小值。目前我的代码大致如下所示:
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
,但我确信有任何不这样做的显式方法。
如果要比较 initializer_list
中包含的两个元素或一组元素以及自定义比较器,可以使用 std::min
。
有关详细信息,请参阅 here。还有一堆例子。
否则,您可以使用 std::min_element
作为范围。 Here 文档。
编辑
据我从您的 question/comments 了解到,您没有可迭代的容器,而是想比较一组不相关的值。
它遵循一个示例,即文档中提供的示例略有减少:
std::min( { "foo", "bar", "hello" },
[](const std::string& s1, const std::string& s2) {
return s1.size() < s2.size();
});
改用您的变量并即时创建初始化列表,不再需要容器。
编辑 2
关于问题的更新,它遵循了一个可能的解决方案。
您可以在遍历整个集合时一次比较两个元素。例如,将第一个元素放在一个名为 min
的变量中,然后对于每个后续元素,将 min
与您正在详细说明的当前元素进行比较,如果前者大于后者,则更新 min
变量。
当迭代结束时,您已将 min
正确设置为您要查找的元素。在这种情况下,使用自定义比较器的 std::min
似乎是最佳解决方案。
只需使用 std::min
,类似于(假设您已定义 operator<
):
SomeStructure best;
for (int i = 0; i < 100; ++i)
best = std::min(best, getValue(i));
我想使用自定义比较器计算一组值中的最小值。目前我的代码大致如下所示:
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
,但我确信有任何不这样做的显式方法。
如果要比较 initializer_list
中包含的两个元素或一组元素以及自定义比较器,可以使用 std::min
。
有关详细信息,请参阅 here。还有一堆例子。
否则,您可以使用 std::min_element
作为范围。 Here 文档。
编辑
据我从您的 question/comments 了解到,您没有可迭代的容器,而是想比较一组不相关的值。
它遵循一个示例,即文档中提供的示例略有减少:
std::min( { "foo", "bar", "hello" },
[](const std::string& s1, const std::string& s2) {
return s1.size() < s2.size();
});
改用您的变量并即时创建初始化列表,不再需要容器。
编辑 2
关于问题的更新,它遵循了一个可能的解决方案。
您可以在遍历整个集合时一次比较两个元素。例如,将第一个元素放在一个名为 min
的变量中,然后对于每个后续元素,将 min
与您正在详细说明的当前元素进行比较,如果前者大于后者,则更新 min
变量。
当迭代结束时,您已将 min
正确设置为您要查找的元素。在这种情况下,使用自定义比较器的 std::min
似乎是最佳解决方案。
只需使用 std::min
,类似于(假设您已定义 operator<
):
SomeStructure best;
for (int i = 0; i < 100; ++i)
best = std::min(best, getValue(i));