vector去重

187 阅读1分钟

在从大数据中获取候选集的任务中原本使用set以及set的find操作进行去重,但是在大数据量的情况下发现find操作耗时非常严重;优化过程中也尝试了多种数据结构及方式,如:unordered_set,unordered_map,map,以及bitset。速度上都没有提升,最后不抱希望的尝试直接先将候选集全部放进vector中,再对其进行排序、去重,没想到效果比之前的都要好,下面贴出排序+去重三步曲:

  • 首先将vector排序
  • 然后使用unique算法,unique返回值是重复元素的开始位置
  • 最后使用unique算法,删除后面的那段重复部分
#include <algorithm>
#include <iostream>
#include <vector>

int main(int argc, char* argv[]){

    vector<_int64> vCandidateDoc;
    ......

    //SortFunc函数可根据需求进行重载
    sort(vCandidateDoc.begin(),vCandidateDocc.end(),SortFunc); 

    //unique将同样的元素排至vector末位,返回首个重复元素地址
    vCandidateDoc.erase(unique(vCandidateDoc.begin(),vCandidateDoc.end(),UniqueFunc),vCandidateDoc.end());  
}