list的迭代器的++自增运算的疑惑

乐哉悠哉 2011-11-18 09:48:53

template <class T> class dNode;

template <class T>
class dlist{
private:
int size;
//other things
public:
class iterator;//nested class
//other things
};

template <class T>
class dlist<T>::iterator{
public:
iterator();
dlist<T>::iterator &operator++() {
//检查正确性
pn=pn->next;
return *this;//这里有问题~
}
private:
dNode<T> *pn; //指向当前节点的指针
};

迭代器的前缀自增运算符应当怎样写呢?
按照我上面的写法,如果是对的,return *this应该当怎样理解呢?我理解的是,比如我定义了一个dlist<int>::iterator iter迭代器,编译器会为它分配一个内存地址,即时它this指针指向的地方。那么我循环使用iter++时,例如:

for(iter=mylist.begin(); iter!=mylist.end(); iter++){
cout<<*iter<<endl;
cout<<*this<<endl;
}

在这个过程中,iter的成员pn当然是每次移动指向下一个节点,但是这个迭代器的this却是一直没变的吧?那么return *this这个语句是否就失去意义了?因为我们实际上需要返回的当前自增之前的那个节点的地址,而不是最开始的节点的地址。

疑惑~求解~多谢~
...全文
609 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pengzhixi 的回复:]

引用 7 楼 guankle 的回复:
引用 3 楼 pengzhixi 的回复:

this没变怎么说return *this;就失去意义呢?this没变不意味着this对象里面的东西没变啊。就像你说的this里面的指针指向了下一个节点了。这不就是意义所在么

我说的失去意义,指的是比如和 i++ 对比的时候,每次运算结束后虽然i返回的是自增前的值,但是在循环中它总是会变化着的,但是……
[/Quote]
这样的话,iter是不是永远都不会等于end()了?那就无法退出循环了吧?
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guankle 的回复:]
引用 3 楼 pengzhixi 的回复:

this没变怎么说return *this;就失去意义呢?this没变不意味着this对象里面的东西没变啊。就像你说的this里面的指针指向了下一个节点了。这不就是意义所在么

我说的失去意义,指的是比如和 i++ 对比的时候,每次运算结束后虽然i返回的是自增前的值,但是在循环中它总是会变化着的,但是iter的话,每次返回的都是同一个地址,对吗……
[/Quote]
不会的,如果是后自增的话 就意味着会返回一个拷贝的对象而非 原来的this对象了。只是说拷贝的对象里面的值和自增前的this对象相同。
qq120848369 2011-11-18
  • 打赏
  • 举报
回复
dlist<T>::iterator operator++(int) 
{
dlist<T>::iterator ret=*this;
pn=pn->next;
return ret;
}

后缀,retIter=iter++.
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jietoulangren 的回复:]

楼主参考More Effective C++ 中的Item M6
dlist<T>::iterator &operator++() {
//检查正确性
pn=pn->next;
return *this;//这里有问题~
}
这样实现是不对的
[/Quote]
看了,还真没看出来应该怎么实现……
JieTouLangRen 2011-11-18
  • 打赏
  • 举报
回复
楼主参考More Effective C++ 中的Item M6
dlist<T>::iterator &operator++() {
//检查正确性
pn=pn->next;
return *this;//这里有问题~
}
这样实现是不对的
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]

this没变怎么说return *this;就失去意义呢?this没变不意味着this对象里面的东西没变啊。就像你说的this里面的指针指向了下一个节点了。这不就是意义所在么
[/Quote]
我说的失去意义,指的是比如和 i++ 对比的时候,每次运算结束后虽然i返回的是自增前的值,但是在循环中它总是会变化着的,但是iter的话,每次返回的都是同一个地址,对吗?
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnuqinhuan 的回复:]

return *this;返回自身对象的引用
dlist<T>::iterator &operator++(int = 0)
前缀就是这样的
可以参考C++重载的前置自增自减的相关介绍
[/Quote]
额,我写错了……我定义的是后缀运算~不过我想了解的是它内部代码的意义~能帮我讲一下吗?

template <class T> class dNode;
template <class T>
class dlist{
private:
int size;
//other things
public:
class iterator;//nested class
//other things
};

template <class T>
class dlist<T>::iterator{
public:
iterator();
dlist<T>::iterator &operator++() {
//检查正确性
pn=pn->next;
return *this;//这里有问题~
}
private:
dNode<T> *pn; //指向当前节点的指针
};

迭代器的后缀自增运算应当怎样实现呢?
按照我上面的写法,如果是对的,return *this应该当怎样理解呢?我理解的是,比如我定义了一个dlist<int>::iterator iter迭代器,编译器会为它分配一个内存地址,即时它this指针指向的地方。那么我循环使用iter++时,例如:

for(iter=mylist.begin(); iter!=mylist.end(); iter++){
cout<<*iter<<endl;
}

在这个过程中,iter的成员pn当然是每次移动指向下一个节点,但是这个迭代器的this却是一直没变的吧?那么return *this这个语句是否就失去意义了?因为我们实际上需要返回的当前自增之前的那个节点的地址,而不是最开始的节点的地址。
小楫轻舟 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lightboat09 的回复:]

this指针是类里面才有的!
[/Quote]
抱歉,我看错了...
無_1024 2011-11-18
  • 打赏
  • 举报
回复
this是class类的自身对象的一个人指针
*this就是一个引用
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
this没变怎么说return *this;就失去意义呢?this没变不意味着this对象里面的东西没变啊。就像你说的this里面的指针指向了下一个节点了。这不就是意义所在么
小楫轻舟 2011-11-18
  • 打赏
  • 举报
回复
this指针是类里面才有的!
無_1024 2011-11-18
  • 打赏
  • 举报
回复
return *this;返回自身对象的引用
dlist<T>::iterator &operator++(int = 0)
前缀就是这样的
可以参考C++重载的前置自增自减的相关介绍
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 qq551780977 的回复:]

C/C++ code

#include <iostream>
using namespace std;



int main()
{

char str[] = "hello world!";
char *end = str+sizeof(str);
char *iterator = str;
while(*iterator != *end )
……
[/Quote]

不是的吧?循环结束的那个判断条件不是比较迭代器所指内容的吧?
比如泛型算法find(),可以用来在数组中查找元素,例如

int a[6]={1, 1, 1, 2, 2};
find(a, &a[5], 2);

按你理解的,还没查找就跳出了吧?
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
你还是没懂 iter本身的值和iter++这个表达式的值。

iterator operator++(int){
iterator tmp(*this);
++this;
return tmp;
}
这个是后自增的的大概的实现思路。你看看后自增返回的值和*this对象的区别吧。
QQ551780977 2011-11-18
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;



int main()
{

char str[] = "hello world!";
char *end = str+sizeof(str);
char *iterator = str;
while(*iterator != *end )
{
cout<<*iterator;
++iterator;
}
return 0;
}

应该可以这么理解iterator....
STL没怎么看可能理解有误...
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pengzhixi 的回复:]

你有没有用到iter++这个表达式的值怎么可能出现你说的情况。iter本身的值和iter++这个表达式的值是两码事
[/Quote]
while(iter != nlist.end();) {
cout<<*iter<<endl;
iter++;
}
用到了啊,在while循环中,iter每次都有自增啊?我就是不确定它最后iter != nlist.end()能否出现使循环截止。
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
你有没有用到iter++这个表达式的值怎么可能出现你说的情况。iter本身的值和iter++这个表达式的值是两码事
乐哉悠哉 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pengzhixi 的回复:]

for 里面的iter++虽然这个表达式返回的是iter的一个副本,但是iter本身已经指向了下一个节点了。我不知道你是怎么理解的。
[/Quote]

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(),这样的话,它是否一直不能等于end(),因此不能跳出循环呢?

iter本身(指的是它的this指针吗?)怎么指向了下一个节点的?iter的pn是指向下一个节点我知道的~
pengzhixi 2011-11-18
  • 打赏
  • 举报
回复
for 里面的iter++虽然这个表达式返回的是iter的一个副本,但是iter本身已经指向了下一个节点了。我不知道你是怎么理解的。

64,646

社区成员

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

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