您的位置:首页 > 编程语言 > C语言/C++

C++ 9.2迭代器支持的运算和迭代器范围

2015-06-01 15:14 459 查看

简介

=========================================================================================================

一、迭代器支持的运算

每种容器类型都提供若干共同工作的迭代器类型,与容器类型一样,所有迭代器具有相同的接口:如果某种迭代器支持某种操作,那么支持这种操作的其他迭代器会以相同的方式支持这种操作。例如:所有容器迭代器都支持以解引用运算从容器中读入一个元素。类似的,容器都提供自增和自减操作符来支持从一个元素到下一个元素的访问。



1、vector和deque容器的迭代器提供额外的运算

list 的迭代器不支持算术运算,也不支持关系运算。它只支持前置和后置的自增、自减运算以及相等(不相等)运算。



关系操作符只适用于vector和deque容器,这是因为只有这两种容器为其元素提供快速、随机的访问。他们确保可根据元素位置直接有效地访问指定的容器元素。

vector<int>::iterator iter = vec.begin() + vec.size()/2;//计算vector对象的中点位置
list<int> ilist(vec.begin(),vec.end());
ilist.begin()+ilist.size()/2;//错误!!!!!list迭代器不支持算术运算,也不支持关系运算。它只支持前置和后置的自增、自减运算以及相等(不相等)运算。


二、迭代器范围

1、迭代器范围

迭代器使用一对迭代器来标记迭代器范围,这两个迭代器分别指向同一个容器中的两个元素或超出末端的下一个位置,通常将它们命名为 first 和 last ,或 beg 和 end ,用于标记容器中的一段元素范围。该范围内的元素包括从first开始到last指向的位置之前的所有元素。如果两个迭代器相等,则迭代器范围为空。

此类元素范围称为左闭合区间,其标准表达方式为:

[first,last)//表示从first开始,到last 结束,但不包括last 。迭代器last 可以等于first,或指向first 标记的元素后面的某个元素,但绝对不能指向first标记的元素前面的元素。


对形成迭代器范围的迭代器的要求,迭代器first和last如果满足以下条件,则可形成一个迭代器范围

它们指向同一个容器中的元素或超出末端的下一个位置;

如果这两个迭代器不相等,则对first反复做自增运算必须能够到达last。

2、使用左闭合区间的编程意义

因为左闭合区间有两个方便使用的性质,所以标准库使用此类区间。

当first和last相等时,迭代器范围为空;

不相等时,迭代器范围内至少有一个元素,而且first指向该区间的第一个元素。

三、使迭代器失效的容器操作

后面会看到一些容器的操作会修改容器的内在状态或移动容器内的元素。

这样的操作使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。

使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。

例如,每种容器都定义了一个或多个erase 函数。这些函数提供了删除容器元素的功能。任何指向已经删除元素的迭代器都具有无效值,因为,该迭代器指向了容器中不再存在的元素。

//定义一个返回迭代器类型的函数,函数的形参是一对迭代器和一个常数。
//函数实现的功能在是通过迭代器在容器中寻找某个数,并返回该迭代器的值
#include <iostream>
#include<list>
#include<vector>
#include<cstring>
using namespace std;
vector<int>::iterator findInt(vector<int>::iterator beg,vector<int>::iterator end,int ival){

    while(beg!=end)
      if(*beg==ival)
        break;
      else
        ++beg;
     return beg;
 }

int main()
{
    int ia[]={0,1,2,3,4,5,6};
    vector<int> ivec(ia,ia+7);//通过数组对容器进行初始化
    int ival;
    cin>>ival;
    vector<int>::iterator it;
    it=findInt(ivec.begin(),ivec.end(),ival);
 if(it!=ivec.end())
   cout<<"YES"<<endl;
   else
   cout<<"NO"<<endl;
    return 0;
}


//为了提高程序的通用性,使得对于不同类型的迭代器及元素类型,都能用同一查找函数进行查找。

//函数findInt可以实现为函数模板。(16章)
template<typename T1,typename T2>
T1 findInt(T1 beg,T1,T2 ival){

    while(beg!=end)
      if(*beg==ival)
        break;//结束循环
      else
        ++beg;
     return beg;
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: