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
请注意,它不会遍历键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);
}
}
相关文章:
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 再次获得 std::map 会更改之前的迭代器
- 如何从map<pair<string,int>,pair<string,Array>>中迭代和查找?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 使用 std::for_each 迭代和打印 std::map
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 为什么我不能在 c++ 中"map"的迭代器中使用"+1"?
- Map中的(字符串的)向量迭代器
- 访问基于范围的循环(如for_each)中的std::map迭代器
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- std::map 擦除 - 将迭代器传递给错误的映射
- C++ Map erase(),迭代器打印 erased 元素
- C 中MAP的反向迭代错过了第一个元素
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 如果迭代器的迭代器永远不会无效,则是STD :: MAP访问线程安全
- SIGBUS 尝试递增 std::map 迭代器时
- C 迭代器从Typedef std :: Map作为模板参数声明