迭代器基本操作

  • 用于指向第一类容器(顺序容器(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:只有第一类容器能用迭代器遍历;排序算法需要通过随机迭代器来访问容器中的元素,那么有的容器就不支持排序算法。 

按迭代器的功能强弱分为5种
名词

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/multimapvector,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());
    } 
}

 官网实例

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐