unordered_map 没有迭代所有键
unordered_map not iterating all keys
我有以下代码来遍历 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
注意不是遍历keyc
.
更新:
更改 DFS 函数以使地图 const 如下所示也无济于事:
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
这是因为您正在更改正在迭代的地图。这样做时必须小心,因为如果在 emplace 所有迭代器都无效期间发生重新散列。
您最初的尝试是修改地图,为 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);
}
}
我有以下代码来遍历 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
注意不是遍历keyc
.
更新: 更改 DFS 函数以使地图 const 如下所示也无济于事:
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
这是因为您正在更改正在迭代的地图。这样做时必须小心,因为如果在 emplace 所有迭代器都无效期间发生重新散列。
您最初的尝试是修改地图,为 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);
}
}