首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

list中iterator的 end( )的实现,该如何解决

2014-06-05 
list中iterator的 end( )的实现iterator是怎么判断链表结尾的?当用iterator对list进行 逆序 遍历的时候,li

list中iterator的 end( )的实现
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()到底是怎么实现的?

[解决办法]
引用:
Quote: 引用:

list的end指向内存最后一个元素的下一个问题

那内存的最后一个元素的下一个是什么呢?   
!= 操作符的实现肯定是比较链表节点的地址时候是否相等,这样的话内存有效节点之后应该还有节点。


嗯,STL源码剖析上讲list实际上是一个“带头节点”的“双向循环”的“环状”链表(实际上这样是为了实现的方便和空间的节省,想想看,如果不是环状的双向循环链表,则需要在头尾都有一个指针才能实现push_back和push_front,)end()迭代器实际上指向的就是这个头结点
[解决办法]
完全可以设一个特殊的iterator值,让end()返回那个值。

热点排行