需要這樣乙個容器,可以自動地刪除重複元素,並能很方便地進行查詢操作!
似乎採用樹型結構儲存的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...