再问迭代器++返回this指针

乐哉悠哉 2011-11-18 02:48:18
http://topic.csdn.net/u/20111118/09/a94e8024-0c37-47d6-a738-6e6743b07c56.html?2261
好吧,涎着脸再问,简化,例如一个list的迭代器iterator这样定义自增运算符:
  
template <class T>
class list<T>::iterator{
public:
list<T>::iterator &operator++() {
pn=pn->next;
return *this;
}
private:
Node<T> *pn; //指向当前节点的指针
};

那么当我使用这个迭代器遍历list时,例如:

list nlist;//假设已经初始化
list<int>::iterator iter;
iter=nlist.begin();
while(iter != nlist.end()) {
cout<<*iter<<endl;
iter++;
}

每次iter++,iter的成员变量pn发生了变化,即指向list的下一个node,但是 iter 的this指针却一直是它本身吧?一直指向list的begin(),这样的话,iter != nlist.end()是否一直不能得到满足,从而不能跳出循环呢?

对比数组的话,例如:

int a[6]={1, 2, 3, 4, 5};
int *pa=a;//视pa为数组的迭代器
while( pa!=&(a[5]) ) {
cout<<*pa<<endl;
pa++;
}

在这个过程中,pa本身每次都发生了变化,所以最后当 pa == &(a[5])就跳出了循环。

但是迭代器那个是怎样使iter == nlist.end()得到实现的呢?
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

迭代器的比较是看内部结点指针是否一致。。。operator++ this指针当然不变了。
[/Quote]
晕菜,懂一楼的意思了……之前我瞎了……迭代器的!=运算符也重载了的,所以比较迭代器,不是比较他们所指的地址,而是按它定义的比较方法比较的~
bool operator!=(const iterator<T>& x) const { return node != x.node; }
而iter本身的地址是一直不变的,rerurn *this每次返回的也确实是同一个iterator(当然,iterator内部的pn指针发生了变化,除此之外,无其它变化~)

谢谢dizuo,祝你幸福,呵呵
闲的每日C 2011-11-18
  • 打赏
  • 举报
回复

struct node
{
int value;
node *next;
};

int main()
{
node nodes[5];
for (int i=0;i<5;++i)
{
nodes[i].value = i;
if (i == 4)
{
nodes[i].next = 0;
}
else
{
nodes[i].next = nodes + i + 1;
}
}
for (node* iter=nodes;iter != 0;iter=iter->next)
{
cout<<iter->value<<endl;
}
return 0;
}

以上是个链表,最后一个节点next为0,for (node* iter=nodes;iter != 0;iter=iter->next)循环就可以结束。list和这个类似,具体实现,就要分析它的源码了。
ryfdizuo 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guankle 的回复:]

引用 1 楼 dizuo 的回复:

迭代器的比较是看内部结点指针是否一致。。。operator++ this指针当然不变了。

那使用迭代器遍历链表,最后跳出循环的循环条件 iter == nlist.end() 是怎么实现的?
[/Quote]
把list搞成双向循环列表,可以加一个头结点,head
begin()返回的是head->next
end()返回的是head。
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
你还是没懂 iter本身的值和iter++这个表达式的值。

iterator operator++(int){
iterator tmp(*this);
++this;
return tmp;
}
这个是后自增的的大概的实现思路。你看看后自增返回的值和*this对象的区别吧。
你的那个实现是前自增的实现。
闲的每日C 2011-11-18
  • 打赏
  • 举报
回复
《Effective C++》第7章 第47条
讲STL中几种iterator实现代码,并使用traits进行区别。
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

迭代器的比较是看内部结点指针是否一致。。。operator++ this指针当然不变了。
[/Quote]
那使用迭代器遍历链表,最后跳出循环的循环条件 iter == nlist.end() 是怎么实现的?
闲的每日C 2011-11-18
  • 打赏
  • 举报
回复
list.end()应该是0或空这样的东西。链表的结束通常是这样的。list实际也是链表。

另外,list::iterator和vector::iterator不一样。vector::iterator是random access iterator,list::iterator是bidirectional iterator。参考:《Effective C++》
bdmh 2011-11-18
  • 打赏
  • 举报
回复
关于迭代,可以看看 c++ primer讲的很详细
ryfdizuo 2011-11-18
  • 打赏
  • 举报
回复
迭代器的比较是看内部结点指针是否一致。。。operator++ this指针当然不变了。

64,648

社区成员

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

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