菜鸟关于迭代器的困惑

zhenxueli 2010-05-12 02:35:54
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end();++iter)
cout<<*iter<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter)
*iter=0;
cout << *iter<< endl;
return 0;
}


为啥*iter=0;后,输出的*iter是-33686019,好奇怪的一个值
...全文
114 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenxueli 2010-05-13
  • 打赏
  • 举报
回复
谢谢各位,总算有点懂了,总结了一下

错误版本一
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end();++iter)
cout<<*iter<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter)
*iter=0;
cout << *iter<< endl;
return 0;
}


为啥*iter=0;后,输出的*iter是-33686019,好奇怪的一个值

错误原因:虽然所有元素都被赋予0值,但是for执行完后,iter就指向了ivec1的最后一个元素的后面,cout << *iter<< endl;的时候,就变成随机数据


错误版本二
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)
*iter=0;
cout << *iter<< endl;
return 0;
}

可为啥结果是20,而不是
*iter=0;重置后的0呢

错误原因:前ivec1.end()-1个元素都被赋予了0值,但是最后一个仍是20,输出的是最后一个值,当然是20




#include<vector>
#include<iostream>

using namespace std;
int main()
{
vector<int> ivec1(10,20);
vector<int>::iterator iter; //注意变量的作用域
cout<<"容器元素为: "<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
cout << *iter<< endl;
}
//for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)

for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
*iter=0;
}
cout<<"清零后, 容器元素为: "<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
cout << *iter<< endl;
}
return 0;
}


总结:1。要搞清for循环的机制,即循环条件不满足,不运行循环体内的语句,
但同时需注意迭代器iter是指向++iter后的元素(即使iter=ivec1)

huanmie_09 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhenxueli 的回复:]
谢谢各位CSDN上这么热心的大哥,我刚看C++不久,所以问题比较幼稚
我重新调了一下,这样是不是就没问题了?
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begi……
[/Quote]

#include<vector>
#include<iostream>

using namespace std;
int main()
{
vector<int> ivec1(10,20);
vector<int>::iterator iter; //注意变量的作用域
cout<<"容器元素为: "<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
cout << *iter<< endl;
}
//for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)

for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
*iter=0;
}
cout<<"清零后, 容器元素为: "<<endl;
for(iter=ivec1.begin();iter!=ivec1.end();++iter) {
cout << *iter<< endl;
}
return 0;
}
zhenxueli 2010-05-13
  • 打赏
  • 举报
回复
谢谢各位CSDN上这么热心的大哥,我刚看C++不久,所以问题比较幼稚
我重新调了一下,这样是不是就没问题了?
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)
*iter=0;
cout << *(iter-1)<< endl;
return 0;
}



非常感谢
CJackRose 2010-05-13
  • 打赏
  • 举报
回复
for(vector<int>::iterator iter=ivec1.begin();iter<=ivec1.end()-1;++iter)
sixbusy 2010-05-13
  • 打赏
  • 举报
回复
因为end 是个空地址!
就和数组一样
int a【8】 , 第 8 个是 a【7】;
其实 容器的空间是[ begin , end ) ,不包括end的!
MANMAO 2010-05-13
  • 打赏
  • 举报
回复
看来楼主没弄清楚for循环啊。
你的第二次修改:
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)
*iter=0;
你设置的退出条件是见ivec1.end() - 1,就是当到最后一个元素,就退出for循环而且不执行循环体*iter = 0了,最后一个元素就没被赋值为0了。
而退出for循环后的iter的值是ivec1.end() - 1,cout << *iter<< endl; 当然是没被修改过的20了。
同理你的第一个程序的iter退出for循环时的值是ivec.end(),指向的值是未定义行为,问题更大。
简单的东西我罗嗦了这么多,呵呵。
pengzhixi 2010-05-12
  • 打赏
  • 举报
回复
cout << *iter<< endl;//在你修改后的这个ite已经指向了ivec1.end()-1;这个元素,而这个元素你没有设置为0,还是20
zhenxueli 2010-05-12
  • 打赏
  • 举报
回复
自己顶
zhenxueli 2010-05-12
  • 打赏
  • 举报
回复
谢谢各位兄弟
小弟照各位指导的修改如下

#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> ivec1(10,20);
for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end()-1;++iter)
*iter=0;
cout << *iter<< endl;
return 0;
}

可为啥结果是20,而不是
*iter=0;重置后的0呢

huanmie_09 2010-05-12
  • 打赏
  • 举报
回复
1楼正解,3楼很详细.
Kyle__Shaw 2010-05-12
  • 打赏
  • 举报
回复
输出的是ivec1.end(),但是这个ivec1.end()并没有定义
bitxinhai 2010-05-12
  • 打赏
  • 举报
回复
for(iter=ivec1.begin();iter!=ivec1.end();++iter)
*iter=0;

for执行完后,iter就指向了ivec1的最后一个元素的后面,
cout << *iter<< endl;的时候,当然是随机的数据了
wINDowsKiller 2010-05-12
  • 打赏
  • 举报
回复
iter == ivec1.end();//结果未定义,兄弟
pengzhixi 2010-05-12
  • 打赏
  • 举报
回复
对end()返回的迭代器进行解引用行为未定义。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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