C++ 迭代器

C++ 迭代器 首页 / C++入门教程 / C++ 迭代器

迭代器就像用于访问集合元素的指针一样。

  • 迭代器用于从一个元素遍历到另一个元素,这一过程称为迭代集合
  • 迭代器的主要优点是为所有集合类型提供通用接口。
  • 迭代器使算法独立于所使用的集合类型
  • 迭代器提供了一种浏览集合元素的通用方法。

迭代器语法

<ContainerType> ::iterator;
<ContainerType> ::const_iterator;

迭代器操作

  • Operator(*)    -  " *"运算符返回迭代器指向的当前位置的元素。
  • Operator(++) - " ++"运算符将迭代器加1。因此,迭代器指向集合的下一个元素。
  • Operator(==)和Operator(!=)  - 这两个运算符都确定两个迭代器是否指向同一位置。
  • Operator(=)  -  "="运算符分配迭代器。

迭代器和指针

迭代器可以是智能指针,它可以迭代复杂的数据结构。集合提供其迭代器类型。因此,可以说迭代器具有不同集合类型的公共接口。

集合类提供了两个基本的成员函数,它们允许迭代或遍历集合的元素:

  • begin()  - begin()函数返回指向集合第一个元素的迭代器。
  • end()      - end()函数返回一个迭代器,该迭代器指向集合的过去-最后一个元素。
C++ Iterators

让我们看一个简单的示例:

#include <iostream>
#include<iterator>
#include<vector>
using namespace std;
int main()
{
   std::vector<int> v{1,2,3,4,5};
   vector<int>::iterator itr;
   for(itr=v.begin();itr!=v.end();itr++)
   {
       std::cout << *itr <<" ";
   }
    return 0;
}

输出:

1 2 3 4 5

迭代器类别

迭代器可以通过以下方式进行分类:

  • 输入迭代器
  • 输出迭代器
  • 转发迭代器
  • 双向迭代器
  • 随机访问迭代器
C++ Iterators

输入迭代器:输入迭代器是用于从集合访问元素的迭代器,但它不会修改集合的值。

用于输入迭代器的运算符是:

  • 增量运算符(++)
  • 等于运算符(==)
  • 不等于运算符(!=)
  • 取消引用运算符(*)

输出迭代器:输出迭代器是用于修改集合值的迭代器,但不会从集合中读取值。因此,我们可以说输出迭代器是只写迭代器

用于输出迭代器的运算符是:

  • 增量运算符(++)
  • 赋值运算符(=)

Forward Iterator :Forward Iterator是用于读取和写入集合的迭代器。这是一个多遍迭代器。

用于正向迭代器的运算符是:

  • 增量运算符(++)
  • 赋值运算符(=)
  • 相等运算符(=)
  • 不相等运算符(!=)

双向迭代器:双向迭代器是一种支持正向迭代器所有函数的迭代器,另外还增加了一个函数,即减量运算符(-)。我们可以通过减少迭代器来向后移动。

用于双向迭代器的运算符是:

  • 增量运算符(++)
  • 赋值运算符(=)
  • 相等运算符(=)
  • 不相等运算符(!=)
  • 递减运算符(--)

随机访问迭代器:随机访问迭代器是一种迭代器,可在任意位置对元素进行随机访问。它具有双向迭代器的所有函数,另外还增加了一个函数,即指针添加和指针减法以提供对元素的随机访问。

让我们看一个简单的示例:

#include <iostream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
    vector<int> v{1,2,3,4,5};
    vector<int>::iterator itr;
    for(int i=0;i<5;i++)          //不使用迭代器的遍历。
    {
        cout<<v[i]<<" ";
    }
    cout<<'\n';
    for(itr=v.begin();itr!=v.end();itr++) //使用迭代器进行遍历。
    {
        cout<<*itr<<" ";
    }
    v.push_back(10);
    cout<<'\n';
     for(int i=0;i<6;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<'\n';
     for(itr=v.begin();itr!=v.end();itr++)
    {
        cout<<*itr<<" ";
    }
     return 0;
}

输出:

      1 2 3 4 5                                                                                                          
      1 2 3 4 5                                                                                                          
      1 2 3 4 5 10                                                                                                       
      1 2 3 4 5 10 

在上面的示例中,我们观察到,如果不使用迭代器遍历向量的元素,则需要跟踪集合中添加的元素数量。

无涯教程网

  • 代码可重用性:如果我们使用迭代器,则可以重用代码。在上面的示例中,如果我们用列表替换vector,则下标operator []将无法访问元素,因为列表不支持随机访问。但是,我们使用迭代器访问元素,然后也可以访问列表元素。
  • 动态处理:C++迭代器提供了动态添加或删除数据的函数。

让我们看一个简单的示例:

#include <iostream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
    vector<int> v{1,2,3,4,5}; //向量声明
    vector<int>::iterator itr;
    v.insert(v.begin()+1,10);      
    for(itr=v.begin();itr!=v.end();itr++)
    {
        cout<<*itr<<" ";
    }
    return 0;
}

输出:

1 10 2 3 4 5

在上面的示例中,我们使用insert()函数在第二个位置插入了一个新元素,所有其他元素都移位了一个。

其他迭代器

随机访问迭代器与其他迭代器之间最重要的区别在于,随机访问迭代器需要'1'步骤来访问元素,而其他迭代器则需要'n'步骤

C++ Iterators

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

朱赟的技术管理课 -〔朱赟〕

玩转Spring全家桶 -〔丁雪丰〕

移动端自动化测试实战 -〔思寒〕

接口测试入门课 -〔陈磊〕

全链路压测实战30讲 -〔高楼〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

林外 · 专利写作第一课 -〔林外〕

中间件核心技术与实战 -〔丁威〕

技术领导力实战笔记 2022 -〔TGO 鲲鹏会〕

好记忆不如烂笔头。留下您的足迹吧 :)