迭代器使用的注意点

博客以一段C++程序为例,分析了迭代器使用中的常见错误。如last可能不是有效迭代器引用,copy算法所需区间可能无效,修改内置类型临时变量不合法,容器操作可能使迭代器失效。总结了迭代器使用需注意有效性、生存期、有效范围和非法内置类型操作等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然迭代器比较好用但是确保迭代器的正确使用还是有点难度的。
看下面一段程序里面隐含了一些常见的错误
int main()
{
1   vector<Date> e;
2   copy(istream_iterator<Date>(cin),istream_iterator<Date>(),back_inserter(e));
3   vector<Date>::iterator first = find(e.begin(),e.end(),"01/01/05");
4   vector<Date>::iterator last = find(e.begin(), e.end(),"12/31/05");
5   *last ="12/30/05";
6   copy(first,last,ostream_iterator<Date>(cout,"/n"));
7   --e.end();
8   copy(first,last,ostream_iterator<Date>(cout,"/n"));
}

这个程序可以说是错误百出。
从5-8全部是错误的而且都是典型错误。
5的错误在于last不知道是不是一个有效的迭代器引用。因为如果找不到的话,那么last=e.end()这是一个不可一dereference的迭代器。
6的错误在于copy算法需要的区间[first,last)首先是一个有效的迭代器。因为vector内部的数据不是有序的。很有可能first反而在last后面,所以有可能[first,last)不是一个有效的区间。那么这copy函数当然就不对了。
7C++语言不允许修改内置类型的临时变量。正确的写法可以是e.end()-1,另外如果e是空的,那么任何试图获得e.end()位置之前的迭代器操作都是不正确的。
8、first,和last可能已经不再合法。这个的原因在于Vector的实现的时候如果超过了原来的容器的容量不是inplace增加的,而是重新开辟的,这个在STL源码分析里讲的很详细。所以如果正好超过了那么原来的迭代器的操作都是没有意义的。
总结:
1、有效性,iterator在derference的时候是不是有效的。
2、生存期,是不是对container的操作使得迭代器过了生存期
3 有效范围,构成的范围是不是有效
4、非法的内置类型操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值