C++ 中 std::next 与 std::advance 的区别

2025年3月22日 | 阅读4分钟

在本文中,我们将讨论 C++ 中 std::nextstd::advance 方法的区别。在讨论它们的区别之前,我们必须了解 std::next 和 std::advance 的语法、功能和示例。

C++ 中的 std::next 函数是什么?

<iterator> 头文件包含函数模板 std::next,它首次在 C++11 中引入。将提供的迭代器向前移动预定数量的位置会生成一个指向将要遇到的元素的迭代器。

语法

它具有以下语法:

参数

  • 'it': 指向初始位置的迭代器。
  • n: 要前进的位置数(默认为 1)。

功能

  • std::next 函数不会更改初始迭代器;相反,它会返回一个新迭代器。
  • 在这种情况下,在不更改输入迭代器的情况下获取特定偏移量的迭代器非常有用。

示例

让我们举一个例子来说明 C++ 中的 std::next 函数

输出

 
3   

说明

  1. 包含头文件
    这些行包含 C++ 标准库中向量、迭代器和输入/输出操作所需的头文件。
  2. 向量初始化
    在此行中,使用整数 1、2、3、4 和 5 初始化一个名为 vec 的向量
  3. 迭代器初始化
    此行初始化一个指向向量 vec 开头的迭代器。
  4. 使用 std::next 进行迭代器前进
    在此行中使用 std::next 方法将迭代器前进 2 个位置。一个名为 nextIt 的新迭代器包含结果。以下行指示向量中值为 3 的元素。

总之,代码演示了如何使用 std::next 将向量中的迭代器前进两个位置,然后输出新迭代器点处的值。程序的输出是 3,它代表向量中的第三个元素。

C++ 中的 std::advance 函数是什么?

一个名为 std::advance 的函数模板可以在 <iterator> 头文件中找到。通过将迭代器向前移动预定数量的位置来修改提供的迭代器。

语法

它具有以下语法:

参数

  • 'it': 指向初始位置的迭代器(通过引用传递)。
  • n: 要前进的位置数。

功能

  • std::advance 不返回新迭代器,而是更新初始迭代器。
  • 当我们希望更新正在使用的当前迭代器时,它很有用。

示例

让我们举一个例子来说明 C++ 中的 std::advance 函数。

输出

 
3   

说明

  1. 包含头文件
    这些行包含 C++ 标准库中向量、迭代器和输入/输出操作所需的头文件。
  2. 向量初始化
    在此行中,整数 1、2、3、4 和 5 在一个名为 vec 的向量中初始化。
  3. 迭代器初始化
    此行初始化一个指向向量 vec 开头的迭代器。
  4. 迭代器前进
    使用 std::advance 方法将迭代器前进两个位置。之后,它在此行之后指向值为 3 的向量元素。
  5. 输出
    此行将迭代器指向的值输出到标准输出。因为迭代器向前移动了两个位置,现在指向向量中的第三个元素,所以在此实例中它输出值 3。
  6. Return Statement (返回语句)
    此行表示主函数已完成,程序已向操作系统返回 0。

C++ 中 std::next 和 std::advance 的主要区别

Difference between std::next and std::advance in C++

std::next 和 std::advance 之间有几个主要区别。一些主要区别如下:

  1. 返回类型
    Std::next: std::next 返回一个指向前进位置的新迭代器。
    Std::advance: 它不返回任何内容;相反,它会就地更改当前迭代器。
  2. 用途
    Std::next: 在许多情况下,std::next 是生成新迭代器而不更改原始迭代器的更好选择。
    Std::advance: 对于对原始迭代器进行就地修改,std::advance 很有用。
  3. 默认参数
    Std::next: std::next 的第二个参数可以省略,默认值为 1。
    Std::advance: 必须指定 std::advance 要前进的位置数,并且没有默认值。
  4. 用例
    Std::next: 当我们想要获取新迭代器而不修改原始迭代器时,请使用 std::next。
    Std::advance: 当我们乐于修改原始迭代器时,请使用 std::advance。

结论

总之,根据特定的用例以及我们是否乐于更改当前迭代器,我们可以选择 std::next 和 std::advance,它们在不同情况下都很有用。