коллеги хелп ми!!!
увяз совсем
мне нужен std::map со своим ключом, причем ключ это struct
struct KEY {
int id1;
int id2;
bool operator==(const KEY k) const {
if ((id1==k.id1) && (id2==k.id2)) return true;
if ((id2==k.id1) && (id1==k.id2)) return true;
return false;
}
};
т.е. на самом деле по смыслу этот ключ по просту отображает связб между обьектами id1 и id2
поскольку связь может быть одна и только одна то сравнение именно как написано , т.е. если в паре id1;id2; поменять местами — то это все равно одно и то же. Что собственно оператор сравнения и делает.
ну потом я обьявляю свой предикат
struct MyCmp:std::binary_function<KEY,KEY,bool> {
bool operator()(const KEY k1,const KEY k2) const {
if (k1==k2) return false;//т.е. если они равны я завсегда возвращаю ложь
ну а дальше просто сортировка в лексографическом порядке
}
};
короче потом я создаю мап типа так
typedef std::map<KEY,int,MyCmp> MYMAP;
MYMAP m;
в общем я передаю ему СВОЙ предикат который ключи с переставлеными местами id1 и id2 в KEY должен отсекать, т.е. считать их эквивалентными
и тут самом интересное
я заполняю мап значениями, кои таскаю из БД, мап радостно орет в окно вывода что он героически взял очередной дубликат за ж... в общем его нашел. Ну и все путем.
После чего я через printf выталкиваю все это в файл, и там вижу надпись
1,2, — мое_значение_1
2,1, — мое_значение_1
т.е. дубликаты он все равно не убрал, хотя при вставке он их находил
что я не так делаю? хелп ми! у меня по моему что называется уже глаз замылился