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.實驗結果