std::next 是 C++ 标准库中的一个实用函数,用于从一个迭代器向前移动指定步数,并返回移动后的迭代器。它不会修改原始迭代器,而是返回一个新迭代器。
函数原型
// c++11后,c++17前
template< class ForwardIt >
ForwardIt next(ForwardIt it, typename std::iterator_traits<ForwardIt>::difference_type n = 1);
// c++17后
template< class InputIt >
constexpr
InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );
-
参数说明
- it:起始迭代器。
- n(可选):向前移动的步数,默认为 1。可以为正(向前移动)或零(当前位置),也可以为负值(适用于双向迭代器或随机访问迭代器)。
-
返回值:
- 返回移动
n
步后的新迭代器。如果n = 0
,返回与it
相同的迭代器。
- 返回移动
-
要求:
- std::next适用于 前向迭代器(Forward Iterator) 及更高级的迭代器类型(双向迭代器、随机访问迭代器)。
- 如果移动超出容器边界,行为未定义。
示例
向前移动(默认 1 步)
#include <iostream>
#include <vector>
#include <iterator> // std::next
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 获取起始迭代器
auto it = vec.begin();
// 使用 std::next 移动一步
auto next_it = std::next(it);
std::cout << "Current element: " << *it << std::endl; // 输出 10
std::cout << "Next element: " << *next_it << std::endl; // 输出 20
return 0;
}
移动多步
#include <iostream>
#include <vector>
#include <iterator> // std::next
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 获取起始迭代器
auto it = vec.begin();
// 使用 std::next 移动三步
auto third_it = std::next(it, 3);
std::cout << "Third element: " << *third_it << std::endl; // 输出 40
return 0;
}
与负值配合使用
std::next不支持负值,但可以使用 std::prev(反向移动)来实现类似的功能。
#include <iostream>
#include <list>
#include <iterator> // std::next, std::prev
int main() {
std::list<int> lst = {10, 20, 30, 40, 50};
// 获取终止迭代器
auto end_it = lst.end();
// 使用 std::prev 获取倒数第二个元素
auto second_last_it = std::prev(end_it, 2);
std::cout << "Second last element: " << *second_last_it << std::endl; // 输出 40
return 0;
}
总结
函数 | 功能 | 修改原始迭代器 | 返回新迭代器 |
---|---|---|---|
std::next | 将迭代器向前移动 n 步 | 否 | 是 |
std::prev | 将迭代器向后移动 n 步 | 否 | 是 |
std::advance | 将迭代器向前或向后移动 n 步 | 是 | 否 |
主要用途:
-
便捷获取目标位置的迭代器:无需手动调用迭代器的递增操作。
-
与算法配合使用:例如在
std::find
或std::for_each
等算法中定位迭代器。 -
安全性:不直接修改原始迭代器,提高代码的清晰度和可读性。