Q A stl容器去除重複的元素

2021-09-30 15:15:15 字數 1687 閱讀 2926

經常會有這種情況,例如有幾個不同**的詞表,先後放入到乙個容器中(如vector中),要求去除容器中重複的詞條。通常就是兩步:1. 排序;2. 去除相鄰的重複節點。對於2,我從前都是用文字編輯器(ultraedit)去重,沒有用程式做過。現在寫了下,主要是理解unique函式。關鍵**如下:

// 1. sort the items

sort (itemvec.begin(), itemvec.end());

// 2. remove the duplicated items adjacent

itemvec.erase (unique (itemvec.begin(), itemvec.end()), itemvec.end());

unique函式幹了這樣一件事情:它將容器中的元素忽略掉重複的部分,將後面的元素copy到前面(就地操作),並返回修改後序列的last位置。時間複雜度是o(n)——只遍歷一遍;而且就地操作,沒有用額外儲存空間。看了下它的實現源**,如下:

templateinline

_fwdit _unique(_fwdit _first, _fwdit _last)

return (_last);}

上面**中_first是當前的指標,_firstb是指前乙個指標,b表示before。有意思的是,上面有兩個巢狀的for迴圈,不過細細分析,應該是只遍歷一次。還有比較費心思的地方是各種「++」的使用,即在什麼時候移動指標。真是寫庫函式啊,能省一行是一行;不過犧牲了點可讀性。

像以往一樣,還是要實地測試一下。測試函式讀取的檔案如下:

abc

aa

ab

saaa

feasf

ab

azdesf

其中有兩處重複,分別是「aa」和「ab」。測試**如下:

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 ...