为何std::set迭代器减1的写法(1)失效但(2)和(3)可正常运行
问题解答
核心原因是不同容器的迭代器类型支持的操作存在差异,具体分析如下:
- C++标准库将迭代器分为多个类别,不同类别提供的操作能力不同:
- 随机访问迭代器:支持直接加减整数、大小比较等算术操作,
std::string、std::vector、原生数组的迭代器都属于这一类别 - 双向迭代器:仅支持逐位前后移动的
++、--操作,不支持直接加减整数的运算,std::set、std::map、std::list的迭代器都属于这一类别
- 随机访问迭代器:支持直接加减整数、大小比较等算术操作,
写法(1) *(st.end()-1) 无法正常工作的原因
std::set的迭代器是双向迭代器,标准没有为其定义接收整数参数的减法运算符operator-,该写法属于语法错误,在编译阶段就会直接报错。
写法(2) *--st.end() 可以正常运行的原因
双向迭代器原生支持前置自减运算符operator--,而std::set的迭代器是类类型,即使st.end()返回的是临时右值,也可以合法调用成员函数实现的operator--,将迭代器前移一位指向容器的最后一个有效元素,解引用后即可拿到对应的值。
注意:如果
std::set为空容器,该操作属于未定义行为,会引发访问越界等崩溃问题。
写法(3) std::string(str.begin()+1, str.end()-1) 可以正常运行的原因
std::string的迭代器是随机访问迭代器,原生支持加减整数的算术操作,所以str.end()-1是完全合法的语法,可以直接得到指向最后一个有效字符的迭代器。
内容的提问来源于stack exchange,提问作者roditu
相关产品推荐
相关产品推荐

