C++遍历std::map迭代器报operator<无匹配错误修复
问题背景
定义元素类型为std::map<int, float>的vector容器:
std::vector<std::map<int, float>> datad;
需求为两层遍历:先遍历vector中的每个map元素,再遍历每个map内部存储的键值对,初始编写的两层迭代器循环代码如下:
for (std::vector<std::map<int, float>>::iterator currentMap = datad.begin(); currentMap < datad.end(); ++currentMap) { for (std::map<int, float>::iterator it = currentMap->begin(); it < currentMap->end(); ++it) {/*some code here*/} }
使用g++编译时,第二层循环抛出如下错误:
no match for ‘operator<’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const int, float> >’ and ‘std::map<int, float>::iterator’ {aka ‘std::_Rb_tree_iterator<std::pair<const int, float> >’})
报错提示中两个操作数的实际类型看起来完全一致,尝试过static_cast强制转换迭代器类型、使用auto自动推导迭代器类型,均无法解决问题,要求在保留迭代器遍历写法的前提下,给出最简单的修复方案。
错误原因
std::map的底层实现是红黑树,其迭代器属于双向迭代器,仅支持递增、递减、相等/不等比较,不支持随机访问,因此没有实现<比较运算符。
第一层循环用<比较能正常工作,是因为std::vector的迭代器是随机访问迭代器,原生支持<比较;第二层map迭代器本身就没有重载operator<,和类型转换、自动推导没有关系,所以之前的尝试都无法解决问题。
修复方案
将循环中判断迭代器是否到达末尾的比较运算符,从<统一替换为!=即可。!=是所有类别迭代器都支持的比较操作,也是迭代器遍历的通用标准写法。
修复后的可正常编译代码:
for (std::vector<std::map<int, float>>::iterator currentMap = datad.begin(); currentMap != datad.end(); ++currentMap) { for (std::map<int, float>::iterator it = currentMap->begin(); it != currentMap->end(); ++it) {/*some code here*/} }
额外提示:即便是vector这类支持随机访问的容器,迭代器遍历时也推荐统一用!=判断终止条件,写法通用性更强,后续更换容器类型时不容易触发同类错误。
内容的提问来源于stack exchange,提问作者MPEI_stud
相关产品推荐
相关产品推荐

