#include <string> #include <vector> #include <conio.h> #include<iostream> using namespace std; void test0() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); vector<int>::const_iterator i;//常量迭代器 for(i=v.begin();i!=v.end();i++) cout<<*i<<",";//1,2,3,4, //访问迭代器所指向的元素 cout<<endl; vector<int>::reverse_iterator r;//反向迭代器 for(r=v.rbegin();r!=v.rend();r++) cout<<*r<<",";//通过非const迭代器来修改其指向的元素 cout<<endl;//4,3,2,1, vector<int>::iterator j;//非常量迭代器 for(j=v.begin();j!=v.end();j++) *j=100; for(j=v.begin();j!=v.end();j++) cout<<*j<<",";//100,100,100,100, cout<<endl; } void Test(char h) { cout<<"press key===="<<h<<endl; switch(h) { case '0': test0();break; // case '1': test1();break; case 27: case 'q':exit(0);break; default:cout<<"default "<<h<<endl;break; } } void main() { while(1) { Test(getch()); } }
不同容器上支持的迭代器功能强弱有所不同,容器的迭代器的功能强弱,决定了该容器是否支持STL中的某种算法。eg:只有第一类容器能用迭代器遍历;排序算法需要通过随机迭代器来访问容器中的元素,那么有的容器就不支持排序算法。
名词 | 1.输入迭代器 input iterator |
1.输出迭代器 output iterator |
2.正向迭代器 forward iterator |
3.双向迭代器 bidirectional iterator |
4.随机访问迭代器 random access iterator |
功能描述 | 提供对数据的只读访问 | 提供对数据的只写访问 | 提供读写操作,并能一次一个地向前移动 | 提供读写操作,并能一次一个地向前或向后移动 | 提供读写操作,并能在数中随机的移动 |
不同迭代器所能进行的操作 | *p,p1=p,p(==/!=)p1 ++p,p++ |
*p,p=p1 ++p,p++ |
*p,p1=p,p=p1,p(==/!=)p1, ++p,p++ |
*p,p1=p,p=p1,p(==/!=)p1, (++/--)p,p(++/--) |
*p,p1=p,p=p1,p(==/!=)p1,(++/--)p,p(++/--),p(>/<)p1,p(<=/>=)p1 p(+/-)i:返回指向p后/前面的第i个元素的迭代器 |
容器的迭代器分类 | list,set/multiset,map/multimap | vector,deque |
注:1.编号大的迭代器拥有编号小的迭代器的所有功能,能当做编号小的迭代器使用
2.stack,queue,priority_queue不支持迭代器
#include <list> #include <vector> #include <conio.h> #include<iostream> using namespace std; void test1() { //vector的迭代器是随机迭代器,所以遍历vector有好几种 int ar[]={1,2,3,4}; vector<int> v(ar,ar+4); vector<int>::value_type i;//等效于些int i; for(i=0;i<v.size();i++) cout<<v[i];//1234 cout<<endl; vector<int>::const_iterator ii; for(ii=v.begin();ii!=v.end();ii++) cout<<*ii;//1234 cout<<endl; ii=v.begin(); while(ii<v.end()) { cout<<*ii;//13 ii=ii+2; } cout<<endl; //而list的迭代器是双向迭代器 list<int> lt(ar,ar+4); list<int>::const_iterator jj=lt.begin(); while(jj!=lt.end())//若改成while(jj<lt.end())则编译会出问题,因为双向迭代器不支持< { cout<<*jj;//1234 jj++;//如写成jj=jj+1;则会出现编译错误,因为双向迭代器不支持返回指向jj的后面的第1个元素的迭代器。当然更不用谈:jj=jj+2; } cout<<endl; for(int i=0;i<lt.size();i++) ;//cout<<lt[i];//双向迭代器不支持[] } void Test(char h) { cout<<"press key===="<<h<<endl; switch(h) { case '1': test1();break; case 27: case 'q':exit(0);break; default:cout<<"default "<<h<<endl;break; } } void main() { while(1) { Test(getch()); } }
官网实例