struct Room
{
int room;
int x,y;
int dist;
Room(){}Room(int _room,int xx,int yy,int _dist)
{
x = xx;
y = yy;
room = _room;
dist = _dist;
}
bool operator < (const Room& tempRoom)const
{
return dist < tempRoom.dist;
}
};
int main()
{
set<Room>que;
que.insert(Room(0,0,0,1));
que.insert(Room(0,0,0,1));
que.insert(Room(1,2,0,1));
que.insert(Room(0,2,0,1));
for(auto itr = que.begin(); itr != que.end();itr++)
cout<<itr->room<<","<<itr->x<<","<<itr->y<<","<<itr->dist<<endl;
return 0;
}
它显示输出 0,0,0,1。但应该是
0,0,0,1
1,2,0,1
0,2,0,1
我知道这与运算符重载有关。我尝试重载 == 运算符。但是在搜索之后我发现 set 仅使用 < 运算符进行任何比较。如何修改 < 运算符重载函数以实现上述输出?谢谢。
最佳答案
您只通过dist
进行比较,因此具有相同dist
的2 个对象将相等。通过比较使对象不同的所有事物来修复该问题。
像这样:
bool operator < (const Room& lhs, const Room& rhs)
{
return
std::tie(lhs.dist, lhs.room, lhs.x, lhs.y) <
std::tie(rhs.dist, rhs.room, rhs.x, rhs.y);
}
顺便说一句,我为比较运算符使用了一个非成员函数。
关于c++ - 无法将数据插入 std::set。作为重复丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641342/