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 个 ++ 或者 -- 操作实现的。

本文作者原创,转载请附上文章出处与本文链接。

C++ STL advance()函数(深入了解,一文学会)目录

1 advance()函数成员函数

2 advance()函数示例

2.1 forward_list 容器

2.2 vector 容器


1 advance()函数成员函数

迭代器辅助函数 功能
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 最少为前向迭代器。

2 advance()函数示例

2.1 forward_list 容器

forward_list 容器(仅支持使用前向迭代器)为例,下面程序演示了 advance() 函数的功能:

#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <forward_list>
using namespace std;//创建一个 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;

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

2.2 vector 容器

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

#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <vector>
using namespace std;//创建一个 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;

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

以下博客部分内容借鉴自:http://c.biancheng.net/stl/。

C++ STL 容器、迭代器、适配器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/120052137                                                                                C++ STL deque容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会)               https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会)                        https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会)                           https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会)                    https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会)           https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会)       https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会)                https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)   https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)      https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会)                  https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008481

C++ STL advance()函数(深入了解,一文学会)相关推荐

  1. stl vector 函数_在C ++ STL中使用vector :: begin()和vector :: end()函数打印矢量的所有元素...

    stl vector 函数 打印向量的所有元素 (Printing all elements of a vector) To print all elements of a vector, we ca ...

  2. stl vector 函数_vector :: at()函数以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: at()函数 (C++ vector::at() function) vector::at() is a library function o ...

  3. stl swap函数_vector :: swap()函数以及C ++ STL中的示例

    stl swap函数 C ++ vector :: swap()函数 (C++ vector::swap() function) vector::swap() is a library functio ...

  4. stl vector 函数_vector :: crend()函数以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: crend()函数 (C++ vector::crend() function) vector::crend() is a library f ...

  5. stl vector 函数_vector :: pop_back()函数以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: pop_back()函数 (C++ vector::pop_back() function) vector::pop_back() is a ...

  6. stl vector 函数_vector :: push_back()函数,以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: push_back()函数 (C++ vector::push_back() function) vector::push_back() is ...

  7. stl min函数_std :: min()函数以及C ++ STL中的示例

    stl min函数 C ++ STL std :: min()函数 (C++ STL std::min() function) min() function is a library function ...

  8. stl vector 函数_vector :: back()函数以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: back()函数 (C++ vector::back() function) vector::back() is a library func ...

  9. stl vector 函数_vector :: clear()函数,以及C ++ STL中的示例

    stl vector 函数 C ++ vector :: clear()函数 (C++ vector::clear() function) vector::clear() is a library f ...

最新文章

  1. TI IPNC Web网页之网页修改教程
  2. 利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
  3. 思科“万物互联”路线下一站:连接分析
  4. Javascript 事件propagation机制
  5. pip 删除安装包_Python中PIP的快速指南
  6. 计算机控制的点火系统由,第八节(点火系统)
  7. Office2003与Office2007默认打开方式的切换
  8. 滑盖、双屏手机降价至冰点,为何仍无人问津?
  9. 文件目录在Visual C++ 2005中使用 GNU Scientific Library
  10. 文献阅读-一种基于机器学习方法的海事监视雷达海杂波抑制方法
  11. 用HTML绘制三线表,CSS制作三线表 | 学步园
  12. OMNeT 例程 Tictoc12 学习笔记
  13. 计算机台式内存条,台式电脑怎么装内存条_台式电脑加装内存条方法-win7之家
  14. 11讲项目实战首页右侧悬浮框及内页面包屑导航
  15. 时间序列(ARIMA)模型
  16. 武汉大学计算机学院宿舍楼名称,武汉大学寝室排名 寝室图片
  17. 时序违例的原因及其解决办法
  18. 如何在阿里云物联网平台新增一个设备
  19. 【map】高德地图点聚合—按索引聚合
  20. cdh 简介_CDH的介绍和部署

热门文章

  1. Vue中Vuex的五个属性和基本用法
  2. 分形之康托(Cantor)三分集
  3. “文人相轻”:论初创团队倾轧问题
  4. DL之CNN优化技术:卷积神经网络算法简介之特有的优化技术及其代码实现——im2col技术等技术
  5. SQL SERVER高级知识梳理一:语法,函数,系统表笔记
  6. 标梵带你了解你不知道的js
  7. 零基础Bootstrap入门教程(9)--使用表单控件
  8. 2015年用户体验的7大预测
  9. 程序员如何装逼看完最后一条我也是醉了
  10. 今天看到的最贴心的话:)