std vector刪除重複元素和查詢

2021-06-12 16:21:32 字數 3021 閱讀 6563

原文**:

需要這樣乙個容器,可以自動地刪除重複元素,並能很方便地進行查詢操作!

似乎採用樹型結構儲存的std::set是最佳之選,但到後面才發現,存進去容易,取出來麻煩。不得已又回去用std::vector,就在網上找了找,vector是如何實現類似set的unique和find的。其實也沒有想象的複雜,也不需要死去套迴圈~

vector刪除重複元素

主要思路為,先排序,再唯一,然後刪除最後面的那段重複**。

舉例:有這樣乙個vector

int a[10] = ;  // 1,2,3,3,4,4,6,7,8,9

vectorivec(a, a+10);

①首先將vector排序

sort( vecsrc.begin(), vecsrc.end() ); // 1,2,3,3,4,4,6,7,8,9    

②然後使用unique演算法,unique返回值是重複元素的開始位置。

vector::iter pos;

pos = unique(ivec.begin, ivec.end());  //1,2,3,4,6,7,8,9,3,4

//            ^

③最後刪除後面的那段重複部分

earse(pos, ivec.end());     //1,2,3,4,6,7,8,9              

如果vector中儲存的元素是自定義的結構或者是類,那麼就需要過載操作符。根據類的某乙個成員變數排序或者比較。

sort演算法需要過載"<"操作符。unique演算法需要過載"=="操作符。

操作符過載的示例如下:

class ctest

……public:

bool operator<( const ctest& ocompany ) const

bool operator==( const cecompany& ocompany ) const

}另外一種方法是使用unique_copy

example

// unique_copy example

#include

#include

#include

using namespace std;

bool myfunction (int i, int j)

int main () ;

vectormyvector (9);                            // 0  0  0  0  0  0  0  0  0

vector::iterator it;

// using default comparison:

it=unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0

//                ^

sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0

//                ^

// using predicate comparison:

it=unique_copy (myvector.begin(), it, myvector.begin(), myfunction);

// 10 20 30 20 30 0  0  0  0

//          ^

myvector.resize( it - myvector.begin() );            // 10 20 30

// print out content:

cout << "myvector contains:";

for (it=myvector.begin(); it!=myvector.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}output:

myvector contains: 10 20 30

vector元素查詢

如果vector的元素是乙個簡單的型別如int時,   

可按下面方法查詢元素:   

vectorx;   

x.push_back(33);   

x.push_back(532);   

x.push_back(222);   

vector::iterator   iter;   

iter = find(x.begin(), x.end(),  532);

但如果是乙個類時,如何查詢呢? 

方法1:

過載operator(),也就是用functor(物件)

#include

#include

#include

#include

using   namespace   std;   

class a   

~a() {};   

};   

class a_id_equ :public unary_function

bool operator ()(const a& e)   

}; int main()   

方法2:

順便提醒大家一下,這種小動作最好不要動輒使用functor。functor會導致**物理分離,可維護性不佳,不然c#3.0幹嘛屁顛屁顛地加入lambda運算元和匿名函式呢;-)好在c++不要語言級別支援也可以很大程度上實現同樣的功能,只需使用boost::bind   boost::lambda等functional庫即可。話說回來,使用lambda這樣的類一旦走火,後果不堪設想,你會看到排山倒海的錯誤資訊,所以甚用,不過boost::bind還是不錯的,況且已經加入tr1,可以放心大膽用,有標準給你撐腰;-)

--pongba(劉未鵬|

#include  

#include  

#include  

struct a   

;   

int main()   

鍊錶刪除重複元素1,刪除重複元素2,

刪除排序鍊錶中的重複元素 給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。示例 1 輸入 1 1 2 輸出 1 2 示例 2 輸入 1 1 2 3 3 輸出 1 2 3 思路 很簡單。先將兩個指標進行操作,start,end然後判斷end是否等於空即可 definition for s...

STL vector刪除重複元素

stl提供了很多實用的演算法,這裡主要講解sort和unique演算法。刪除重複元素,首先將vector排序。sort vecsrc.begin vecsrc.end 然後使用unique演算法。vecsrc.erase unique vecsrc.begin vecsrc.end vecsrc.e...

STL vector刪除重複元素

stl提供了很多實用的演算法,這裡主要講解sort和unique演算法。刪除重複元素,首先將vector排序。sort vecsrc.begin vecsrc.end 然後使用unique演算法。vecsrc.erase unique vecsrc.begin vecsrc.end vecsrc.e...