工程中需要将自定义结构作为map的key,于是在自定义结构中重载了默认升序运算符“<”,错误代码如下,问题出在代码中标注的那一行,当第二次向map中插入值时,map内部自动按升序排序,到注释那行崩溃。
原因:升序排列,默认严格模式strict weak ordering,元素相等时必须返回false。
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
struct MyStruct
{
int a;
int b;
bool operator<(const MyStruct& right) const {
if (a < right.a)
{
return true;
}
else if (a == right.a)
{
if (b <= right.b) //正确写法:if (b < right.b)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
};
int main() {
map<MyStruct, string> myMap;
MyStruct myStruct1{11,22};
MyStruct myStruct2{ 22,33 };
myMap.insert(pair<MyStruct, string>(myStruct1, "left"));
myMap.insert(pair<MyStruct, string>(myStruct2, "right"));
for (auto i = myMap.begin(); i != myMap.end(); i++)
{
cout << i->first.a << endl;
}
}