STL与泛型编程<九>:迭代器相关辅助函数
来源:互联网 发布:差分方程matlab编程 编辑:程序博客网 时间:2024/05/16 18:05
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;}
总结
- 迭代器辅助函数主要是为了给所有迭代器一些原本只有随机迭代器才有的能力,所以说随机迭代器的能力很强
1 0
- STL与泛型编程<九>:迭代器相关辅助函数
- C++ STL一一迭代器相关辅助函数(advance()、distance()、iter_swap())
- STL迭代器之辅助迭代器函数
- STL vector 辅助函数
- 泛型编程与STL(二):函数对象
- STL与泛型编程<十四>:仿函数介绍
- 【C++ STL应用与实现】17: 如何使用迭代器辅助函数
- 二 迭代器(二)相关辅助函数
- 2.套接口编程相关的辅助函数
- 九、 通用工具 ----辅助函数
- 泛型编程与STL
- 泛型编程与STL
- STL与泛型编程
- STL与泛型编程
- 泛型编程与STL
- 《泛型编程与stl》
- 泛型编程与STL
- STL与泛型编程<十五>:预定义的仿函数和仿函数适配器
- 多线程之NSOperation
- Android M上VideoCall中Audio的管理(2016.05.27 新增CallsManager部分)
- android 获得当前进程的名字
- POJ 3280 Cheapest Palindrome(区间DP)
- EL表达式截取字符串
- STL与泛型编程<九>:迭代器相关辅助函数
- spring3 struts2 利用aop在actioin层捕获异常
- PHP为什么慢?
- Cannot delete or update a parent row
- HDU 3177 Crixalis's Equipment(很巧妙的贪心)
- Xcode项目依赖
- An unexpected error prevented the server from fulfilling your request. (HTTP 500)
- Gallery的整体架构
- Android ORM应用开发框架KJFrameForAndroid使用详解