1、基本迭代器类型:输入input,输出output,前向forward,双向bidirectional,随机random-access。
2、临时迭代器是可以直接递增、递减的,但是vector,string不行,因为他们的迭代器可能是指针。
a) 错误:sort(++coll.begin(), coll.end());
b) 正确:vector<type>::iterator it = coll.begin(); sort(++it,coll.end());
3、vector、deque迭代器可以直接加减。其他容器的迭代器最好用advance,所有类型的迭代器都用advance也没问题,反正有优化;遇到单向迭代器,std::advance可以报错。注意:advance超出范围,不会报错。
4、iter_swap交换的是两个迭代器所指元素的值。
5、把基本迭代器封装起来产生一些新功能就是迭代器配接器,比如reverse逆向,inserter插入,流迭代器。注意他们不是基本迭代器。
6、逆向迭代器有个base()成员函数可以转化 为正向迭代器。请注意逆向迭代器和正向迭代器之间可互相转化,但是两者定义的半开区间是不同的,所以位置有差异!!
7、三个插入迭代器:back_insert_iterator,front_insert_iterator,insert_iterator。可以分别对应:back_inserter(),front_inserter(),inserter()函数。
8、ostream_iterator是个很有用的东西,用它你需要加上#include<iterator>。例子:copy(coll.begin(),coll.end(), ostream_iterator<type>(cout , “ ”));不用循环直接输出coll容器对象的所有数据。
9、istream_iterator的实作版本,构造参数是cin就是正常输入,如果没有,就只能表示输入终结标识。例子:istream_iterator<int> intReader(cin); istream_iterator intEOF;
while(intReader!= intEOF)
{
....//操作
++intReader;
}
10、type_traits是STL内部用于编译期判别的技术,类比于转发。《STL源码剖析》有更加详细的type-traits说明。
11、当你需要实作泛型函数的时候,你可以关注std::iterator_traits<iterator>::iterator_category()。这个函数返回一个tag,比如:random_access_iterator_tag。
实例:template<classiterator>
inline void foo(iterator beg, iterator end)
{
foo(beg, end,std::iterator_traits<iterator>::iterator_category());
}
//双向迭代器
template<classBiIterator>
void foo(BiIterator beg, BiIterator end, std::bidirectional_iterator_tag)
{
...//双向操作
}
//随机迭代器
template<classRaIterator>
void foo(RaIterator beg, RaIterator end, std::random_access_iterator_tag)
{
..//随机操作
}
STL最简单的例子就是distance函数。