У меня есть список двумерных целочисленных координат (координатные пары). Я хотел бы прочитать их, а затем определить, была ли прочитана точка.
Целочисленные данные могут находиться где угодно в пределах диапазона, предлагаемого целочисленным типом данных, но число фактических точек данных будет небольшим. Поэтому использование 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
Я подозреваю, что компаратор является проблемой, но я не уверен, как это исправить.
Какие-нибудь мысли?
Сравнение действительно неверно. Не соответствует требуемой семантике. Попробуйте что-то вроде этого:
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
Других решений пока нет …