2

マップ内でマップを使用しており、2 番目のマップ内の特定のメンバーにアクセスしたいと考えています。

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

4 に答える 4

2

試す

auto outerIt = MyMap.find(someInt);
if(outerIt != MyMap.end()) {
  auto innerIt = (*outerIt)->find(someDWord);
  if(innerIt != (*outerIt)->end()) {
    auto yourElement = *innerIt;
  }
}
于 2013-03-12T14:13:10.673 に答える
1

2つのステップで使用でき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';
        }
    }
}
于 2013-03-12T17:06:11.753 に答える
1

キーが存在することが確実な場合は、次を試すこともできます。

IDLL::CClass* x = (*MyMap[key1])[key2];
于 2013-03-12T14:17:07.287 に答える
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";
于 2013-03-12T14:33:15.697 に答える