如何正确初始化unordered_map迭代器使其指向另一迭代器的下一个元素?
如何在unordered_map的两层循环中正确初始化下一个迭代器?
哈哈,这个坑我踩过!你遇到的问题核心是unordered_map的迭代器是前向迭代器,不像vector的随机访问迭代器那样支持+1这种直接跳转操作——前向迭代器只能通过++操作一步步移动,没法直接跳过元素。
要解决这个问题,有两种简单的方法:
方法一:使用std::next()函数
std::next()是C++标准库提供的工具函数,可以直接获取迭代器的下一个位置(需要包含<iterator>头文件),代码写起来很简洁:
#include <unordered_map> #include <iterator> // 必须包含这个头文件才能用std::next #include <iostream> int main() { std::unordered_map<int, int> m; // 先给map填充一些测试数据 m[1] = 10; m[2] = 20; m[3] = 30; auto it1 = m.begin(); while (it1 != m.end()) { auto it2 = std::next(it1); // 直接获取it1的下一个迭代器 while (it2 != m.end()) { // 执行你的操作,比如打印键值对 std::cout << "it1: (" << it1->first << ", " << it1->second << "), "; std::cout << "it2: (" << it2->first << ", " << it2->second << ")\n"; ++it2; // 移动到下一个元素 } ++it1; // 外层循环移动迭代器 } return 0; }
方法二:手动复制迭代器后递增
如果你不想额外包含头文件,也可以先复制当前迭代器,再手动递增到下一个位置:
#include <unordered_map> #include <iostream> int main() { std::unordered_map<int, int> m; m[1] = 10; m[2] = 20; m[3] = 30; auto it1 = m.begin(); while (it1 != m.end()) { auto it2 = it1; // 先复制it1 ++it2; // 手动递增到下一个元素 while (it2 != m.end()) { // 执行你的操作 std::cout << "it1: (" << it1->first << ", " << it1->second << "), "; std::cout << "it2: (" << it2->first << ", " << it2->second << ")\n"; ++it2; } ++it1; } return 0; }
额外提醒
- 从C++11开始,用
auto声明迭代器可以省去冗长的std::unordered_map<int, int>::iterator写法,代码更清爽。 - 注意
unordered_map是无序容器,遍历的元素顺序是不确定的,如果需要有序遍历,建议换成std::map(基于红黑树实现,元素按键有序排列)。
内容的提问来源于stack exchange,提问作者user8386434
相关产品推荐
相关产品推荐

