【发布时间】:2016-12-02 15:21:30
【问题描述】:
我一直在学习 C++。我被这个问题困住了。
我有 set,其中包含一个自定义结构,该结构包含两个 long int 的 a 和 b。我有一个自定义比较器结构,它比较数字并在 a 或 b 不同时返回 true。
typedef long int li;
struct number {
number(li a1,li b1): a(a1), b(b1) {}
li a, b;
};
struct compare {
bool operator() (const number &lhs, const number& rhs) const{
return lhs.a != rhs.a || lhs.b != rhs.b;
}
};
int main() {
set<number, compare> nums;
nums.insert(number(1, 2));
nums.insert(number(1, 1));
nums.insert(number(2, 1));
nums.insert(number(1, 2));
for (auto &i : nums) {
cout << i.a << " " << i.b << endl;
}
return 0;
}
这里的输出是
1 2
2 1
1 1
1 2
它有两个1 2条目。任何澄清将不胜感激。
【问题讨论】:
-
compare不满足 the requirements of strict weak ordering,因此您的程序表现出未定义的行为。基本上,比较器应该类似于小于比较,而不是不相等。 -
如果你想使用不等式而不是小于,你可以考虑
std::unordered_set,它需要能够计算哈希并比较是否相等。 -
感谢您的评论。有人可以解释为什么我必须使用小于一个而不是不平等?我还是有点困惑。
-
@TheAbsurd 考虑 7 和 9。79 为假。为了您的比较,它们都是正确的。您不知道 std::set 如何在幕后处理排序和检测重复项,但许多排序算法使用“
-
@RyanP 这是有道理的。非常感谢。
标签: c++ struct set comparator stdset