【发布时间】:2014-10-13 20:37:56
【问题描述】:
让我们考虑以下代码 sn-p:
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;
}
输出为5 4 4 0
- 我预计只会插入第一个元素
A(0,1),但添加了两个元素。为什么? - 已找到第一个元素
A(0,1),但第二次搜索元素A(1,0)未找到。为什么?
有人可以在std::map 中详细解释这种情况下发生的情况吗?
【问题讨论】:
-
您的比较运算符没有实现严格的弱排序。这是一个要求,所以你的地图坏了。
-
@ juanchopanza,我明白了,但是……为什么会有这种行为?
-
std::map的内部结构需要这个。它是一个二叉搜索树。 -
@gorill - 使用 Visual Studio,您会收到使用调试库的断言,因此不会看到“行为”。 VS 使用两次调用比较器的技巧,一次使用参数“a,b”,然后使用“b,a”进行比较器。如果您同时返回
true,则会显示断言。