Bootstrap

c++ std::next总结

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::findstd::for_each 等算法中定位迭代器。

  • 安全性:不直接修改原始迭代器,提高代码的清晰度和可读性。

;