清除 C vector 中的冗餘元素

2021-07-26 07:51:36 字數 1872 閱讀 3597

個人推薦的方法是使用sort()和unique(),原因是簡單

note: 下面的方案和測試引用自stackoverflow,作者artem klevtsov和alexk7

方案1:使用sort()和unique()

unique()實際上是檢測相鄰的2個元素,如果相等則把其中乙個移動到尾部,最後返回的是最後乙個非冗餘元素的iterator。

所以使用unique()之前,先要用sort()進行排序。

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

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

方案2:使用set(通過建構函式)

因為set物件裡的元素要求是唯一的。

所以如下,構造乙個set物件,然後重新賦值回vector()

set

s( vec.begin(), vec.end() );

vec.assign( s.begin(), s.end() );

方案3:使用set(通過手工新增)

和方案2相似,區別是構造空的set,然後手工新增

set

s;for (int i : vec)

s.insert(i);

vec.assign( s.begin(), s.end() );

方案4:使用unordered_set(通過建構函式)

和方案2相似,區別是set物件不會對元素進行排序

unordered_set

s( vec.begin(), vec.end() );

vec.assign( s.begin(), s.end() );

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

方案5:使用unordered_set(通過手工新增)

和方案3相似,先構造空的set,然後手工新增

unordered_set

s;for (int i : vec)

s.insert(i);

vec.assign( s.begin(), s.end() );

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

效能測試

原作者構建了具有100,000,000個int元素的vector,並且分別使元素的取值範圍在[1,10], [1,1000]和[1,100000]。

結果如下:(是簡單為:秒)

range

f1f2

f3f4

f5[1,10] 1.6821 7.6804 2.8232 6.2634 0.7980

[1,1000] 5.0773 13.3658 8.2235 7.6884 1.9861

[1,100000] 8.7955 32.1148 26.5485 13.3278 3.9822

cplusplus手冊給出的等效**如下,相當於通過iterator將序列裡面相鄰的不同元素複製到序列的最前端。

返回的是最後乙個不同元素後的iterator。

if (first==last) return

last;

forwarditerator result = first;

while (++first != last)

return ++result;

}

C vector中刪除元素

vector中刪除指定元素 刪除指定元素 vectorv printf v size d n v.size 單獨使用remove只代表移除元素,vector總大小還是原來大小,5 6為要刪除的元素 remove v.begin v.end 5 remove v.begin v.end 6 erase...

刪除順序錶值相同的多餘元素

編寫演算法,在順序表l中,刪除所有值相等的多餘元素。函式介面定義 void delsame seqlist l l 指向順序表。裁判測試程式樣例 include define maxsize 20 struct seqlist typedef struct seqlist seqlist 型別定義 ...

刪除順序錶值相同的多餘元素

編寫演算法,在順序表l中,刪除所有值相等的多餘元素。函式介面定義 void delsame seqlist l l 指向順序表。裁判測試程式樣例 include define maxsize 20 struct seqlist typedef struct seqlist seqlist 型別定義 ...