c++ - 集合中的二维整数坐标吗?

标签 c++ set comparator

我有一个二维整数坐标列表(坐标对)。我想读入这些内容,然后确定是否已阅读某个点。

整数数据可能落在整数数据类型提供的范围内的任何位置,但实际数据点的数量会很少。因此,使用二维数组来跟踪哪些点已被读取是不切实际的。 set 似乎是执行此操作的好方法。

我当前实现此目的的代码如下:

#include <set>
#include <iostream>
using namespace std;

class grid_cell{
  public:
    int x,y;
    grid_cell(int x, int y) : x(x), y(y) {}
    grid_cell(){}
    bool operator< (const grid_cell& a) const { return y<a.y || x<a.x; }
};

int main(){
    set<grid_cell> bob;

    bob.insert(grid_cell(1,1));
    bob.insert(grid_cell(-1,1));
    bob.insert(grid_cell(1,-1));
    bob.insert(grid_cell(-1,-1));
    cout<<bob.count(grid_cell(1,1))<<endl;
    cout<<bob.count(grid_cell(-1,1))<<endl;
    cout<<bob.count(grid_cell(1,-1))<<endl;
    cout<<bob.count(grid_cell(-1,-1))<<endl;
}

但我知道有什么不对劲,因为我插入了单元格,后来集合告诉我它不知道。上面的输出应该都是真的,但是,相反,如下。

1
1
0 <-?????
1

我怀疑比较器有问题,但不确定如何解决。

有什么想法吗?

最佳答案

比较确实是错误的。它不满足所需的语义。尝试这样的事情:

bool operator< (const grid_cell& a) const { return x<a.x || (x==a.x && y<a.y); }

这是一篇关于这个主题的好文章:

http://www.drdobbs.com/cpp/a-strategy-for-defining-order-relations/240147625

关于c++ - 集合中的二维整数坐标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889984/

相关文章:

c++ - 如何向集合中插入一个新值并同时删除另一个值?

java - 按特定字符排序列表(Java 8)

java - 如何在 Java 中按字母顺序对枚举成员进行排序?

c++ - 如何修复链接器错误?

mysql - 在mysql中存储一组数字

c++ - 对于复合数据类型使用 glClearBufferData 是否可移植?

c++ - 在另一个 vector <string> 中定位子 vector <string>

java - 使用自己实现的链表时出错

c++ - 如何在 Visual Studio 中自动更改函数的参数序列

c++ - 多线程快速排序