свой ключ в map
От: Carc Россия https://vk.com/gosha_mazov
Дата: 20.10.04 22:59
Оценка:
коллеги хелп ми!!!
увяз совсем
мне нужен 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

т.е. дубликаты он все равно не убрал, хотя при вставке он их находил
что я не так делаю? хелп ми! у меня по моему что называется уже глаз замылился
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.