虽然迭代器比较好用但是确保迭代器的正确使用还是有点难度的。
看下面一段程序里面隐含了一些常见的错误
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、非法的内置类型操作。