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

奋斗加油奋斗中....


 

最近在看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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值