2016-08-20 3 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++) { 

     } 
    } 

Так как я знаю, что моя матрица всегда NxN, одна вещь, которую я могу сделать, это

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

     } 
    } 

Но мне было интересно, если есть более чистый подход с различными размерами.

+0

Ваш второй пример не делает то, что вы думаете. – tkausl

+3

«но это не удалось скомпилировать». Спасибо за это подробное и полезное заявление о проблеме ... –

+0

'auto' type не является итератором. –

ответ

1

Итерация по картам и неупорядоченным картам дает пары ключ/значение. Когда вы делаете

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

переменной p имеет тип const std::pair<std::string, std::unordered_map<std::string, Road*>*>&. Поэтому, чтобы перебрать внутреннюю карту, сделайте следующее:

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

Вы можете использовать p.first, чтобы получить внешний ключ, и q.first, чтобы получить внутренний ключ.

1

Размеры контейнеров не имеют значения. Циклы диапазона (при правильном использовании) будут работать для контейнеров любого размера даже в вашем вложенном корпусе.