std::list是一个循环列表!!等等,什么
std::list is a cyclic list!! wait, what?
我正在编写一个测试程序,发现了一个非常有趣的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.end()
无法访问mylist.begin()
。
请注意,当您调用未定义的行为时,std::list
很可能看起来是循环的,因为当行为未定义时,"std::list appeared to be cyclic"符合允许的行为范围。这个范围是,任何行为。
即使它在这个实现中是循环的,您也不必依赖它,因为这个属性不受标准的保证。此外,开始指针的递减是未定义的行为以及std::distance
调用。
事实上,可以通过以下方式实现该列表,从而获得可观察到的结果:
list
head --> listelem1 (or elEnd)
begin() return head;
end() return head->prev;
listelem1 listelem2 listelem3 elEnd
ptr = d1 ptr = d2 ptr = d3 ptr = nullptr
next = le2 next = le3 next = elEnd next = le1
prev = elEnd prev = le1 prev = le2 prev = le3
但这取决于库的实现者,只要他遵循标准的接口和行为要求。
相关文章:
- 通过for循环使用用户输入填充列表
- 下面是我为检测链接列表中的循环而制作的代码
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 在C++中循环访问自定义结构列表的小问题
- 如何找到循环列表的开头?
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- 更改循环C++中的列表值
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 标准::列表是循环的吗?
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- 循环 typedef 列表
- 如何在C++中创建 2d 数组,其中一部分包含循环计数器,另一部分包含数字列表?
- 如何在C++中循环浏览自定义列表
- 如何重置列表循环
- 如何使用初始化列表循环修改元素
- 从二进制文件加载列表后,我的代码似乎进入了无限循环
- 在 stl 映射和列表 (c++) 上进行迭代的泛型循环
- 循环中列表的最后一个元素
- c++列表循环