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

C++之iterator(迭代器)学习

2018-03-04 12:41 405 查看
        迭代器是一种检查容器内元素并便利元素的数据类型,迭代器可以很大程度上隔离容器底层实现,使用时只需依赖迭代器相对统一的方法/接口。Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
  1 容器的Iterator类型
   vector<int>::iterator iter;  定义一个名为iter的变量,数据类型是vector<int>定义的iterator类型。

  迭代器和迭代器类型的区别?
   iterator表述两种事物,一般指的是迭代器的概念;而具体指的是vector定义的具体iterator类型,如vector<int>
   若一种类型支持一组确定的操作,则称这种类型为迭代器。

   每个容器都定义了iterator类型,而这种类型支持迭代器的各种操作。

     2 begin和end操作(返回的是迭代器类型)
       vector<int> ivec;
       vector<int>::iterator iter = ivec.begin();

       vector<int>::iterator iter1 = ivec.end();

        begin指向第一个元素,即ivec[0]

        end指向末端元素的下一个,指向一个不存在的元素。(启动一个哨兵的作用)

        若vector为空,begin和end返回的迭代器相同。

      3 基本操作
          *iter = 0;  等价于  ivec[0] = 0
           ++iter  指向iter的下一个元素
           可以使用== 或 != 比较两个迭代器是否相同
         for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)   *iter = 0;   等价于
         for (vector<int>::size_type ix= 0; ix != ivec.size(); ix++)   ivec[ix]= 0; 
  3 const_iterator
  (1) vector<int>::const_iterator iter 表示指向的值为常量,iter可移动指针
     const vector<int>::iterator iter 表示指针为常量,不可移动指针,可修改其值
 (2)算术操作
   iter+n   iter-n  表示迭代器向前或向后移动迭代器
   iter1-iter2  计算两个迭代器的距离
   vector<int>::iterator mid = vi.begin() + vi.size()/2  计算中间元素

   可通过end和begin函数计算容器的大小,如下
    vector<int>::size_type size =  str.end() - str.begin();
     cout << size << endl;
   vector<int>::iterator mid = (vi.begin() + vi.end())/2  编译报错,两个地址不允许做加法和除法
  

example:
#include <vector>
#include <iostream>

using namespace std;
using std::vector;

int main()
{
    string word;
    vector <string> str(3);
    str[0] = "aaa";
    str[1] = "bbb";
    str[2] = "ccc";

    vector<string>::iterator mid = str.begin() + str.size()/2;
    cout << *mid << endl;
    str.push_back("ddd");
    str.push_back("eee");
    str.push_back("fff");
    vector<string>::iterator mid2 = str.begin() + str.size()/2;
    cout << *mid2 << endl;
    
    return 0;

}
[root@iZwz9a9kyixoqvys89ewj4Z vector]# ./a.out 
bbb
ddd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: