vector刪除元素和查詢

2021-07-09 13:31:01 字數 3008 閱讀 9868

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

似乎採用樹型結構儲存的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()   

Vector容器刪除元素

使用vector容器也有一段時間了,但是對於他的刪除操作還是有點疑問,今天就總結一下。vector資料儲存是一段預先分配好大小的記憶體連續的空間,插入資料和刪除資料都會引起後面資料記憶體的整體移動。今天就說說刪除操作吧 1 刪除最後的元素 直接使用pop back 就可以了,這個沒什麼好說的 2 刪...

vector 之刪除元素

刪除指定位置的元素 刪除vector中第5個位置的元素 1 vector vec 執行vector初始化操作 2 vector iterator iter vec.begin 5 獲取第五個元素的iterator 3 vec.erase iter 刪除第五個元素 刪除重複元素 刪除vector中的重...

vector呼叫erase刪除元素

for std vector iterator iter g vecdownloadinfos.begin iter g vecdownloadinfos.end else pop back 只刪除最後乙個元素,而erase可以刪掉乙個由iterator指出的元素,也可刪掉乙個範圍的元素 remov...