迭代器有五种不同的功能类型,分别是:
- 输入迭代器:只能从容器中读取元素,不能修改或删除元素。只能用于单遍扫描算法。
可以使用*
和->
操作符来访问元素,可以使用++
操作符来移动迭代器,可以使用==
和!=
操作符来比较迭代器。例如,标准输入流std::cin
就是一个输入迭代器。
- 输出迭代器:只能向容器中写入元素,不能读取或修改元素。只能用于单遍扫描算法。
可以使用*
操作符来赋值元素,可以使用++
操作符来移动迭代器。例如,标准输出流std::cout
就是一个输出迭代器。
- 前向迭代器:既可以读取也可以写入容器中的元素,还可以多次访问同一个元素。能用于多遍扫描算法。
不能反向移动迭代器。支持输入迭代器和输出迭代器的所有操作,还可以多次访问同一个元素。例如,标准库中的单向链表std::forward_list
就使用前向迭代器。
- 双向迭代器:既可以读取也可以写入容器中的元素,还可以正向或反向移动迭代器。能用于多遍扫描算法。
支持前向迭代器的所有操作,还可以使用--
操作符来移动迭代器。例如,标准库中的双向链表std::list
就使用双向迭代器。
- 随机访问迭代器:既可以读取也可以写入容器中的元素,还可以任意跳跃到容器中的任何位置。支持和一个整数值的加减运算、两个迭代器上的减法运算、下标运算符、比较两个迭代器相对位置的关系运算符等。能用于多遍扫描算法。
支持双向迭代器的所有操作,还可以使用+
、-
、+=
、-=
、[]
、<
、>
、<=
、和 >=
操作符来移动或比较迭代器。例如,标准库中的向量 std::vector
就使用随机访问迭代器。
不同的容器使用不同类型的迭代器,例如:
- vector和deque使用随机访问迭代器
- list和set使用双向迭代器
- stack和queue不支持迭代器
要使用迭代器,需要包含头文件<iterator>,并使用容器类名后面加上::iterator或::const_iterator来定义迭代器变量
// 输入迭代器(流迭代器)
#include <iostream>
#include <iterator>
int main() {
std::cout << "Enter some numbers (Ctrl+D to end):\n";
std::istream_iterator<int> it(std::cin); // 创建输入流迭代器
std::istream_iterator<int> end; // 创建默认构造的结束标志
int sum = 0;
while (it != end) { // 比较两个输入流迭代器
sum += *it; // 访问输入流中的元素
++it; // 移动输入流迭代器
}
std::cout << "The sum is " << sum << "\n";
}
// 输出迭代器(流迭代器)
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
std::ostream_iterator<int> it(std::cout, " "); // 创建输出流迭代器
for (int x : v) {
*it = x; // 向输出流中写入元素
++it; // 移动输出流迭代器
}
std::cout << "\n";
}
// 前向迭代器
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> fl = {1, 2, 3, 4, 5};
auto it = fl.begin(); // 创建前向迭代器
while (it != fl.end()) { // 比较两个前向迭代器
std::cout << *it << " "; // 访问前向迭代器指向的元素
++it; // 移动前向迭代器
}
std::cout << "\n";
}
// 双向迭代器
#include <iostream>
#include <list>
int main() {
std::list<int> li = {1, 2, 3, 4, 5};
auto it = li.begin(); // 创建双向迭代器
while (it != li.end()) { // 比较两个双向迭代器
std::cout << *it << " "; // 访问双向迭代器指向的元素
++it; // 移动双向迭代器
}
std::cout << "\n";
while (it != li.begin()) { // 比较两个双向迭代器
--it; // 移动双向迭代器
std::cout << *it << " "; // 访问双向迭代器指向的元素
}
std::cout << "\n";
}
// 随机访问迭代器
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // 创建随机访问迭代器
std::cout << *it << "\n"; // 输出1
it += 3; // 跳跃到第四个元素的迭代器
std::cout << *it << "\n"; // 输出4
it = it - 2; // 跳跃到第二个元素的迭代器
std::cout << *it << "\n"; // 输出2
std::cout << it[2] << "\n"; // 输出4,相当于*(it + 2)
}