学科分类
目录
C++基础

迭代器辅助函数

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输出结果可知,两个元素交换成功。

关于迭代器的适辅助函数,用法都比较简单,读者可以不必知道其内部如何实现,只需要能在适当的时候使用即可。

点击此处
隐藏目录