7 STL迭代器

来源:互联网 发布:go编程语言 编辑:程序博客网 时间:2024/05/01 16:22

7 STL迭代器

7. 1 迭代器头文件

有几种特殊的迭代器被定义于<iterator>中。


7.2 迭代器类型


注意1:比较这两个程序:

(1)while(ture){*pos = foo(); ++pos}             (2)while(pos != coll.end()){*pos = foo(); ++pos;}

对于output迭代器,没有定义operator !=,只适用于第一个程序;

对于forward迭代器,若使用程序1,最终会提取end(),导致未定义行为,所以只适用于第二个程序。


注意2:对于vector和string,不要使用++coll.begin(),而要使用pos = coll.begin(); ++pos;。因为它们的迭代器通常实现为一般指针。


7.3 迭代器相关辅助函数

1、void advance(InputIterator& pos, Dist n);   <iterator>

使迭代器pos步进或步退n个元素(对于双向迭代器或随机存取迭代器,n可为负值)。

 

2、Dist distance(InputIterator pos1, InputIterator pos2);  <iterator>

传回两个迭代器之间的距离。(两个迭代器必须指向同一个元素;若不是随机存取迭代器,pos2的位置必须在pos1之后或相同。)

 

3、void iter_swap(FoewardIterator1 pos1, ForwardIterator2 pos2);  <algorithm>

交换pos1和pos2所指的值。(迭代器类型不必相同)

 

7.4 迭代器配接器(Iterator Adapter)

1、reserve迭代器(逆向迭代器)

可将一般迭代器转化为一个逆向迭代器:

vector<int> coll;//初始化为1-9;vector<int>::iterator pos;vector<int>::reserve_iterator rpos(pos);//若*pos为5,*rpos则为4。(实际位置不变,但所代表的的逻辑数值不同,*rpos的数值为*pos之前一个元素)vector<int>::iterator rrpos;rrpos = rpos.base();  //base()可将逆向迭代器转换为正常迭代器,*rrpos与*pos相等。

实际上rbegin()即container::reverse_iterator(end()),rend()即container::reverse_iterator(begin())。

2、insert迭代器

不能改变insert迭代器的位置:++iter和iter--都无实际操作;*iter无实际操作(传回iter);iter = value:安插value。(因此*iter=value等价于iter=value)

用法举例:

back_inserter(coll) = 30;  //将30插入容器

或者back_insert_iterator<vector<int> > iter(coll); *iter=1; *iter=2; //分别将1、2插入coll

 

 3、流迭代器



注意1:两个istream迭代器相等的条件:两者都是end-of-stream迭代器,或者两者都可以进行读取操作并指向相同的stream。

注意2:对于istream_iterator<int> cinPos(cin);调用advance(cinPos, n);,若n过大,则cinPos与istream<int>()相等。


7.5 迭代器特性(iterator traits)


typename std::iterator_traits<T>::value_type可以取代迭代器T的元素数值类型。

std::iterator_traits<T>::iterator_category();返回迭代器T的迭代器标志(iterator tag(是一个结构体)),如output_iterator_tag, input_iterator_tag ,forward_iterator_tag(继承自input_iterator_tag), bidirectional_iterator_tag(继承自forward_iterator_tag), random_access_iterator_tag(继承自bidirectional_iterator_tag)。

这样,可以为迭代器编写泛型函数。

原创粉丝点击