为什么 std::set 的构造函数要比较相同的元素两次?
Why constructor of std::set compares the same elements two times?
让我们考虑以下示例:
#include <iostream>
#include <set>
struct Obj {
int x;
int operator<=> (const Obj& obj) const {
std::cout << __FUNCTION__ << " " << *this << " " << obj << std::endl;
return x - obj.x;
}
friend std::ostream& operator<< (std::ostream& os, const Obj& obj);
};
std::ostream& operator<< (std::ostream& os, const Obj& obj) {
return os << "{ x: " << obj.x << " }";
}
int main() {
std::set<Obj> st2{{1}, {2}};
return 0;
}
它将产生两行:
operator<=> { x: 1 } { x: 2 }
operator<=> { x: 2 } { x: 1 }
此时我想知道为什么要进行两次比较。
更新:g++-10
版本:10.2.0
它可能会测试它们是否相等。如果您查看 std::set
的模板参数,您会发现它只需要提供一个 less
函数。那么,鉴于我们只有 <
,我们如何测试两个元素是否相等?比较两次。如果 !less(a, b) && !less(b, a)
,则 a == b
。
让我们考虑以下示例:
#include <iostream>
#include <set>
struct Obj {
int x;
int operator<=> (const Obj& obj) const {
std::cout << __FUNCTION__ << " " << *this << " " << obj << std::endl;
return x - obj.x;
}
friend std::ostream& operator<< (std::ostream& os, const Obj& obj);
};
std::ostream& operator<< (std::ostream& os, const Obj& obj) {
return os << "{ x: " << obj.x << " }";
}
int main() {
std::set<Obj> st2{{1}, {2}};
return 0;
}
它将产生两行:
operator<=> { x: 1 } { x: 2 }
operator<=> { x: 2 } { x: 1 }
此时我想知道为什么要进行两次比较。
更新:g++-10
版本:10.2.0
它可能会测试它们是否相等。如果您查看 std::set
的模板参数,您会发现它只需要提供一个 less
函数。那么,鉴于我们只有 <
,我们如何测试两个元素是否相等?比较两次。如果 !less(a, b) && !less(b, a)
,则 a == b
。