2016-08-18 2 views
0

У меня естькарты с структурой как ключ возвращает неверное значение

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); 
} 

мая быть некоторыми дополнениями?

ответ

3

== Ваши и < операторы должны быть такими, что именно один из a < b, a == b и b < a является true, а два других false. Это не так из-за b.shares != o.shares в вашей реализации operator<.

+0

Я бы сказал, что только одно из трех выражений должно быть истинным в любое время. –

+0

@ mike.dld Да, это более жесткое условие должно быть выполнено. Я исправил. – Bathsheba

+0

Мне нужно установить оператор <как a.owner

Смежные вопросы