3. 迭代器

迭代器(Iterator)是一种模拟指针来对顺序或随机容器进行数据访问的工具。使用迭代器可以用统一的方法对标准模板库中的容器进行访问。

C++ 中不同的容器可以通过如下成员函数返回容器的迭代器。虽然不同容器返回的迭代器的类型可能不同,但迭代器的操作方式都相同。

容器中迭代器相关的成员函数

成员函数
说明
begin 或 cbegin(C++11)
返回容器数据开始位置的迭代器
end或cend(C++11)
返回容器数据结束位置的迭代器(最后一个元素的后面)
rbegin或crbegin(C++11)
返回反向迭代器的起始位置(最后一个元素)
rend或 crend(C++11)
返回反向迭代器的结束位置(第一个元素的前一位置)

上述 cbegin、cend、crbegin、crend 这个四个以 c 开头的迭代器相关成员函数返回的迭代器具有常属性(const),不能使用迭代器对容器内的数据进行修改。

上述成员函数返回迭代器的位置如下所示:

iterator定位位置

迭代器的基本操作

成员函数
说明
*it
解引用,引用当前的数据元素。
=
赋值(拷贝赋值)。
== 或 !=
比较两个迭代器是否指向同一位置。
++it 或 it++
前置/后置自增,让迭代器向后移动到下一个元素。
--it 或 it--
前置/后置自减,让迭代器向前移动到前一个元素。
it + n 或 n + it
返回向后移动 n 个位置的新迭代器。
it - n
返回向前移动 n 个位置的新迭代器。
it += n
it 向后移动 n 个位置,并返回迭代器自身。
it -= n
it 向前移动 n 个位置,并返回迭代器自身。
it2 - it1
返回两个迭代器的距离(需指向同一容器,整数值)。
< 或 <= 或 > 或 >=
比较两个迭代器的前后顺序(需指向同一容器)。
it[n]
下标访问,等同于 *(it + n)。
it->
访问结构体类(或类)对象的成员。

示例

// filename: iterator.cpp
#include <iostream>
#include <vector>

int main(int argc, char * argv[]) {
    // 创建一个存放整数的动态数组vector
    std::vector<int> v = {11, 22};
    v.push_back(33);  // 向末尾追加一个整数
    // 获取开始位置的迭代器,it指向第一个数据
    std::vector<int>::iterator it = v.begin();
    std::cout << "第一个数据是" << *it << std::endl;
    std::cout << "第二个数据是" << *(it+1) <<std::endl;
    std::cout << "第二个数据是" << it[1] << std::endl;
    auto crit = v.crbegin(); // 返回反向常迭代器
    std::cout << "最后一个元素是:" << *crit << std::endl;
    crit++; // 向前走一个数据元素
    // *crit = 222; // 修改数据时报错
    std::cout << "倒数第二个元素是:" << *crit << std::endl;
    // 删除第二个数据元素
    v.erase(it+1);
    // 使用迭代器遍历 vector
    for(auto it = v.begin(); it != v.end(); it++)
        std::cout << *it << " ";
    std::cout << std::endl;
    // 在最后一个数据前插入数据
    v.insert(v.cend()-1, 22);
    for(auto it = v.begin(); it != v.end(); it++)
        std::cout << *it << " ";
    std::cout << std::endl;

    return 0;
}

编译和运行结果如下

weimz@mzstudio:~$ g++ -o iterator iterator.cpp
weimz@mzstudio:~$ ./iterator
第一个数据是11
第二个数据是22
第二个数据是22
最后一个元素是:33
倒数第二个元素是:22
11 33
11 22 33