本章到此为止,我们已经学习了所有的迭代器适配器。但我们并不止步于此,我们还可以对迭代器有更深的理解!从本节开始,我们将进入迭代器函数的学习。那什么是迭代器函数呢?对于这个疑惑,读者无需担心,因为迭代器函数就像普通函数一样有参数和返回值两个基本属性,它能使我们更好地操作函数。值得注意的是,迭代器函数需要包含<iterator>头文件才能使用。
迭代器函数并不多,就只有4个:advance()、distance()、prev()和next()四个。本节我们将进行advance()的详细学习。
| 函数 | 功能描述 |
|---|---|
advance(it, n) | 将迭代器向前或向后移动n个位置,直接修改原迭代器 |
distance(first, last) | 计算两个迭代器之间的距离,返回元素个数 |
next(it, n) | 返回迭代器后面第n个位置的迭代器,不修改原迭代器 |
prev(it, n) | 返回迭代器前面第n个位置的迭代器,不修改原迭代器 |
advance()迭代器函数无返回值,通过传入迭代器和指定参数直接对迭代器进行操作。不过,我们得根据容器的特性来进行使用!比如forward_list容器是前向迭代器,我们就不能使用advance(iterator , -1)。下面我们具体通过代码来操作吧!
#include<iostream>
#include<iterator>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
void test()
{
/*迭代器函数-advance()*/
map<string,string> mp{
{"Dotcpp","dotcpp.com"},
{"C语言教程","https://www.dotcpp.com/course/c/"},
{"计算机二级C语言","https://www.dotcpp.com/course/erjic/"},
{"数据结构教程","https://www.dotcpp.com/course/ds/"},
{"Linux命令","https://www.dotcpp.com/course/linuxcmd/"}
};//初始化列表
cout << "遍历map容器:\n";
for(map<string,string>::iterator it = mp.begin();it!=mp.end();++it)
{
cout <<"想要学习【" << it->first << "】可以访问【" <<it->second << "】\n";
}
cout << '\n';
map<string,string>::iterator posLinux= mp.begin();
cout << "假如我们需要学习“Linux命令”,我们可以通过advance(mp.begin(),+2)实现迭代器移动:\n" ;
/*不能使用mp.begin()作参数,因为mp.begin()是右值引用,而advance()的迭代器参数需要左值引用*/
advance(posLinux,2);
cout <<"想要学习【" << posLinux->first << "】可以访问【" <<posLinux->second << "】\n";
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

可以看到输出完全符合我们的指令!
总结:通过advance()我们能够对迭代器进行移动,但这要求我们掌握容器的特性,根据容器迭代器的性质进行移动操作。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程