我有一个3D地图容器声明如下:
std::map<std::string, std::map<std::string, std::map<std::string, CGridItem*> > > m_3DGridItems;
假设我有一个CGridItem对象指针值,如何以有效的方式获取所有三个映射键字符串?谢谢!
答案 0 :(得分:2)
首先,你真的需要这么笨拙的容器吗?
拥有Key
结构会更容易:
struct Key {
std::string x;
std::string y;
std::string z;
};
然后在Key
上定义排序:
bool operator<(Key const& left, Key const& right) {
if (left.x < right.x) { return true; }
if (left.x > right.x) { return false; }
if (left.y < right.y) { return true; }
if (left.y > right.y) { return false; }
return left.z < right.z;
}
然后你可以有一个更容易操作的结构:
std::map<Key, GridItem*>
如果您需要同时映射两种方式,请查看Boost.Bimap,其中包含双向映射Key <-> GridItem*
(因此您不必自己同步两个结构)。
答案 1 :(得分:0)
您可以使用迭代器获取地图中的所有键/值。当值也是地图时,您可以以相同的方式获取键/值...
答案 2 :(得分:0)
第一件事:如果您主要进行这样的查找,那么这种数据结构绝对是不最佳表现形式。
除了制作三个嵌套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个字符串。注意:当您不使用c ++ 11时,std::tuple
可能无法使用,但boost libraries中提供了{{1}}。