個人推薦的方法是使用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 型別定義 ...