C++ std::min_元素返回意外结果

C++ std::min_元素返回意外结果,c++,c++11,min,c++-standard-library,C++,C++11,Min,C++ Standard Library,我想找到向量的最小值: #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(),

我想找到向量的最小值:

#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';
}
我做错了什么?是否存在任何未定义的行为


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

< P>如果第一个参数小于第二个,而不是两个值中的较小,则比较器需要返回<代码>真< /代码>。所以return语句应该是

return i1 < i2;
返回i1
值得指出的是,您的功能不稳定。也就是说,如果两个元素相等,您可能希望得到第一个元素;您的代码将获得第二个。你可能想考虑<代码>!(i2@BoBTFish谢谢你的提示,但我不明白这怎么会使它不稳定。你能举个例子吗?在五月的情况下,因为我只想要这个值,我并不真正关心位置,只是以防万一。“稳定”是一个不好的词,因为它实际上指的是排序,因为稳定的排序将相等的元素保持在其原始顺序中。但是,假设您的容器有
{1,1,1}
。您的
最小元素
(一旦修复)返回一个迭代器到最后的<代码> 1 /代码>,当大多数人都会期望第一个。当希望把相近的值看作相等时,通常使用ε。不确定它是否有意义。这是一个真正的“不确定”。-我真的不知道你应该在这里做什么。建议提出一个更详细的新问题。当然,首先搜索,可能已经得到回答。ε-比较不提供严格的弱排序,因此不是标准算法的有效比较器。
return i1 < i2;