如何遍历C++向量映射(map of vectors)中的向量?
嘿,我来帮你搞定这个嵌套遍历的问题~你的代码里内层循环的写法确实有不少问题,我先给你拆解下问题所在,再给你两种常用的正确实现方式。
先说说你原代码的问题
- 内层循环没有声明专属的迭代器变量:你直接把
it->second.nodeRefList.begin()放在for循环的初始化位,这不符合语法规范,我们需要先定义一个迭代器来遍历vector。 - 错误地试图让vector容器自增:
it->second.nodeRefList++这种写法完全不对,只有迭代器对象可以执行自增操作,容器本身不能这么用。 - 终止条件逻辑错误:
it->second.nodeRefList != it->second.nodeRefList.rbegin()-1混淆了正向迭代器和反向迭代器的用法,反向迭代器的rbegin()对应的是容器最后一个元素,和正向迭代器的end()不能直接这么混用判断。
正确的遍历方式
方式一:使用普通迭代器(兼容C++98及以上)
这种方式是最基础的迭代器遍历写法,适合所有C++版本:
WayMap::iterator mapIt; // 外层遍历map的每个键值对 for (mapIt = MyWayMap.begin(); mapIt != MyWayMap.end(); ++mapIt) { // 先取出当前map元素对应的vector,用引用避免拷贝,提升效率 const auto& nodeRefList = mapIt->second.nodeRefList; // 定义vector的专属迭代器,遍历vector for (auto vecIt = nodeRefList.begin(); vecIt != nodeRefList.end(); ++vecIt) { // 访问vector中的元素,*vecIt就是当前元素 // 比如打印元素或者做其他操作: // std::cout << *vecIt << std::endl; } }
方式二:使用范围for循环(C++11及以上推荐)
如果你的编译器支持C++11或更高版本,范围for循环会让代码更简洁易读:
// 外层遍历map的每个键值对,用&引用避免拷贝map的元素 for (auto& mapPair : MyWayMap) { // 取出对应的vector,同样用引用 auto& nodeRefList = mapPair.second.nodeRefList; // 内层遍历vector的每个元素 for (auto& node : nodeRefList) { // 直接使用node即可,这里如果不需要修改元素,可以写成const auto& node // do_something(node); } }
额外小提示
- 如果不需要修改容器里的元素,尽量使用
const迭代器或者const&引用,这样不仅能避免不必要的拷贝,还能保证元素不会被意外修改,让代码更安全。 auto关键字可以帮你省去写冗长的迭代器类型名(比如std::vector<int>::iterator),让代码更简洁。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

