C++ 带有非典型比较器的std::map的奇怪行为 让我们考虑下面的代码片段: class A { public: int x; int y; A(int ix, int iy) : x(ix), y(iy) {} bool operator < (const A& a) const { return (x < a.x) || (y < a.y); } }; int main() { std::map<A,int> amap; amap[A(0,1)] = 4; amap[A(1,0)] = 5; for(auto &x: amap) std::cout<<x.second<<std::endl; std::cout<<amap[A(0,1)]<<std::endl; std::cout<<amap[A(1,0)]<<std::endl; } A类 { 公众: int x; int-y; A(intix,intiy):x(ix),y(iy){ 布尔运算符

C++ 带有非典型比较器的std::map的奇怪行为 让我们考虑下面的代码片段: class A { public: int x; int y; A(int ix, int iy) : x(ix), y(iy) {} bool operator < (const A& a) const { return (x < a.x) || (y < a.y); } }; int main() { std::map<A,int> amap; amap[A(0,1)] = 4; amap[A(1,0)] = 5; for(auto &x: amap) std::cout<<x.second<<std::endl; std::cout<<amap[A(0,1)]<<std::endl; std::cout<<amap[A(1,0)]<<std::endl; } A类 { 公众: int x; int-y; A(intix,intiy):x(ix),y(iy){ 布尔运算符,c++,stl,stdmap,C++,Stl,Stdmap,然后a

然后
a
。正如您所看到的,您的排序不是不对称的,也不是像
a
那样不灵活的。 所有这些都是严格弱排序的要求,每个
map
都需要排序。没有它,您的结果可能很快变得不可预测

然后
a
。正如您所看到的,您的排序不是不对称的,也不是像
a
那样不灵活的。
所有这些都是严格弱排序的要求,每个
map
都需要排序。没有它,结果很快就会变得不可预测。

对于插入到map中的所有元素,如果
a为真,则
b
必须为假。比较运算符不会这样做


map
使用树结构,并使用比较运算符导航树。如果比较运算符生成不一致的结果,则导航将丢失。

对于插入地图的所有元素,如果
A
为真,则
b
必须为假。比较运算符不为不要这样做


map
使用树结构,通过比较运算符导航树。如果比较运算符生成不一致的结果,则导航将丢失。

您的比较运算符没有实现严格的弱排序。这是一项要求,因此您的地图被破坏。@juanchopanza,我理解,但是。。。为什么会出现这种行为?
std::map
的内部结构需要这样做。它是一个二元搜索树。@gorill-使用Visual Studio,您会收到使用调试库的断言,因此不会看到任何“行为”。VS的诀窍是调用比较器两次,一次调用参数“a,b”,然后是带“b,a”的比较器。如果两者都返回
true
,则会显示断言。您的比较运算符没有实现严格的弱排序。这是一个要求,因此您的映射被破坏。@juanchopanza,我理解,但是…为什么会出现这种行为?
std::map
需要将此作为其内部结构。它是一个二进制搜索树。@gorill-使用Vis如果使用ual Studio,您会收到使用调试库的断言,因此不会看到“行为”。VS会两次调用比较器,一次调用参数“a,b”,然后调用参数为“b,a”的比较器。如果您同时返回
true
,则会显示断言。
A a(0, 1), b(1, 0);