unordered_map不会迭代所有键

unordered_map not iterating all keys

本文关键字:迭代 map unordered      更新时间:2023-10-16

我有以下代码来迭代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

更新:更改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

这是因为您正在更改要迭代的地图。 这样做时必须小心,因为如果在放置期间发生重新哈希,则所有迭代器都将失效。

您最初的尝试是修改地图,为 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);
    }
}