C++ STL 中的 advance() 函数如何实现迭代器向前移动至指定位置,其用法详解是什么?

2026-04-17 01:031阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1516个文字,预计阅读时间需要7分钟。

C++ STL 中的 advance() 函数如何实现迭代器向前移动至指定位置,其用法详解是什么?

通过前面的学习,已经讲解了C++ STL标准库中所有基本迭代器以及迭代器适配器的用法。除此之外,为了方便用户操作这些迭代器,C++ STL标准库还提供了一些辅助函数,例如:

- `begin()` 和 `end()`:用于获取容器中元素范围的迭代器。- `front()` 和 `back()`:分别用于获取序列容器的第一个和最后一个元素。- `empty()`:检查容器是否为空。- `size()`:返回容器中元素的数量。- `max_size()`:返回容器能容纳的最大元素数量。

例如,使用 `begin()` 和 `end()` 函数可以轻松遍历一个容器:

cppvector vec={1, 2, 3, 4, 5};for (auto it=begin(vec); it !=end(vec); ++it) { cout << *it << ;}

C++ STL 中的 advance() 函数如何实现迭代器向前移动至指定位置,其用法详解是什么?

这样,用户就可以更加方便地使用C++ STL中的迭代器了。

通过前面的学习,已经讲解了 C++ STL 标准库中所有的基础迭代器以及迭代器适配器的用法。但除此之外,为了方便用户操作这些迭代器,C++ STL 标准库中还提供有一些辅助函数,如表 1 所示。

表 1 C++ STL迭代器辅助函数 迭代器辅助函数 功能 advance(it, n) it 表示某个迭代器,n 为整数。该函数的功能是将 it 迭代器前进或后退 n 个位置。 distance(first, last) first 和 last 都是迭代器,该函数的功能是计算 first 和 last 之间的距离。 begin(cont) cont 表示某个容器,该函数可以返回一个指向 cont 容器中第一个元素的迭代器。 end(cont) cont 表示某个容器,该函数可以返回一个指向 cont 容器中最后一个元素之后位置的迭代器。 prev(it) it 为指定的迭代器,该函数默认可以返回一个指向上一个位置处的迭代器。注意,it 至少为双向迭代器。 next(it) it 为指定的迭代器,该函数默认可以返回一个指向下一个位置处的迭代器。注意,it 最少为前向迭代器。
本节先讲解 advance() 函数,其他函数后续章节会做详细介绍。

C++ STL advance()函数

advance() 函数用于将迭代器前进(或者后退)指定长度的距离,其语法格式如下:

template <class InputIterator, class Distance>
void advance (InputIterator& it, Distance n);

其中 it 指的是目标迭代器,n 通常为一个整数。

需要注意的是,如果 it 为输入迭代器或者前向迭代器,则 n 必须为一个正数,即表示将 it 右移(前进) n 个位置;反之,如果 it 为双向迭代器或者随机访问迭代器,则 n 为正数时表示将 it 右移(前进) n 个位置,n 为负数时表示将 it 左移(后退) n 个位置。

另外,根据 it 类型是否为随机访问迭代器,advance() 函数底层采用了不同的实现机制:
  • 当 it 为随机访问迭代器时,由于该类型迭代器支持 p+n 或者 p-n(其中 p 就是一个随机访问迭代器)运算,advance() 函数底层采用的就是 it+n 操作实现的;
  • 当 it 为其他类型迭代器时,它们仅支持进行 ++ 或者 -- 运算,这种情况下,advance() 函数底层是通过重复执行 n 个 ++ 或者 -- 操作实现的。

值得一提的是,advance() 函数定义在<iterator>头文件,并位于 std 命名空间中。因此,程序在使用该函数之前,应包含如下 2 行代码:

#include <iterator> using namespace std;

第二行代码不是必须的,但如果不引用,则后续在使用 advance() 函数时,需要额外标注 std 命名空间(强烈建议初学者使用)。


为了让读者更好地知晓 advance() 函数的功能,首先以 forward_list 容器(仅支持使用前向迭代器)为例,下面程序演示了 advance() 函数的功能:

#include <iostream> // std::cout #include <iterator> // std::advance #include <forward_list> using namespace std; int main() { //创建一个 forward_list 容器 forward_list<int> mylist{1,2,3,4}; //it为前向迭代器,其指向 mylist 容器中第一个元素 forward_list<int>::iterator it = mylist.begin(); //借助 advance() 函数将 it 迭代器前进 2 个位置 advance(it, 2); cout << "*it = " << *it; return 0; } 程序执行结果为:

*it = 3

此程序中,由于 it 为前向迭代器,其只能进行 ++ 操作,即只能前进(右移),所以 advance() 函数的第 2 个参数只能为正数。

下面程序以 vector 容器为例,演示了 advance() 函数的功能:

#include <iostream> // std::cout #include <iterator> // std::advance #include <vector> using namespace std; int main() { //创建一个 vector 容器 vector<int> myvector{1,2,3,4}; //it为随机访问迭代器,其指向 myvector 容器中第一个元素 vector<int>::iterator it = myvector.begin(); //借助 advance() 函数将 it 迭代器前进 2 个位置 advance(it, 2); cout << "1、*it = " << *it << endl; //继续使用it,其指向 myvector 容器中最后一个元素之后的位置 it = myvector.end(); //借助 advance() 函数将 it 迭代器后退 3 个位置 advance(it, -3); cout << "2、*it = " << *it; return 0; } 程序执行结果为:

1、*it = 3
2、*it = 2

注意,advance() 函数本身不会检测 it 迭代器移动 n 个位置的可行性,如果 it 迭代器的移动位置超出了合理范围,it 迭代器的指向将无法保证,此时使用 *it 将会导致程序崩溃。

本文共计1516个文字,预计阅读时间需要7分钟。

C++ STL 中的 advance() 函数如何实现迭代器向前移动至指定位置,其用法详解是什么?

通过前面的学习,已经讲解了C++ STL标准库中所有基本迭代器以及迭代器适配器的用法。除此之外,为了方便用户操作这些迭代器,C++ STL标准库还提供了一些辅助函数,例如:

- `begin()` 和 `end()`:用于获取容器中元素范围的迭代器。- `front()` 和 `back()`:分别用于获取序列容器的第一个和最后一个元素。- `empty()`:检查容器是否为空。- `size()`:返回容器中元素的数量。- `max_size()`:返回容器能容纳的最大元素数量。

例如,使用 `begin()` 和 `end()` 函数可以轻松遍历一个容器:

cppvector vec={1, 2, 3, 4, 5};for (auto it=begin(vec); it !=end(vec); ++it) { cout << *it << ;}

C++ STL 中的 advance() 函数如何实现迭代器向前移动至指定位置,其用法详解是什么?

这样,用户就可以更加方便地使用C++ STL中的迭代器了。

通过前面的学习,已经讲解了 C++ STL 标准库中所有的基础迭代器以及迭代器适配器的用法。但除此之外,为了方便用户操作这些迭代器,C++ STL 标准库中还提供有一些辅助函数,如表 1 所示。

表 1 C++ STL迭代器辅助函数 迭代器辅助函数 功能 advance(it, n) it 表示某个迭代器,n 为整数。该函数的功能是将 it 迭代器前进或后退 n 个位置。 distance(first, last) first 和 last 都是迭代器,该函数的功能是计算 first 和 last 之间的距离。 begin(cont) cont 表示某个容器,该函数可以返回一个指向 cont 容器中第一个元素的迭代器。 end(cont) cont 表示某个容器,该函数可以返回一个指向 cont 容器中最后一个元素之后位置的迭代器。 prev(it) it 为指定的迭代器,该函数默认可以返回一个指向上一个位置处的迭代器。注意,it 至少为双向迭代器。 next(it) it 为指定的迭代器,该函数默认可以返回一个指向下一个位置处的迭代器。注意,it 最少为前向迭代器。
本节先讲解 advance() 函数,其他函数后续章节会做详细介绍。

C++ STL advance()函数

advance() 函数用于将迭代器前进(或者后退)指定长度的距离,其语法格式如下:

template <class InputIterator, class Distance>
void advance (InputIterator& it, Distance n);

其中 it 指的是目标迭代器,n 通常为一个整数。

需要注意的是,如果 it 为输入迭代器或者前向迭代器,则 n 必须为一个正数,即表示将 it 右移(前进) n 个位置;反之,如果 it 为双向迭代器或者随机访问迭代器,则 n 为正数时表示将 it 右移(前进) n 个位置,n 为负数时表示将 it 左移(后退) n 个位置。

另外,根据 it 类型是否为随机访问迭代器,advance() 函数底层采用了不同的实现机制:
  • 当 it 为随机访问迭代器时,由于该类型迭代器支持 p+n 或者 p-n(其中 p 就是一个随机访问迭代器)运算,advance() 函数底层采用的就是 it+n 操作实现的;
  • 当 it 为其他类型迭代器时,它们仅支持进行 ++ 或者 -- 运算,这种情况下,advance() 函数底层是通过重复执行 n 个 ++ 或者 -- 操作实现的。

值得一提的是,advance() 函数定义在<iterator>头文件,并位于 std 命名空间中。因此,程序在使用该函数之前,应包含如下 2 行代码:

#include <iterator> using namespace std;

第二行代码不是必须的,但如果不引用,则后续在使用 advance() 函数时,需要额外标注 std 命名空间(强烈建议初学者使用)。


为了让读者更好地知晓 advance() 函数的功能,首先以 forward_list 容器(仅支持使用前向迭代器)为例,下面程序演示了 advance() 函数的功能:

#include <iostream> // std::cout #include <iterator> // std::advance #include <forward_list> using namespace std; int main() { //创建一个 forward_list 容器 forward_list<int> mylist{1,2,3,4}; //it为前向迭代器,其指向 mylist 容器中第一个元素 forward_list<int>::iterator it = mylist.begin(); //借助 advance() 函数将 it 迭代器前进 2 个位置 advance(it, 2); cout << "*it = " << *it; return 0; } 程序执行结果为:

*it = 3

此程序中,由于 it 为前向迭代器,其只能进行 ++ 操作,即只能前进(右移),所以 advance() 函数的第 2 个参数只能为正数。

下面程序以 vector 容器为例,演示了 advance() 函数的功能:

#include <iostream> // std::cout #include <iterator> // std::advance #include <vector> using namespace std; int main() { //创建一个 vector 容器 vector<int> myvector{1,2,3,4}; //it为随机访问迭代器,其指向 myvector 容器中第一个元素 vector<int>::iterator it = myvector.begin(); //借助 advance() 函数将 it 迭代器前进 2 个位置 advance(it, 2); cout << "1、*it = " << *it << endl; //继续使用it,其指向 myvector 容器中最后一个元素之后的位置 it = myvector.end(); //借助 advance() 函数将 it 迭代器后退 3 个位置 advance(it, -3); cout << "2、*it = " << *it; return 0; } 程序执行结果为:

1、*it = 3
2、*it = 2

注意,advance() 函数本身不会检测 it 迭代器移动 n 个位置的可行性,如果 it 迭代器的移动位置超出了合理范围,it 迭代器的指向将无法保证,此时使用 *it 将会导致程序崩溃。