1 结论
个人推荐的方法是使用sort()和unique(),原因是简单
2 多种方案
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<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
方案3:使用set(通过手工添加)
和方案2相似,区别是构造空的set,然后手工添加
set<int> s;
for (int i : vec)
s.insert(i);
vec.assign( s.begin(), s.end() );
方案4:使用unordered_set(通过构造函数)
和方案2相似,区别是set对象不会对元素进行排序
unordered_set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
sort( vec.begin(), vec.end() );
方案5:使用unordered_set(通过手工添加)
和方案3相似,先构造空的set,然后手工添加
unordered_set<int> 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 f1 f2 f3 f4 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
3 关于unique()的实现
cplusplus手册给出的等效代码如下,相当于通过iterator将序列里面相邻的不同元素复制到序列的最前端。
返回的是最后一个不同元素后的iterator。
template <class ForwardIterator> ForwardIterator unique (ForwardIterator first, ForwardIterator last) {
if (first==last) return last;
ForwardIterator result = first;
while (++first != last) {
if ( !(*result == *first) )
*(++result)=*first;
}
return ++result;
}