2016-08-20 4 views
-4

次のように私は、2Dマップを定義している::: unordered_map

道路は単純である
unordered_map< string, unordered_map<string, Road*>* > matrix; 

class Road { 
public: 
    Road() : connected(0), weight(0) {} 

    bool connected; 
    int weight; 
}; 

私はマップを通じてこのように反復処理しようとしましたコンパイルに失敗しました。

for (auto &i : matrix) { 
     for (unordered_map< string, unordered_map<string, Road*>* >::iterator iter1 = i.second->begin(); 
      iter1 != i.second->end(); iter1++) { 

     } 
    } 

私は私の行列はいつものN×Nである知っているので、私が行うことができます一つのことは

for (auto &i : matrix) { 
     for (auto &j : matrix) { 

     } 
    } 

ですが、サイズを変化させたクリーンなアプローチがある場合、私は思っていました。

+0

あなたの2番目の例は、あなたが思う通りのことをしません。 – tkausl

+3

"コンパイルに失敗しました"。この詳細で有用な問題ステートメントのおかげで... –

+0

'auto'型はイテレータではありません。 –

答えて

1

マップと順序付けられていないマップを反復すると、キーと値のペアが生成されます。あなたは

for (const auto& p : matrix) 
    ... 

変数pを行うとconst std::pair<std::string, std::unordered_map<std::string, Road*>*>&を入力しています。そのため、内部のマップを反復処理するために、実行します。あなたは、外側キーを取得するためにp.firstを使用することができ、かつq.firstは、内側のキーを取得するために

for (const auto& p : matrix) 
    for (const auto& q : *p.second) { 
     Road *r = q.second; 
     ... 
    } 

1

コンテナのサイズは関係ありません。 range-forループ(正しく使用する場合)は、ネストされたケースでも任意のサイズのコンテナに対して機能します。