在C++的STL标准库中,提供了一系列专门用于迭代器操作的通用函数,这些函数可以适配不同种类的迭代器,完成迭代器移动、距离计算、范围判断等常见操作,是编写泛型代码时的重要工具。

常用STL迭代器操作函数
1. advance函数
advance函数用于将迭代器向前或向后移动指定的距离,它支持所有类型的迭代器,包括输入迭代器、前向迭代器、双向迭代器和随机访问迭代器。对于随机访问迭代器,移动操作是O(1)复杂度,其他类型的迭代器是O(n)复杂度。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it_vec = vec.begin();
// 将迭代器向后移动2个位置
std::advance(it_vec, 2);
std::cout << "vector移动后的值: " << *it_vec << std::endl; // 输出3
std::list<int> lst = {10, 20, 30, 40};
auto it_lst = lst.begin();
// 将迭代器向后移动3个位置
std::advance(it_lst, 3);
std::cout << "list移动后的值: " << *it_lst << std::endl; // 输出40
return 0;
}
2. next函数
next函数用于获取迭代器移动指定距离后的新迭代器,它不会修改原迭代器,而是返回一个新的迭代器对象。该函数同样支持所有迭代器类型,C++11及之后版本可用。
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();
// 获取it向后移动2个位置的新迭代器
auto new_it = std::next(it, 2);
std::cout << "原迭代器指向的值: " << *it << std::endl; // 输出1
std::cout << "新迭代器指向的值: " << *new_it << std::endl; // 输出3
return 0;
}
3. prev函数
prev函数用于获取迭代器向前移动指定距离后的新迭代器,同样不会修改原迭代器,返回新的迭代器对象。它要求迭代器至少是双向迭代器,C++11及之后版本可用。
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.end();
// 获取it向前移动1个位置的新迭代器
auto new_it = std::prev(it, 1);
std::cout << "新迭代器指向的值: " << *new_it << std::endl; // 输出5
return 0;
}
4. distance函数
distance函数用于计算两个迭代器之间的距离,即从一个迭代器到另一个迭代器需要经过的元素个数。对于随机访问迭代器,计算是O(1)复杂度,其他类型是O(n)复杂度。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it1 = vec.begin();
auto it2 = vec.end();
// 计算两个迭代器的距离
int dist = std::distance(it1, it2);
std::cout << "vector迭代器距离: " << dist << std::endl; // 输出5
std::list<int> lst = {10, 20, 30};
auto lit1 = lst.begin();
auto lit2 = lst.end();
int ldist = std::distance(lit1, lit2);
std::cout << "list迭代器距离: " << ldist << std::endl; // 输出3
return 0;
}
5. begin和end函数
std::begin和std::end是C++11引入的通用函数,用于获取容器或数组的起始和尾后迭代器,它们可以适配普通数组、STL容器以及实现了begin和end方法的自定义类型。
#include <iostream>
#include <vector>
#include <iterator>
int main() {
int arr[] = {1, 2, 3, 4};
// 获取普通数组的迭代器
auto arr_begin = std::begin(arr);
auto arr_end = std::end(arr);
std::cout << "数组第一个元素: " << *arr_begin << std::endl; // 输出1
std::vector<int> vec = {10, 20, 30};
auto vec_begin = std::begin(vec);
auto vec_end = std::end(vec);
std::cout << "vector第一个元素: " << *vec_begin << std::endl; // 输出10
return 0;
}
函数特性对比
以下是上述迭代器操作函数的核心特性对比:
| 函数名 | 功能 | 支持的迭代器类型 | 是否修改原迭代器 | 最低C++版本 |
|---|---|---|---|---|
| advance | 移动迭代器指定距离 | 所有迭代器类型 | 是 | C++98 |
| next | 返回移动后的新迭代器 | 所有迭代器类型 | 否 | C++11 |
| prev | 返回向前移动后的新迭代器 | 双向及以上迭代器 | 否 | C++11 |
| distance | 计算两个迭代器的距离 | 所有迭代器类型 | 否 | C++98 |
| begin/end | 获取起始/尾后迭代器 | 支持begin/end的类型 | 否 | C++11 |
使用注意事项
- 使用
advance移动迭代器时,要确保移动后的迭代器在容器的有效范围内,否则会导致未定义行为。 prev函数不能用于前向迭代器和输入迭代器,因为这两类迭代器不支持向后移动。distance函数的第一个迭代器必须能够通过递增操作到达第二个迭代器,否则结果未定义。- 对于普通数组,
std::begin和std::end会自动计算数组的大小,不需要手动传入长度。
这些STL迭代器操作函数的核心价值在于泛型编程,当代码需要处理多种不同类型的容器时,使用这些通用函数可以避免针对每种容器编写不同的迭代器操作逻辑,提升代码的复用性。