迭代器辅助函数
STL为迭代器提供了三个辅助函数:advance()、distance()、iter_swap()。前两个函数为迭代器提供前进和后退的能力,而第三个函数iter_swap()可以交换两个迭代器的数据。接下来我们分别来学习这三个函数。
1、advance()函数
advance()函数可使相关的迭代器前进或后退,增加的速度由参数决定,其函数原型如下所示:
template<typename InputIterator, typename Distance>
void advance(InputIterator& iter, Distance d);
该函数的功能是使迭代器iter移动d个元素,d为正数则表示前进,d为负数则表示后退。它为迭代器提供了原本只有随机访问迭代器才具有的访问能力。
但advance()也有局限性:
(1)非随机访问迭代器执行advance()函数移动迭代器,其执行性能并不佳。
(2)advance()在执行时不检查是否超过序列end(),如果迭代器已经超过序列有效范围,就会导致操作出错。
2、distance()函数
disatance()函数用于处理两个迭代器之间的距离,使用该函数需要包含<iterator>头文件,函数原型如下所示:
template<typename InputIterator >
usigned distance(InputIterator first, InputIterator last);
参数first与last分别表示两个迭代器位置,返回值为这两个迭代器之间的距离,需要注意的是,[first, last)必须是一个有效的区间。
3、iter_swap()函数
iter_swap()函数用于交换两个迭代器的元素值,其函数原型如下所示:
template<typename InputIterator1, typename InputIterator2>
void iter_swap(InputIterator1 first, InputIterator2 second);
该函数的功能是交换迭代器first与second所指向的值,迭代器类型不一定相同,但所指向的两个元素必须可以相互赋值。
为了加深读者的理解,接下来我们通过一个案例来讲解这三个函数的用法,具体如例1所示。
例1
1 #include <iostream>
2 #include <list>
3 #include <algorithm>
4 #include <functional>
5 #include <iterator>
6 #include <numeric>
7 using namespace std;
8 int main()
9 {
10 char str[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
11 list<char> lt;
12 lt.assign(str, str + sizeof(str)/sizeof(char));
13 copy(lt.begin(), lt.end(), ostream_iterator<char>(cout, " "));
14 cout << endl;
15
16 list<char>::iterator it = lt.begin();
17 advance(it, 5); //将迭代器向下移动5个单位
18 cout << "将迭代器向下移动5个单位后,指向的元素为:"<<*it << endl;
19 cout << "the distance between begin and f is: " << distance(lt.begin(), it)
20 << endl;
21 iter_swap(lt.begin(), it); //交换两个位置的元素
22 cout << "交换两个位置的元素之后:";
23 copy(lt.begin(), lt.end(), ostream_iterator<char>(cout, " "));
24 cout << endl;
25
26 system("pause");
27 return 0;
28 }
运行结果如图1所示。
图1 例1运行结果
在例1中,第10-11行代码分别定义了一个char类型数组和一个list<char>类型的容器lt,第12行代码调用assign()算法将数组中元素赋值给容器lt。第16行代码定义一个list<char>类型迭代器it指向开头位置,代码第17行调用advance()将it下移5个单位,由图8-21可知,移动之后,迭代器it指向了元素f;第19-20行代码调用distance()函数计算出it距离容器开头距离为5;第21行代码调用iter_swap()函数将it与容器开头的元素交换,由图8-21输出结果可知,两个元素交换成功。
关于迭代器的适辅助函数,用法都比较简单,读者可以不必知道其内部如何实现,只需要能在适当的时候使用即可。