3. 迭代器

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

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

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

成员函数
说明
迭代器相关成员函数
begincbegin(C++11)
返回容器数据开始位置的迭代器
endcend
回容器数据结束位置的迭代器(最后一个元素的后面)
rbegincrbegin(C++11)
返回反向迭代器的起始位置(最后一个元素)
rendcrend(C++11)
返回反向迭代器的结束位置(第一个元素的前一位置)

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

迭代器的基本操作

成员函数
说明
*it
解引用,引用当前的数据元素。
=
赋值(拷贝赋值)。
==!=
比较两个迭代器是否指向同一位置。
++itit++
前置/后置自增,让迭代器向后移动到下一个元素。
--itit--
前置/后置自减,让迭代器向前移动到前一个元素。
it + nn + 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>

using namespace std;

int main()
{
    vector<int> v = {11, 3, 7, 5, 9};
    auto it = v.begin();
    cout << "*it: " << *it << endl;  // 11
    cout << "*(it+2): " << *(it+2) << endl; // 7
    cout << "it[3]: " << it[3] << endl; // 5
    auto it2 = it + 4;
    cout << "*it2: " << *it2 << endl;  // 9
    cout << "it < it2: " << (it < it2) << endl; // 1
    it2++;
    cout << "it2 == v.end(): " << (it2 == v.end()) << endl; // 1

}

编译和运行结果如下

weimz@mzstudio:~$ g++ -o iterator iterator.cpp
weimz@mzstudio:~$ ./iterator 
*it: 11
*(it+2): 7
it[3]: 5
*it2: 9
it < it2: 1
it2 == v.end(): 1