首页 > 编程笔记 > C++笔记 阅读:15

C++ STL迭代器的用法(附带实例)

C++ 中,访问容器中的元素需要通过迭代器。迭代器可以指向容器中的某个元素,进而读写该元素的值。从这一点上看,迭代器和指针非常类似。

迭代器分为如下 5 种:
  1. 输入迭代器:又称为只读迭代器,它从容器中读取元素,一次只能读入一个元素并向前移动。只支持一遍算法,即同一个输入迭代器不能遍历一个序列两次。
  2. 输出迭代器:又称为只写迭代器,它往容器中写入元素,一次只能写入一个元素并向前移动。同一个输出迭代器不能遍历一个序列两次。
  3. 正向迭代器:组合了输入迭代器和输出迭代器的功能,且可以多次解析一个迭代器指定位置,可以对一个值进行多次读/写。
  4. 双向迭代器:组合了正向迭代器的功能,且可通过操作符向后移动位置。
  5. 随机访问迭代器:组合了双向迭代器的功能,可以向前、向后跳过任意个位置,且可以直接访问容器中任意位置的元素。

不同容器对应的迭代器类型如下表所示:

表:不同容器对应的迭代器类型
容器 对应的迭代器类型 容器 对应的迭代器类型
vector 随机访问迭代器 forward_list 正向迭代器
deque 随机访问迭代器 unordered_map / unordered_multimap 正向迭代器
list 双向迭代器 unordered_set / unordered_multiset 正向迭代器
set/multiset 双向迭代器 stack 不支持迭代器
map/multimap 双向迭代器 queue 不支持迭代器

迭代器的定义格式有 4 种,具体如下表所示。定义迭代器后,就可以通过“*迭代器名”读取迭代器指向的元素。

表:迭代器的定义格式
迭代器类型 定义格式
正向迭代器 容器类名::iterator 迭代器名;
反向迭代器 容器类名::reverse_iterator 迭代器名;
常量正向迭代器 容器类名::const_iterator 迭代器名;
常量反向迭代器 容器类名::const_reverse_iterator 迭代器名;

其中,非常量迭代器可以修改指向的元素;正向迭代器进行自增(++)操作时,指向容器中的后一个元素;反向迭代器进行自增(++)操作时,指向容器中的前一个元素。

下面以 vector 容器为例,介绍迭代器的用法和功能。vector 支持随机访问迭代器,因此遍历 vector 容器有多种方法。下面的代码中,每个循环都演示了一种方法。
#include <iostream>
#include <vector> //引入 vector 头文件
using namespace std;
int main()
{
    vector<int> v; //定义一个数组
    int array[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个数组
    v = vector<int>(array,array+10); //使用数组初始化 vector

    cout << "1: " << endl; //第 1 种遍历方法
    for (int i = 0; i < v.size(); ++i) //size 返回元素个数
        cout << v[i] << " "; //像普通数组一样使用 vector 容器

    cout << endl << "2: " << endl; //第 2 种遍历方法
    vector<int>::iterator i; //用 != 比较两个迭代器
    for (i = v.begin(); i != v.end(); ++i)
        cout << *i << " ";

    cout << endl << "3: " << endl; //第 3 种遍历方法
    for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器
        cout << *i << " ";

    cout << endl << "4: " << endl; //第 4 种遍历方法
    i = v.begin(); //隔位输出
    while (i < v.end()){
        cout << *i << " ";
        i += 2; //随机访问迭代器支持 "+=" 整数的操作
    }
}
程序运行结果为:
1:
1 2 3 4 5 6 7 8 9 10
2:
1 2 3 4 5 6 7 8 9 10
3:
1 2 3 4 5 6 7 8 9 10
4:
1 3 5 7 9

相关文章