У меня естькарты с структурой как ключ возвращает неверное значение
struct data_cell{
int owner;
std::vector<int> shares;
};
data_cell** data; //grid, very big
std::map<data_cell, data_cell*> cells; //all uniq cells
bool operator==(const data_cell &b, const data_cell &o) {
return (b.owner == o.owner && b.shares == o.shares);
}
bool operator<(const data_cell &b, const data_cell &o) {
return (b.owner < o.owner && b.shares != o.shares);
}
int to_grid(float, float);
иногда, когда я делаю:
for (int i=0;i<ids.size();i++){//example
data_cell o=ids[i];
//some work where fills o.shares
data[to_grid(x,y)]=(cells[o]?:cells[o]=(new data_cell(o)));
printf("%d |%d|%d|%d %d\n", s.id, o.owner, cells[o]->owner, data[to_grid(x,y)]->owner, to_grid(x,y));
}
Я получил, что o.owner = клетка [O] -> владелец, (Printf показывает разные значения), и если я печатаю ячейки [o] перед назначением, он возвращает ненулевой указатель, но этот ключ не существует на карте.
Я использую gcc-4.6.
что не так с этим кодом?
Add1: Изменения в
bool operator<(const data_cell &b, const data_cell &o) {
return (b.owner < o.owner && b.shares < o.shares);
}
не помогает, но
bool operator<(const data_cell &b, const data_cell &o) {
return (b.owner < o.owner && b.shares <= o.shares);
}
add2: Последняя версия, которая работает (я надеюсь):
bool operator<(const data_cell &b, const data_cell &o) {
return (b.owner < o.owner && b.shares <= o.shares) ||
(b.owner <= o.owner && b.shares < o.shares);
}
мая быть некоторыми дополнениями?
Я бы сказал, что только одно из трех выражений должно быть истинным в любое время. –
@ mike.dld Да, это более жесткое условие должно быть выполнено. Я исправил. – Bathsheba
Мне нужно установить оператор <как a.owner