Iterator Categories

来源:互联网 发布:百人牛牛作弊辅助软件 编辑:程序博客网 时间:2024/05/21 17:39

1.分类

迭代器有有5种:
  • input
只能一次一个向前读取元素,典型的为:istream
  • output
与input对应,典型的为:ostream
  • forward(前向)
具有input的所有功能和output的大部分功能(即output没有'!="运算符,而forward是有"!="运算符的)。
  • Bidirectional(双向)
在forward的基础上,增加了回头遍历的能力。(即支持递减运算)
  • Random access
在bidirectional基础上,增加随机存取的能力。

2.迭代器相关辅助函数

  • void advance(InputIterator& pos, Dist n)
迭代器前进或后退n步。(适用于非随机iterator)
  • Dist distance(InputIterator& pos1, InputIterator& pos2)
返回pos1和pos2之间的距离。(适用于随机iterator)
  • void iter_swap(ForwardIterator1 pos1, ForwardIterator2 pos2)
交换pos1和pos2所指的值。(迭代器的型别可以不同,但其所指的2个值必须可以相互赋值)

3.迭代器配接器(Iterator Adapters)

  • reverse(逆向)迭代器
可以将一般迭代器(具有双向移动能力)转成一个reverse迭代器.例如:
vector<int>::iterator pos;
...
vector<int>::reverse_iterator rpos(pos);//注:*rpos != *pos
注:将一个迭代器转化为逆向迭代器的过程中,保持的是实际位置(元素)而非逻辑位置(数值)。(*rpos).base()可以将rpos转为正常迭代器。注:rbegin()==end()
  • Insert(安插型)迭代器
  • stream(流)迭代器
#include <iterator>#include <algorithm>#include <iostream>#include <vector>#include <string>#include <fstream>using namespace std;int main(){ofstream ofile("ostream.txt");ostream_iterator<string> intWriter(ofile,"\n");intWriter="999";intWriter="77";intWriter="-5";ofile.close();vector<int> coll;for(int i=1;i<=9;++i){coll.push_back(i);}copy(coll.begin(),coll.end(),ostream_iterator<int>(cout));cout<<endl;copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," < "));cout<<endl;return 0;}

#include <iterator>#include <iostream>using namespace std;int main(){istream_iterator<int> intReader(cin);istream_iterator<int> intReaderEOF;while (intReader!=intReaderEOF){cout<<"once: "<<*intReader<<endl;cout<<"once again: "<<*intReader<<endl;++intReader;}return 0;}

注:
Q:当pos为一个iterator时,*pos是否就是pos?
A:貌似是的。例如:"****pos=45;"还是可以执行。
Q:对于outIterator,pos++,++pos是否有作用?
A:什么都没有做。

4.使用自定义的迭代器

自己写迭代器有2种办法可行:

1.提供必要的五种型别定义,就像iterator_traits结构所描述(P284)。

2.提供一个特化的iterator_traits结构。






原创粉丝点击