STL为迭代器提供了三个辅助函数:advance(),distance()和iter_swap()。前二者提供给所有迭代器一些原本只有随机迭代器才有的能力:前进或后退多个元素,及处理迭代器之间的距离。最后一个允许你交换两个迭代器的值
advance()可使迭代器前进
声明如下
#include <iterator>
void advance(InputIterator& pos, Dist n)
- 使名为pos的input迭代器步进(或步退)n个元素
- 对双向迭代器和随机迭代器而言,n可为负值,表示后退
- Dist是个template型别,通常会是个整数型别,因为会调用诸如<,++,–等操作,还要和0比较
- advance()不检查迭代器是否超过序列的end(),所以调用此函数可能发生未定义行为
- 此函数总能根据迭代器类型采用最佳方案,这归于迭代器特征(或称为技法)(iterator traits)的运用;面对随机迭代器,此函数只是简单地调用pos+=n,面对其他任何型别的迭代器则调用++pos(或–pos)n次,因此本函数具有线性复杂度
看一个实例
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
using namespace std;
int main(void)
{
list<int> col;
for (int i=1; i<=9; ++i)
col.push_back(i);
list<int>::iterator pos = col.begin();
cout << *pos << endl; //1
//pos += 3; 这就会出错,因为双向迭代器不具有这个功能
advance(pos,3);
cout << *pos << endl; //4
advance(pos,-1);
cout << *pos << endl; //3
return 0;
}
distance()可处理迭代器之间的距离
声明
#include <iterator>
Dist distance(InputIterator pos1, InputIterator pos2)
- 传回两个inpud迭代器pos1和pos2的距离
- 两个迭代器都必须指向同一容器
- 如果不是随机迭代器,pos2的位置必须在pos1的后面或相同
- 返回值Dist的型别由迭代器决定:iterator_traits::difference_type
实例如下
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
using namespace std;
int main(void)
{
list<int> col;
for (int i=-3; i<=9; ++i)
col.push_back(i);
list<int>::iterator pos;
pos = find(col.begin(),col.end(),5);
if (pos != col.end())
{
cout << "differnece between begin and 5: "
<< distance(col.begin(),pos) << endl; // 8
}
else
cout << "5 not found" << endl;
return 0;
}
iter_swap()可交换两个迭代器所指内容
#include <iterator>
void iter_swap(ForwardIterator pos1, ForwardIterator pos2)
- 交换pos1和pos2所指的值
- 迭代器类型不必相同??,但是所指的值必须能够相互赋值
例子
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
using namespace std;
template<typename T>
inline void PRINT_ELEMENTS(const T& col, const char* str=" ")
{
typename T::const_iterator pos;
cout << str;
for (pos=col.begin(); pos!=col.end(); ++pos)
cout << *pos << ' ';
cout << endl;
}
int main(void)
{
list<int> col;
for (int i=1; i<=9; ++i)
col.push_back(i);
PRINT_ELEMENTS(col); // 1 2 3 4 5 6 7 8 9
iter_swap(col.begin(),++col.begin());
PRINT_ELEMENTS(col);// 2 1 3 4 5 6 7 8 9
iter_swap(col.begin(),--col.end());
PRINT_ELEMENTS(col);// 9 1 3 4 5 6 7 8 2
return 0;
}
总结
- 迭代器辅助函数主要是为了给所有迭代器一些原本只有随机迭代器才有的能力,所以说随机迭代器的能力很强