經常會有這種情況,例如有幾個不同**的詞表,先後放入到乙個容器中(如vector中),要求去除容器中重複的詞條。通常就是兩步:1. 排序;2. 去除相鄰的重複節點。對於2,我從前都是用文字編輯器(ultraedit)去重,沒有用程式做過。現在寫了下,主要是理解unique函式。關鍵**如下:
// 1. sort the itemsunique函式幹了這樣一件事情:它將容器中的元素忽略掉重複的部分,將後面的元素copy到前面(就地操作),並返回修改後序列的last位置。時間複雜度是o(n)——只遍歷一遍;而且就地操作,沒有用額外儲存空間。看了下它的實現源**,如下:sort (itemvec.begin(), itemvec.end());
// 2. remove the duplicated items adjacent
itemvec.erase (unique (itemvec.begin(), itemvec.end()), itemvec.end());
templateinline上面**中_first是當前的指標,_firstb是指前乙個指標,b表示before。有意思的是,上面有兩個巢狀的for迴圈,不過細細分析,應該是只遍歷一次。還有比較費心思的地方是各種「++」的使用,即在什麼時候移動指標。真是寫庫函式啊,能省一行是一行;不過犧牲了點可讀性。_fwdit _unique(_fwdit _first, _fwdit _last)
return (_last);}
像以往一樣,還是要實地測試一下。測試函式讀取的檔案如下:
abc其中有兩處重複,分別是「aa」和「ab」。測試**如下:aa
ab
saaa
feasf
ab
azdesf
bool rmdupitemtxt (const char* sfilein, const char* sfileout)最後產生的結果檔案如下:// load the content
vectoritemvec;
string sitem;
while (in >> sitem)
itemvec.push_back (sitem);
// sort and remove the duplicated items
sort (itemvec.begin(), itemvec.end());
itemvec.erase (unique (itemvec.begin(), itemvec.end()), itemvec.end());
// dump it into txt file
copy (itemvec.begin(), itemvec.end(), ostream_iterator(out, "\n"));
return true;}
aa可以看到結果正確。ababc
asfaz
defe
sasf
ArrayList容器 去除重複元素
需求 1.將自定義物件作為元素存到arraylist集合中,並去除重複元素 比如存人的物件,同姓名同年齡,視為同乙個人,為重複元素 思路 1.對人建立乙個類,將資料封裝進建立的人物件裡 2.定義容器,存入容器裡 3.遍歷,查重,取出 list 集合判斷元素是否相同contains,用equals 而...
List去除重複的元素
有兩種方法,一種是去重不帶順序的,一種是去重帶順序的。方法1 無順序 hastset根據hashcode判斷是否重複,資料不會重複 public static listdeleteduplicate listlist 方法2 帶順序 通過hashset的add方法判斷是否已經新增過相同的資料,如果已...
Python 去除列表中重複的元素
比較容易記憶的是用內建的 setl1 b c d b c a a l2 list set l1 print l2 還有一種據說速度更快的,沒測試過兩者的速度差別 l1 b c d b c a a l2 fromkeys l1 keys print l2 這兩種都有個缺點,祛除重複元素後排序變了 a ...