我在编写测试程序时发现了一个非常有趣的 std::list
行为案例。
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
std::list<int> mylist;
std::list<int>::iterator iter;
for(int i=3; i<10; ++i){
mylist.push_back(i);
}
iter = mylist.begin();
iter--;
iter--;
std::cout<<*iter<< std::endl;
std::cout<<std::distance(mylist.end(), mylist.begin())<<std::endl;
}
输出是:
9
1
如果我没记错的话,这个行为与循环列表有关。我从未见过论坛、书籍或讨论中提到标准列表是循环列表。我的 GCC 版本是 4.1.2。
那我是对的吗?标准 std::list
是循环列表吗?
最佳答案
不,std::list
不是循环的。当您递减该迭代器时,您的代码具有未定义的行为。当您调用 std::distance(mylist.end(), mylist.begin())
时,它也有未定义的行为,因为 mylist.begin()
无法通过递增 mylist.end()
。
请注意,当您调用未定义的行为时,std::list
很可能看起来是循环的,因为“std::list appearing to be cyclic”在允许的行为范围内行为未定义。该范围是任何行为。
关于c++ - std::list 是一个循环列表!!等等,什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932425/