清除 C++ vector 中的冗余元素

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;
}

4 参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值