Ric*_*ard 1 c++ set comparator
我有一个2D整数坐标列表(坐标对).我想阅读这些内容,然后确定是否已读取某个点.
整数数据可以落在整数数据类型提供的范围内的任何地方,但实际数据点的数量将很小.因此,使用2D阵列跟踪已读取的点是不切实际的.A 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;
}
Run Code Online (Sandbox Code Playgroud)
但是知道一些事情是错的,因为我已经插入了一些后来告诉我它不知道的集合.上述输出应该都是正确的,但是,如下所示.
1
1
0 <-?????
1
Run Code Online (Sandbox Code Playgroud)
我怀疑比较器是一个问题,但我不知道如何解决它.
有什么想法吗?
这种比较确实是错误的.它不满足所需的语义.尝试这样的事情:
bool operator< (const grid_cell& a) const { return x<a.x || (x==a.x && y<a.y); }
Run Code Online (Sandbox Code Playgroud)
这是一篇关于这个主题的好文章:
http://www.drdobbs.com/cpp/a-strategy-for-defining-order-relations/240147625