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