Во-первых: если вы в первую очередь делаете поиск подобным образом, эта структура данных определенно не самая эффективная альтернатива.
Я не вижу другого способа, кроме как сделать три вложенных цикла for, поскольку карта размечена для поиска по ключу, а не по значению. Это будет выглядеть примерно так:
std::map<std::string, std::map<std::string, std::map<std::string, CGridItem*> > >:iterator it1;
CGridItem* obj = ...;
for(it1 = mymap.begin(); it != mymap.end(); ++it1)
{
std::map<std::string, std::map<std::string, CGridItem*> > it2;
for(it2 = it1->second.begin(); it2 != it->second.end(); ++it2)
{
std::map<std::string, CGridItem*> it3;
for(it3 = it2->second.begin(); it3 != it2->second.end(); ++it3)
{
if(it3->second == obj) {
/*found it!*/
/* your 3 strings are in it1->first, it2->first, it3->first */
}
}
}
}
РЕДАКТИРОВАТЬ: Я предлагаю следующую структуру данных:
std::map<CGridItem*, std::tuple<std::string, std::string, std::string> > mymap;
Это сопоставляет ваш CGridItem
объект с 3 строками. Примечание: std::tuple
может быть недоступен, если вы не используете c ++ 11, но он доступен в boost библиотеки .