【发布时间】: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<i1)。 (虽然不是要求) -
@BoBTFish 感谢您的注意,但我不明白这如何使它不稳定。你能举个例子吗?在可能的情况下,因为我只想要值,所以我并不真正关心位置,但以防万一。
-
“稳定”是一个不好的词,因为它实际上是指排序,因为稳定的排序会保持相同元素的原始顺序。但是假设你的容器有
{1, 1, 1}。您的min_element(一旦修复)返回一个迭代器到 last1,而大多数人可能会期待第一个。 -
当想要将接近的值视为相等时,通常使用 epsilon。不确定订购是否有意义。那是真正的“不确定”-我真的不知道您应该在这里做什么。建议提出一个更详细的新问题。当然先搜索一下,可能已经有答案了。
-
epsilon-comparison 不提供严格的弱排序,因此不是标准算法的有效比较器。
标签: c++ c++11 min c++-standard-library