Re: Параметр-ключ в map в виде структуры/класса
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 01.03.02 17:11
Оценка:
Здравствуйте eklmn, Вы писали:

E>Сначала о предмете вопроса. Есть вот такая программа:


E>

E>#pragma warning(disable: 4786)

E>#include <iostream>
E>#include <map>
E>#include <algorithm>
E>#include <string>
E>#include <utility>

E>using namespace std;


E>class CKey {
E>public:
E>   bool operator<(const CKey& right) const {
E>       if (f1<right.f1 && f2<right.f2)
E>          return true;
E>       else
E>          return false;
E>   }
E>   bool operator==(const CKey &right) const {
E>       if (f1==right.f1 && f2==right.f2)
E>          return true;
E>       else
E>          return false;  
E>   }
E>   /*CKey& operator=(const CKey& right) {
E>        f1=right.f1;
E>        f2=right.f2;
E>        return *this;
E>   }*/
E>   CKey(){}
E>   CKey(int a, int b) : f1(a), f2(b) {}
E>public:
E>   int f1;
E>   int f2;
E>};

E>class CCompare {
E>   bool operator() (CKey& t1,CKey t2) {
E>       if (t1==t2)
E>           return true;
E>       else
E>           return false;
E>   }
E>};

E>typedef multimap<CKey, int> tagData;
E>tagData data;

E>void main()
E>{
E>     for(int i=1; i<=10; i++)
E>        data.insert(make_pair(CKey(i,i), i));
E>     
E>     tagData::iterator it;
E>     
E>     for(it=data.begin(); it!=data.end(); ++it)
E>        cout << it->first.f1 << "." << it->first.f2 << endl;
E>     
E>     CKey k(-6,6);
E>     it=data.find(k);                                //(1)
E>     //it=find(data.begin(), data.end(), k);         //(2)

E>     if (it==data.end())
E>         cout << "Not find" << endl;
E>     else
E>         cout << "Find" << endl;
E>      
E>}

E>


E>В таком виде она выдает, что ключ найден. Почему?

E>Если CKey(6,-6), то ключ также найден, а если CKey(-6,-6), то не найден.
Для операции меньше должны выполняться все условия, как для математической операции меньше (транзитивность, коммутативность и т.д.)
В частности (если a != b), то (a <b) == !(b < a)
А у тебя:
(1, 0) < (0, 1) — true
(0, 1) < (1, 0) — true

Поменяй лучше операцию меньше на следующее
if (f1<right.f1)
  return true;
if (right.f1 < f1)
  return false;
if (f2 < right.f2)
  return true;
if (right.f2 < f2)
  return false;
return true;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.