unordered_map不迭代所有的键

问题描述 投票:-1回答:2

我有以下的代码来遍历在unordered_map所有的按键,而迭代我通过地图的一些其他功能。由于某些原因,迭代器无法遍历所有的键。我无法找出原因,以及如何解决这个问题。如果我通过地图的价值,而不是引用然后按预期工作,但我想通过引用传递到保存副本。

码:

void DFS(char curr, unordered_map<char, unordered_set<char>>& G) {
    cout << "Traversing: " << curr << endl;
    for(const char& ch: G[curr]) {
        DFS(ch, G);
    }
}

int main() {
    unordered_map<char, unordered_set<char>> G;

    G['c'].emplace('b');
    G['b'].emplace('a');

    for(auto it : G) {
        cout << "Starting with: " << it.first << endl;
        DFS(it.first, G);
    }
}

我得到的输出是:

Starting with: b
Traversing: b
Traversing: a

需要注意的是它不运行键c

UPDATE:更改DFS功能,使像下面的地图常量也没有帮助:

void DFS(const char curr, const unordered_map<char, unordered_set<char>>& G) {
    cout << "Traversing: " << curr << endl;
    for(auto ch: G.at(curr)) {
        DFS(ch, G);
    }
}

而且它抛出一个异常,以及:

terminate called after throwing an instance of 'std::out_of_range'
  what():  _Map_base::at
c++ unordered-map
2个回答
1
投票

您最初试图修改地图,添加了对a的条目。第二次尝试抛出异常未能找到a的条目。

这听起来像你想结束搜索时的值不是在地图上。

void DFS(const char curr, const unordered_map<char, unordered_set<char>>& G) {
    cout << "Traversing: " << curr << endl;
    auto it = G.find(curr);
    if (it != G.end()) {
        for(auto ch: it->second) {
            DFS(ch, G);
        }
    }
}

或者,您可以初始化在地图中的a条目,任何这三个选项就可以了(虽然非const版本是最安全的,在当你无法找到已未定义行为)

int main() {
    std::unordered_map<char, std::unordered_set<char>> G;

    G['c'].emplace('b');
    G['b'].emplace('a');
    G['a'];

    for(auto it : G) {
        cout << "Starting with: " << it.first << endl;
        DFS(it.first, G);
    }
}

4
投票

这是因为你改变你遍历地图。你这样做的时候,作为一个如果emplace所有迭代器失效期间发生重散列是注意事项。

© www.soinside.com 2019 - 2024. All rights reserved.