空列表迭代器比较始终为真?测试结果存疑求助
为什么对空std::list的迭代器执行递增/递减操作后,比较结果仍全为true?
问题描述
我用以下代码测试空std::list的迭代器行为:
#include <iostream> #include <list> int main(){ std::list<int> l; bool a, b, c; std::list<int>::iterator i = l.begin(); a = i == --l.end(); b = ++i == l.end(); c = ++i == l.end(); std::cout << a << std::endl; std::cout << b << std::endl; std::cout << c << std::endl; }
运行结果是三个1(即三个布尔值都为真),但我明明对迭代器执行了递增和递减操作,为什么结果还是全部为真?
技术解答
核心原因在于你触发了C++标准中的未定义行为(Undefined Behavior),而你看到的全true只是你的编译器实现下的一种巧合表现,不能认为这是必然结果。
我们一步步拆解你的代码逻辑:
- 对于空的
std::list,l.begin()和l.end()返回的是同一个迭代器——也就是尾后迭代器(指向容器最后一个元素的下一个位置,空容器中这个位置和起始位置重合)。 - 你对尾后迭代器执行了
--和++操作:--l.end():空容器的尾后迭代器没有前一个有效元素,对它执行递减操作是未定义行为。你的编译器实现中,这个操作后迭代器仍然等于原尾后迭代器,所以i == --l.end()为true。++i:尾后迭代器已经指向容器的末尾,对它执行递增操作同样是未定义行为。你的编译器里,这个操作没有改变迭代器的状态,所以++i == l.end()依然为true,第二次递增也是同理。
未定义行为的本质是C++标准没有规定这种情况下程序的行为,不同编译器、不同优化级别可能会给出完全不同的结果——比如崩溃、输出其他值,甚至程序行为诡异。
正确的做法
永远不要对以下迭代器执行递增/递减操作:
- 空容器的
begin()/end()迭代器(本质都是尾后迭代器) - 非空容器的
end()尾后迭代器 - 非空容器的
begin()迭代器(执行递减操作)
在操作迭代器前,一定要确保它指向的是容器中的有效元素。
内容的提问来源于stack exchange,提问作者polcompany
相关产品推荐
相关产品推荐

