list中iterator的 end( )的实现

x332363930 2013-12-23 10:04:41
iterator是怎么判断链表结尾的?

当用iterator对list进行 逆序 遍历的时候,list插入值的方式不同,list.end()的值方式不同,我想知道end()是怎么实现的?

逆序遍历如下:(ps:我知道it = l.end()越界了)
	list<int>::iterator it;
for (it = l.end(); it != l.begin(); --it)
{
cout << *it << "\t";
}


当插入值的代码是:
	for (int i = 0; i < 10; i++) {
l.push_back(i);
}

时,输出是10 9 8 7 6 5 4 3 2 1 也就是在链表末尾多插入了10

当是一个一个插入值的时候如: l.push_back(30); l.push_back(28); l.push_back(20); 输出的值是30 20 28 也就是将将首个元素作为末尾值了。 那end()到底是怎么实现的?
...全文
422 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleeplacker 2013-12-23
  • 打赏
  • 举报
回复
list是双向链表嘛,所以是个环,存在end()这个节点,只不过它不存放数据
bedynamic 2013-12-23
  • 打赏
  • 举报
回复
引用 3 楼 uuuououlcz 的回复:
[quote=引用 2 楼 x332363930 的回复:] [quote=引用 1 楼 wb117908406 的回复:] list的end指向内存最后一个元素的下一个问题
那内存的最后一个元素的下一个是什么呢? != 操作符的实现肯定是比较链表节点的地址时候是否相等,这样的话内存有效节点之后应该还有节点。[/quote] 嗯,STL源码剖析上讲list实际上是一个“带头节点”的“双向循环”的“环状”链表(实际上这样是为了实现的方便和空间的节省,想想看,如果不是环状的双向循环链表,则需要在头尾都有一个指针才能实现push_back和push_front,)end()迭代器实际上指向的就是这个头结点[/quote]+1
jiandingzhe 2013-12-23
  • 打赏
  • 举报
回复
完全可以设一个特殊的iterator值,让end()返回那个值。
还有多远 2013-12-23
  • 打赏
  • 举报
回复
引用 2 楼 x332363930 的回复:
[quote=引用 1 楼 wb117908406 的回复:] list的end指向内存最后一个元素的下一个问题
那内存的最后一个元素的下一个是什么呢? != 操作符的实现肯定是比较链表节点的地址时候是否相等,这样的话内存有效节点之后应该还有节点。[/quote] 嗯,STL源码剖析上讲list实际上是一个“带头节点”的“双向循环”的“环状”链表(实际上这样是为了实现的方便和空间的节省,想想看,如果不是环状的双向循环链表,则需要在头尾都有一个指针才能实现push_back和push_front,)end()迭代器实际上指向的就是这个头结点
x332363930 2013-12-23
  • 打赏
  • 举报
回复
引用 1 楼 wb117908406 的回复:
list的end指向内存最后一个元素的下一个问题
那内存的最后一个元素的下一个是什么呢? != 操作符的实现肯定是比较链表节点的地址时候是否相等,这样的话内存有效节点之后应该还有节点。
wb_rock 2013-12-23
  • 打赏
  • 举报
回复
list的end指向内存最后一个元素的下一个问题

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧