使用指针的嵌套std::map

nested std::map using pointers

本文关键字:std map 嵌套 指针      更新时间:2023-10-16

我正在使用map内部的map,并希望访问第二个map中的特定成员。

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

Try

auto outerIt = MyMap.find(someInt);
if(outerIt != MyMap.end()) {
  auto innerIt = (*outerIt)->find(someDWord);
  if(innerIt != (*outerIt)->end()) {
    auto yourElement = *innerIt;
  }
}

如果您确定密钥存在,您还可以尝试:

IDLL::CClass* x = (*MyMap[key1])[key2];

您可以分两步使用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';
        }
    }
}

如果您不确定键是否存在:

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