第二十六条:iterator优先于const_iterator、reverse_iterator及const_reverse_iterator。
原因:
1)容器中的instert和crase函数的形参只接受iterator类型,不接受const_iterator、reverse_iterator及const_reverse_iterator。
2)从iterator到const_iterator,或者从reverse_iterator到const_reverse_iterator之间都存在隐式转换,但是反过来技术上可以实现,但不推荐,效率不能保证。
3)在同一个表达式中混用iterator和const_iterator,比如比较操作,会发生隐式转换,有时会出现问题。
第二十七条:使用distance和advance将容器的const_iterator转换成iterator
distance:用于取得两个迭代器之间的距离;
advance:用于将一个迭代器移动指定的距离。
typedef dequeIntDeque; typedef IntDeque::iterator Iter; typedef IntDeque::const_iterator ConstIter; IntDeque d; ConstIter ci; ... Iter i(d.begin()); /迭代器 i 指向容器 d 起始位置 advance(i, distance (i, ci)); /注意这里指明distance所使用的类型为ConstIter
效率问题:对于随机访问的迭代器(如vector、string、deque产生的迭代器)而言,执行时间是常数时间;对于其他标准容器以及散列表的迭代器而言,执行时间是一个线性时间,因此推荐二十六条,尽量用iterator代替const_iterator
第二十八条:正确理解由reverse_iterator的base()成员函数所产生的iterator的用法
1)插入操作:如果要在一个迭代器reverse_iterator ri指定的位置上插入一个新元素,则只需在ri.base()位置处插入元素即可。
2)删除操作:如果要在一个迭代器reverse_iterator ri指定的位置上删除一个元素,要先递增ri,然后在调用base()函数,例如:v.erase((++ri).base());
第二十九条:对于逐个字符的输入请考虑使用istreambuf_iterator
对比istream_iterator,它在默认请看下会跳过空白字符,并且效率低。
读取一个文本文件的内容到一个string对象中,推荐的方案如下:
ifstream inputFile("test.txt");
string fileData((istreambuf_iterator(inputFile)),
istreambuf_iterator());



