stl之remove()

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 6
	for( 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_iterator
	cout<<"pre:";
	copy( int_deque.begin(), int_deque.end(), ostream_iterator<int>( cout ," ")  );
	cout<<endl;

	//remove all elements with value 3
	deque<int>::iterator new_end;//using for marking the new end of collenction logiclly
	new_end = remove( int_deque.begin(),int_deque.end(),3 );

	//print the results by using ostream_iterator
	cout<<"post:";
	copy( int_deque.begin(), new_end, ostream_iterator<int>(cout," "));
	cout<< endl;





   return 0;

}

4.實驗結果



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章