【C++】《C++标准程序库》小结七章-迭代器

来源:互联网 发布:php stdclass new 编辑:程序博客网 时间:2024/05/01 05:19

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函数。


1 0