C++迭代器和标准库算法的注意事项——个人笔记

来源:互联网 发布:2017大盘 知乎 编辑:程序博客网 时间:2024/06/09 19:07

奋斗加油奋斗中....


 

最近在看C++ Primer 第四版,陆续记一些自己觉得重要和平时出错过的地方:

1.用于指定范围的两个迭代器实参类型必须完全相同,不能无意间一个用const_iterator,而另一个却是非const迭代器

 

2.容器调用begin()和end()成员函数时,获得的迭代器类型是由该容器的性质决定的,如:

vector<string> svec;
vector<string>::iterator iter = svec.begin();         //这里将返回非const迭代器 const vector<string> svec2;
vector<string>::const_iterator iter = svec2.begin();         //这里将返回const_iterator, 试图将返回值赋给iterator将出错

3.使用标准库算法时,传递的迭代器要满足其要求,如:

fill(iter1, iter2, value);           //因为fill会改变迭代器所指范围内的元素,所以必须不能传递const_iterator给他做实参

sort(iter1, iter2);          //sort要求传入随机访问迭代器,随机访问迭代器有string, vector, deque的迭代器和操作数组的指针,而list, map, set提供的是双向迭代器,所以sort不能作用在后面这些容器上,虽然list不能用标准库的sort, 但是list在他的成员函数中提供了自己的sort

 

4.以下这种用法在g++ 4.7中是能编译通过的,在VC6.0中不可以,VC6.0太老了:#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

int main()
{
 istream_iterator<int> iiter(cin), eof;
 vector<int> ivec(iiter, eof);   //VC6.0不支持
 return 0;
}

 

5.可以使用一对迭代器来初始化容器,但用VC6.0时使用一对反向迭代器来初始化容器却报错,VC6.0太老了,用g++ 4.7是可以的:

list<int> ilist(ivec.rbegin(), ivec.rend());         //VC6.0编译器不支持,遇到错误不要大惊小怪

 

6.front_inserter依赖容器提供的push_front操作实现,所以vector容器不能用它


 

0 0
原创粉丝点击