c++ - 计算最小值的最流行的方法是什么?

标签 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,但我确信有任何显式方法无需执行此操作。

最佳答案

如果您想要比较 initializer_list 中包含的两个元素或一组元素,以及自定义比较器,可以使用 std::min
请参阅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 与当前正在阐述的元素进行比较,如果前者大于后者更新了 min 变量。
当迭代结束时,您可以使用您要查找的元素正确设置 min 。在这种情况下,带有自定义比较器的 std::min 似乎是最好的解决方案。

关于c++ - 计算最小值的最流行的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156862/

相关文章:

c++ - 有没有解决 nullptr_t 和指针重载之间歧义的好方法?

c++ - 识别给定函数中的不同变量

c++ - Doxygen - 如何显示所有使用类的地方?

c++ - 使用 Boost.Log(或 Boost.Thread)时 dllinit.cpp 行 703 中的 MFC 断言

c++ - 访问 boost::tuple 的成员

c++ - 获取一个新元组,其中包含元组中除第一个元素以外的所有元素

c++14 unique_ptr 并使 unique_ptr 错误使用已删除函数 'std::unique-ptr'

c++ - 从 Linux 中 TCP 套接字上接收到的数据包中获取 TOS 字段?

c++ - 避免预定义数字常量与 C++ 中的枚举冲突

c++ - 点的坐标迭代器