2D целочисленная координата в наборе?

У меня есть список двумерных целочисленных координат (координатные пары). Я хотел бы прочитать их, а затем определить, была ли прочитана точка.

Целочисленные данные могут находиться где угодно в пределах диапазона, предлагаемого целочисленным типом данных, но число фактических точек данных будет небольшим. Поэтому использование 2D-массива для отслеживания того, какие точки были прочитаны, нецелесообразно. 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

Я подозреваю, что компаратор является проблемой, но я не уверен, как это исправить.

Какие-нибудь мысли?

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

5

Другие решения

Других решений пока нет …