我在地图中使用地图,想要访问第二张地图中的特定成员。
std::map<int, std::map<DWORD,IDLL::CClass*>*> MyMap
答案 0 :(得分:2)
尝试
auto outerIt = MyMap.find(someInt);
if(outerIt != MyMap.end()) {
auto innerIt = (*outerIt)->find(someDWord);
if(innerIt != (*outerIt)->end()) {
auto yourElement = *innerIt;
}
}
答案 1 :(得分:1)
如果您确定密钥存在,您也可以尝试:
IDLL::CClass* x = (*MyMap[key1])[key2];
答案 2 :(得分:1)
您可以分两步使用std::map::find
:首先找到与外部地图中的键相关联的值,然后重复内部地图。
以下可编译代码似乎适用于VS2010 SP1(VC10):
#include <iostream>
#include <map>
typedef unsigned int DWORD;
namespace IDLL
{
struct CClass
{
CClass() : n(0) {}
explicit CClass(int nn) : n(nn) {}
int n;
};
} // namespace IDLL
int main()
{
//
// Prepare maps for testing
//
std::map<int, std::map<DWORD,IDLL::CClass*>*> MyMap;
IDLL::CClass c1(10);
IDLL::CClass c2(20);
std::map<DWORD, IDLL::CClass*> m1;
m1[10] = &c1;
m1[20] = &c2;
MyMap[30] = &m1;
//
// Testing code for maps access
//
const int keyOuter = 30;
auto itOuter = MyMap.find(keyOuter);
if (itOuter != MyMap.end())
{
// Key present in outer map.
// Repeat find in inner map.
auto innerMapPtr = itOuter->second;
const DWORD keyInner = 20;
auto itInner = innerMapPtr->find(keyInner);
if (itInner != innerMapPtr->end())
{
IDLL::CClass * classPtr = itInner->second;
std::cout << classPtr->n << '\n';
}
}
}
答案 3 :(得分:0)
如果您不确定密钥是否存在:
std::map<DWORD,IDLL::CClass*>* inner = MyMap[key1];
IDLL::CClass* x = 0;
if(inner)
x = (*inner)[key2];
if(x)
std::cout << "Winner! " << *x << "\n";
else
std::cout << "Loser.\n";