使用指针嵌套std :: map

时间:2013-03-12 14:09:21

标签: c++ stl stdmap

我在地图中使用地图,想要访问第二张地图中的特定成员。

std::map<int, std::map<DWORD,IDLL::CClass*>*> MyMap

4 个答案:

答案 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";