C++中为何vector迭代器支持<比较而map迭代器不支持
问题现象
你测试使用的代码如下:
#include <iostream> #include<vector> #include<map> using namespace std; int main() { vector<int> v1{1,2,3,4,5}; auto it1 = v1.begin(); auto it2 = v1.end(); if(it1<it2){ cout<<"TRUE"<<endl; // Output: TRUE } map<int,int> m; m.insert(make_pair(1,2)); m.insert(make_pair(5,7)); auto it3 = m.begin(); auto it4 = m.end(); if(it3<it4){ cout<<"TRUE"<<endl; } /* error: no match for 'operator<' (operand types are 'std::_Rb_tree_iterator<std::pair<const int, int> >' and 'std::_Rb_tree_iterator<std::pair<const int, int> >') 18 | if(it3<it4){ | ~~~^~~~ */ }
代码中vector迭代器的it1<it2判断可以正常执行,map迭代器的it3<it4判断编译报错,核心原因和C++标准对迭代器的分类设计有关。
核心原因:迭代器类别差异
C++标准库按照支持的操作能力,将迭代器分为5个类别,不同类别的迭代器强制要求实现的操作集不同:
- 输入迭代器:仅支持单次向前读取遍历,要求实现
==、!=、前置/后置++、解引用*、->操作 - 输出迭代器:仅支持单次向前写入遍历,要求实现前置/后置
++、解引用*操作 - 前向迭代器:支持多次向前读写遍历,整合输入、输出迭代器的所有要求操作
- 双向迭代器:在前向迭代器基础上,额外要求支持前置/后置
--操作,可以双向遍历 - 随机访问迭代器:在双向迭代器基础上,额外要求支持迭代器加减整数、下标访问
[]、迭代器差值计算、以及<、>、<=、>=关系比较操作
两类容器的迭代器属性
vector是连续内存存储的顺序容器,它的迭代器本质是对原生指针的封装,属于随机访问迭代器,完全满足随机访问迭代器的所有操作要求,因此<比较可以正常执行,本质是比较两个迭代器指向的内存地址的先后顺序。map是基于红黑树实现的有序关联容器,它的节点在内存中不是连续存储的,迭代器只能沿着红黑树的节点指针前后移动,属于双向迭代器,标准没有要求双向迭代器实现<比较运算符,因此直接使用会触发编译错误。
替代方案
如果需要判断双向迭代器的位置前后关系,可以从起始迭代器开始遍历,确认是否能到达目标迭代器;日常开发中绝大多数场景下,判断双向迭代器是否合法使用it != container.end()即可满足需求。
内容的提问来源于stack exchange,提问作者SiIconic
相关产品推荐
相关产品推荐

