[STL基础]Iterator迭代器

迭代器基本操作

  • 用于指向第一类容器(顺序容器(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/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());
    } 
}

 

您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多