vector迭代器iterator使用(容易出错的点)

1 篇文章 0 订阅
1 篇文章 0 订阅

总结几点vector使用心得。
1.使用vector迭代器对数组元素进行遍历访问
vector<int> v_int;
vector<int>::iterator iter;
for(iter = v_int.begin();iter!=v_int.end();iter++)
{
       cout<<*iter<<endl;  
}
上面的代码段是一段遍历vector很标准的代码,基本上不会出错,因为不涉及vector中的删除,插入等操作。
 
2.迭代器在vector调用erase,insert等函数后,会失效
 for(iter = v_int.begin();iter!=v_int.end();iter++)
 {
  v_int.insert(iter,4,3);
 }
上面的代码会报vector iterator not incrementable的错误。
 
3.end()函数在调用erase函数之后的变化。
 vector<int> v_int;
 for(int i = 0 ;i<5;i++)
 {
  v_int.push_back(i);
 }
执行完上述代码之后,v_int中的元素为 0,1,2,3,4 五个元素
vector::iterator iter = v_int.end();
这个时候iter指向4之后的一个未初始化的地址。
iter = v_int.begin();
iter= v_int.erase(iter);
这个时候v_int删除了第一个元素0,执行完这个函数之后,
iter=v_int.end();
则iter指向了4,也就是v_int的最后一个元素,这个时候,一些常用的遍历操作就容易出错了。
 
 
4.for循环执行顺序的问题
如下代码
 vector<int> v_int;
 for(int i = 0 ;i<3;i++)
 {
  v_int.push_back(i);
 }
 vector<int>::iterator iter;
 for(iter = v_int.begin();cout<<"B"<<endl,iter!=v_int.end();iter++,cout<<"A"<<endl)
 {

 }


输出结果为
B
A
B
A
B
A
B
也就是说,for循环中,一开始先判断第二个表达式是否成立,成立则进入循环体,执行完循环体之后,先执行表达式3,再进行表达式2的判断,这样的话,在vector的迭代器使用的时候,就很容易出现一个问题,一旦迭代器iter已经指向最后一个元素了,再进入下一个循环体的判断过程,就会先iter++,然后再判断iter!=v_int.end(),这个时候就会报vector iterator not incrementable或者vector iterator not dereferencable的错误,都是越界错误。例如如下代码:
 for(iter = v_int.begin();iter!=v_int.end();iter++)
 {
  iter = v_int.erase(iter);
  cout<<*iter<<endl;
 }
报错:vector iterator not dereferencable
如下代码:
 for(iter = v_int.begin();iter!=v_int.end();iter++)
 {
  iter = v_int.erase(iter);
 }
报错:vector iterator not incrementable,iter指向了v_int.end()时,再对其进行iter++操作报错。
 
 
以上情况都经代码运行实测

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值