【问题标题】:std::min_element returning unexpected resultstd::min_element 返回意外结果
【发布时间】:2015-05-10 21:51:55
【问题描述】:

我想求一个向量的最小值:

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main () {
    vector<double> v{2, 0, 4};
    double minT = *std::min_element(v.begin(), v.end(),
                                    [](double i1, double i2) {
                                        std::cout << "Comparing: " << i1 << "  " << i2 << "   " << ((i1 < i2)? i1:i2) << "    " << '\n';
                                        return (i1 < i2)? i1:i2;
                                    });
    cout << "Minimum is: " << minT << '\n';
}

但是这段代码的输出是:

Comparing: 0  2   0    
Comparing: 4  2   2    
Minimum is: 4

我做错了什么?那里有任何未定义的行为吗?

注意:我知道我不需要 lambda 函数。删除它会返回预期结果 (0),但我的目标是拥有一个不考虑零的个性化 min 函数。

【问题讨论】:

  • 值得指出的是你的函数并不稳定。也就是说,如果两个元素相等,您可能希望获得第一个;您的代码将获得第二个。您可能需要考虑!(i2&lt;i1)。 (虽然不是要求)
  • @BoBTFish 感谢您的注意,但我不明白这如何使它不稳定。你能举个例子吗?在可能的情况下,因为我只想要值,所以我并不真正关心位置,但以防万一。
  • “稳定”是一个不好的词,因为它实际上是指排序,因为稳定的排序会保持相同元素的原始顺序。但是假设你的容器有{1, 1, 1}。您的 min_element(一旦修复)返回一个迭代器到 last 1,而大多数人可能会期待第一个。
  • 当想要将接近的值视为相等时,通常使用 epsilon。不确定订购是否有意义。那是真正的“不确定”-我真的不知道您应该在这里做什么。建议提出一个更详细的新问题。当然先搜索一下,可能已经有答案了。
  • epsilon-comparison 不提供严格的弱排序,因此不是标准算法的有效比较器。

标签: c++ c++11 min c++-standard-library


【解决方案1】:

如果第一个参数小于第二个参数,比较器需要返回true,而不是两个值中的较小者。所以返回语句应该只是

return i1 < i2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多