为了账号安全,请及时绑定邮箱和手机立即绑定

iterator使用while循环

我用while循环迭代,产生了错误,这是为什么。

    list<int>::iterator iter = ls.begin();
    for(; iter != ls.end(); iter++) {
        cout << *iter << endl;
    }
//    while (iter++ != ls.end()) {
//        cout << *iter << endl;
//    }

在这边while循环和for唯一的区别也就是iter多++了一次,这有什么关系吗?

为什么iter多++了一次就会产生错误?

正在回答

2 回答

不不不,你没理解我的意思

假设现在list里有三个元素

以你的代码为例

list<int>::iterator iter = ls.begin();  //这时iter指向第一个元素,假设此时iter == 0x000001

开始第一次循环:

while (iter++ != ls.end()) {  //因为有三个元素,假设一个内存单元存一个元素,那么ls.end() == 0x000004,
                                然后先拿iter与ls.end()比较,明显不相等,此时判断结果为真,判断完后,
                                iter自加1,也就是说,在执行输出之前,iter就指向下一个元素了,
                                此时iter == 0x000002
       cout << *iter << endl;  //第一次循环输出的是iter == 0x000002的元素,也就是list中的第二个元素
    }

第二次循环:

while (iter++ != ls.end()) {  //第一次循环结束后,iter == 0x000002, 此时显然iter != ls.end(),
                                判断为真,循环可以进行,判断完后,立即iter自加1,
                                此时iter ==  0x000003,指向了list的最后一个元素
       cout << *iter << endl;  //第二次循环输出的是iter == 0x000003的元素,也就是list中的最后一个元素
    }

第三次循环:

while (iter++ != ls.end()) {  //第二次循环结束后,iter == 0x000003, 此时显然iter != ls.end(),
                                判断为真,循环可以进行,判断完后,立即iter自加1,
                                此时iter ==  0x000004,指向了不存在的元素
       cout << *iter << endl;  //第三次循环想输出iter == 0x000004的元素,但此元素不存在,
                                 所以系统显示出错
    }


你要理解后置++的运算过程,是先使用iter的值进行是否与ls.end()相等的判断,再自加,在自加之前,第三次循环的条件是成立的,也就是会在iter自加1之后执行循环体,因此,就会导致最后一次循环出现的错误
你写的代码,等于是第一个元素没有输出,最后一次循环,想要输出一个不存在的元素,故系统报错

1 回复 有任何疑惑可以回复我~
#1

慕姐3585284 提问者

谢谢。 确实是这里搞错了。
2016-09-30 回复 有任何疑惑可以回复我~

是可以用while的

产生错误的原因是因为你把iter++写在了条件判断处,等于说在判断完之后,iter就指向下一个元素,当iter指向末元素的时候,iter++ != ls.end()这一项是成立的,判断完之后,iter自加一,指向了末元素的下一个元素并进行输出,而此时iter所指向的元素是不存在的,此时就会报错

改正代码

list<int>::iterator iter = list1.begin();
    while (iter != list1.end()) {
        cout << *iter << endl;
        iter++;
    }

输出之后再进行自加

0 回复 有任何疑惑可以回复我~
#1

慕姐3585284 提问者

iter指向最后一个元素的时候,就退出了。 iter++之后虽然指向了一个不存在的元素,但是循环已经退出了,并没有执行输出。。。
2016-09-29 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之模板篇
  • 参与学习       91156    人
  • 解答问题       318    个

本C++教程力求即学即会,所有知识以实践方式讲解到操作层面

进入课程

iterator使用while循环

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信