Итерация по двумерному std :: unordered_map

c++ unordered-map

413 просмотра

2 ответа

Я определил 2d карту следующим образом:

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) {

        }
    }

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

Автор: blueman Источник Размещён: 08.11.2019 11:06

Ответы (2)


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получить внутренний ключ.

Автор: Alexandre C. Размещён: 20.08.2016 09:21

1 плюс

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

Автор: Some programmer dude Размещён: 20.08.2016 09:25
Вопросы из категории :
32x32