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. 迭代器辅助函数主要是为了给所有迭代器一些原本只有随机迭代器才有的能力,所以说随机迭代器的能力很强
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 致人轻伤跑了怎么办 轻伤对方要30万怎么办 老公用老婆的钱怎么办 想注册个公司要怎么办 域名续费不知道找谁怎么办 代收快递弄丢了怎么办 货到付款的快递人不在怎么办 快递送货上门人不在怎么办 ems快递签收人不在怎么办 快递被别人取了怎么办 怎么办快递宗和收发点 快递电话写错了怎么办 网上买沙发想退货怎么办 买的电脑想退货怎么办 买了衣服想退货怎么办 天猫买药审核通过后不要了怎么办 京东维修无发票怎么办 京东维修没有发票怎么办 苹果6s外音没了怎么办 苹果6splus开不了机怎么办 顺丰快递寄件填错收件人地址怎么办 收快递电话换了怎么办 顺丰快递没人收怎么办 网购东西没收到怎么办 中通快递没收到怎么办 快递员不给验货怎么办 顺丰验货不要了怎么办 闲鱼买家掉包了怎么办 闲鱼正在退款中怎么办 拒收货物卖家拒绝退款怎么办 货物没问题淘宝卖家拒收怎么办 头发稀少长的慢怎么办 没满16岁怎么办银行卡 网上买东西手机号填错了怎么办 买东西电话号码填错了怎么办 淘宝联盟扣54分怎么办 联盟被扣54分怎么办 ofo押金退了余额怎么办 网购还没收货就已签收怎么办 理财公司倒闭分公司法人怎么办 公司让离职不想走怎么办