stl之remove()

来源:互联网 发布:北京学软件 编辑:程序博客网 时间:2024/06/16 11:48

1.stl 算法:算法通过迭代器对容器区间的数据元素进行操作。stl中算法包含在头文件<algorithm>中,都是全局函数通过迭代器可应用在任何stl容器中。在使用stl算法时,我们必须明白算法是一个函数,所以我们得明白(1)函数的功能(2)函数的参数(3)函数的返回值是什么(4)时间空间复杂度如何。

2.下面我们首先介绍下:manipulatingalgorithm(更改型算法)也就是说,这些算法会对容器区间中的数据元素进行删除和修改,重排的算法。这里以 移除性算法(Removing  algorithms)为例进行讲解。

(1)什么是 移除性算法(Removing Algorithms)?
移除性算法是指根据元素值或者某一准则,在一个区间内移除某些元素。但是移除性算法并不能改变元素的数量,它们只是逻辑上的思考,将原本至于后面的“不移除的元素”向前移动,覆盖那些被移除的元素。移除性算法都返回新区间的逻辑终点。我们知道,stl处理的区间都是半开区间,所以这里的逻辑终点是最后一个 “不移除元素”的下一位置。所以说,移除性算法并没有内存的分配与回收,只是逻辑上对容器进行了修改。

(2)stl中移除性算法有哪些?

(1)移除某序列的元素:remove(),remove_if()(2)复制时一并移除元素 remove_copy(), remove_copy_if()(3)移除连续重复元素 unique();


3.下面从(1)函数声明(2)函数功能(3)函数参数(4)返回值(5)时间复杂度 (6)使用时的注意事项一一进行说明

(1)remove()

 ForwardIterator remove ( ForwardIterator beg, ForwardIterator end, const T &value);这里的ForwardIterator 指的是前向迭代器。

(2)函数功能:remove()会移除区间[begin,end)(注意这里的区间时半开区间,也就是说包含begin,不包含end)中每一个“与value相等的”元素。remvove()会把原本置于后面的没有移除的元素向前移动,覆盖被移除的元素。而未被移除的元素在相对次序上保持不变。调用者在调用此算法后,逻辑起点还是原来的begin,而逻辑终点是返回的新逻辑终点,而不是原来的终点end


(3)参数:beg 是一个前向迭代器,指向了区间的起点,也就是算法操作的第一个数据元素,end是一个前向迭代器,标志着结束,也就是最后一个元素的下一个位置。value是一个数据元素,指明算法要移除的数据元素。


(4)返回值:函数返回一个前向迭代器,指向变动后的序列的新逻辑终点(也就是最后一个未被移除元素的下一位置)这里再强调一下:所有的算法操作的容器区间 都是半开区间,包括起点begin,不包括终点end


(5)复杂度:O(n)这里的n是区间的长度,也就是执行比较动作的元素的个数[begin,end)

(6)注意:(1)由于会发生元素的变动,所以remove不能用于关联式容器,关联式容器提供了功能相似的成员函数erase()容器list提供了一个等效的成员函数remove():不是重新赋值元素,而是重新安排指针的指向,因此对list容器来说成员函数remove()性能更佳。

3.remove移除deque中值为value的数据元素。

1.容器deque2.插入3.打印string4.移除remove5.打印

#include<iostream>#include<deque>#include<string>#include<algorithm>#include<iterator>using namespace std;int main(int argc , char **argv){deque<int> int_deque;//insert elements from 6 to 1 and 1 to 6for( int i = 1; i <=6 ; ++i){ int_deque.push_back(i);int_deque.push_front(i);}//print all elements of the collection by using ostream_iteratorcout<<"pre:";copy( int_deque.begin(), int_deque.end(), ostream_iterator<int>( cout ," ")  );cout<<endl;//remove all elements with value 3deque<int>::iterator new_end;//using for marking the new end of collenction logicllynew_end = remove( int_deque.begin(),int_deque.end(),3 );//print the results by using ostream_iteratorcout<<"post:";copy( int_deque.begin(), new_end, ostream_iterator<int>(cout," "));cout<< endl;   return 0;}

4.实验结果



0 0
原创粉丝点击