当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/405927.html

相关文章:

  • Mongo数据库 --- Mongo Pipeline
  • Servlet细节
  • 24.11.26 Mybatis2
  • PostgreSQL 中约束Constraints
  • Apache Maven 标准文件目录布局
  • 虚拟局域网PPTP配置与验证(二)
  • 实际开发中的协变与逆变案例:数据处理流水线
  • 12 —— Webpack中向前端注入环境变量
  • 【机器学习】——朴素贝叶斯模型
  • Leetcode128. 最长连续序列(HOT100)
  • Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析
  • ArcMap 处理栅格数据的分辨率功能操作
  • 利用D3.js实现数据可视化的简单示例
  • 实现了两种不同的图像处理和物体检测方法
  • 2411rust,实现特征
  • 云计算面试题之六.运维架构篇
  • Java爬虫淘宝详情接口深度解析
  • C# .NET环境下调用ONNX格式YOLOV8模型问题总结
  • 【山大909算法题】2014-T1
  • golang面试题
  • 【YOLOv11改进[Conv]】引入GSConv和VoVGSCSPC模块 + 模型轻量化和保持精度
  • 【数据结构】链表(leetcode)
  • 11.22糖丸比赛题解
  • H.265流媒体播放器EasyPlayer.js网页全终端安防视频流媒体播放器可以播放本地视频吗
  • Linux空口抓包方法
  • 数字图像处理(2):Verilog基础语法