Здравствуйте 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;