读书人

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

发布时间: 2014-06-05 16:21:19 作者: rapoo

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()返回那个值。

读书人网 >C++

热点推荐