高效STL—迭代器 & 算法

高效STL—迭代器 & 算法

         每个标准STL容器提供了四种不容的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。同时容器的insert和erase的某些形式只接受其中一种。

没有办法从const的迭代器转换为非const的迭代器,不能隐式转换也不能通过const_case转换。但是可以使用advance和distance来进行。

Advance(I,distance(I,ci));

//i是一个一般的iterator,ci是一个const_iterator

要得到与const_iterator指向同一位置的iterator,首先将iterator指向容器的起始位置,然后把它向前移到和const_iterator距离容器起始位置的偏移量一样的位置即可。这个任务得到了两个函数模板advance和distance的帮助,在<iterator>中声明。Distance返回两个指向同一容器的iterator之间的距离;advance则用于将一个iterator移动指定的距离。(在实际的调用中,可能需要显式的指明distance调用的模板参数类型,如何指定模板参数呢!)

 

对于reserve_iterator的成员函数可以产生“对应的”iterator。

要实现在一个reverse_iterator指出的位置上插入新元素,在ri.base()指向的位置插入就行了,对于insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。

         要实现在一个reverse_iteratorri指出的位置上删除元素,就应该删除ri.base()的前一个元素。对于删除操作而言,ri和ri.base()并不等价,而且ri.base()不是ri对应的iterator.

         同时要明白reserve_iterator的反向的迭代器,它的base()成员函数返回它右边的一个元素。

 

         从容器中删除一个元素,remove类似的算法,要想从一个容器中删除一个元素,只能调用它的成员函数,因为remove无法知道它正在操作的容器,所以remove不可能从一个容器中除去元素。所以从一个容器中remove元素不会改变容器中元素的个数。如果在容器中想删除元素,那么在调用remove后需要调用erase函数。

 

有的算法是需要有序区间的:

         不是所有算法可以用于任意区间,remove需要前向迭代器和可以通过这些迭代器赋值的能力。所以,它不能应用与由输入迭代器划分的区间,也不能是map或multimap。也不能是set和multiset的一些实现。很多排序算法需要随机访问迭代器,所以不可能在一个List的元素上调用这些算法。需要有序空间的一些算法有:

Binary_search lower_bound  upper_bound equal_range  set_union   set_intersection  set_diffence 

 

Mem_fun和mem_fun_ref,只要你传递一个成员函数给STL组件,你就必须使用它们。

 

尽量使用成员函数代替同名的算法

有些容器拥有和STL算法同名的成员函数。关联容器提供了count find lower_bound upper_bound equal_range,而List提供了remove  remove_if unique  sort merge reverse

 

List成员函数的行为和它们的算法兄弟的行为经常不相同。如果你想从容器中清除对象的话,调用remove remove_if unique算法后,必须紧接着调用erase函数,但List的removeremove_if和unique成员函数真的去掉了元素,后面不需要接着调用erase。在sort算法和list的sort成员函数间的一个重要区别是前者不能用于List.作为单纯的双向迭代器,List的迭代器不能传给sort算法。Merge算法和list的merge成员函数之间也同样存在巨大的差异。当在STL算法和同名的容器成员函数间进行选择时,你应该尽量使用成员函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值