[STL基础]Iterator迭代器
迭代器基本操作用于指向第一类容器(顺序容器(vector,deque,list)和关联容器(set,multiset,map,multimap))中的元素。有const和非const两种通过迭代器可以读取它指向的元素,通过非const迭代器还能修改其指向的元素。迭代器用法和指针类似定义一个容器类的迭代器的方法可以使:容器类名::iterator 变量名;或容器类名::const_itera
迭代器基本操作
- 用于指向第一类容器(顺序容器(vector,deque,list)和关联容器(set,multiset,map,multimap))中的元素。有const和非const两种
- 通过迭代器可以读取它指向的元素,通过非const迭代器还能修改其指向的元素。迭代器用法和指针类似
- 定义一个容器类的迭代器的方法可以使:容器类名::iterator 变量名;或容器类名::const_iterator 变量名
- 访问一个迭代器指向的元素:*迭代器变量名
- 迭代器上可以执行++操作,一指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值
- 使用一个past-the-end值的迭代器来访问对象是非法的,就好像使用NULL或为初始化的指针一样
#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());
}
}
更多推荐
所有评论(0)