c++ - 无法将数据插入 std::set。作为重复丢弃

标签 c++ set std

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/

相关文章:

c++ - 声明会影响 std 命名空间吗?

c++ - 访问 map 元素

c++ - 由于 if constexpr 导致内联模板化函数具有不同的行为是否违反 ODR?

c++ - 使用备忘录的背包问题中的标题

c++ - 复合条件表达式中的排序

c++ - 为什么我不能访问我的成员变量?

python-3.x - 如果我在带括号的列表中有重复项,我该怎么办

php - 在 laravel redis 中设置 ZADD 命令的选项

javascript - 尝试这个例子后,对 Javascript 中的 Maps 和 Set 的基础知识感到困惑

c++ - 从字符串中获取行(不是从字符串流中获取)