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),不能使用迭代器对容器内的数据进行修改。
上述成员函数返回迭代器的位置如下所示:

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