如何在向量中找到重复的元素

时间:2013-12-17 13:19:37

标签: c++ algorithm vector

我有一个int向量,最多包含4个元素,最少2个,例如:

std::vector<int> vectorDATA(X); // x means unknown here

我想要做的是删除重复的元素,例如:

vectorDATA{1,2,2}     to vectorDATA{1,2}
vectorDATA{1,2,3}     to nothing changes
vectorDATA{2,2,2}     to vectorDATA{2}
vectorDATA{3,2,1,3}   to vectorDATA{3,2,1}
vectorDATA{1,2,1,2}   to vector{1,2} 

等等

这里的代码很简单:

cv::HoughLines(canny,lineQ,1,CV_PI/180,200);
        std::cout << " line Size "<<lineQ.size()<< std::endl;
        std::vector<int> linesData(lineQ.size());
        std::vector<int> ::iterator  it;
        if(lineQ.size() <=4 && lineQ.size() !=0 ){
            if(lineQ.size()==1){
                break;
            }else {
            for ( int i = 0; i<lineQ.size();i++){
                linesData[i] = lineQ[i][1]; // my comparison parameter is the lineQ[i][1]
            }

//基于我得到的答案我正在尝试这个但我真的不知道如何继续?

std::sort(lineQ.begin(),lineQ.end(),[](const cv::Vec2f &a,const cv::Vec2f &b)
            {
                return ????
            }

我尝试使用for and do while循环,但我没有得到它,而函数std::adjacent_find这个条件是元素应该是连续的。
也许这很容易,但我只是不明白! 谢谢你的帮助 !

3 个答案:

答案 0 :(得分:3)

简单的方法是排序然后唯一擦除,但这会改变顺序。

c ++ 11顺序保留方式是创建unordered_set<int> s;并执行:

unordered_set<int> s;
vec.erase(
  std::remove_if( vec.begin(),vec.end(), // remove from vector
    [&](int x)->bool{
      return !std::get<1>(s.insert(x)); // true iff the item was already in the set
    }
  ),
  vec.end() // erase from the end of kept elements to the end of the `vec`
);

这是使用unordered_set检测重复项的删除 - 删除习惯用法。

答案 1 :(得分:1)

我没有在已经提到的答案中看到无排序的源代码,所以就这样了。用于检查重复项的哈希表,将唯一元素移向向量的前面,请注意src始终为>= dstdst是复制的数量,即最后的唯一元素。< / p>

#include <unordered_set>
#include <vector>
#include <iostream>

void
uniq (std::vector<int> &a) {
    std::unordered_set<int> s;
    size_t dst = 0;
    for (size_t src = 0; src < a.size(); ++src) {
        if (s.count (a[src]) == 0) {
            s.insert (a[src]);
            a[dst++] = a[src];
        }
    }
    a.resize (dst);
}

int
main () {
    std::vector<int> a = { 3, 2, 1, 3, 2, 1, 2, 3, 4, 5 ,2, 3, 1, 1 };
    uniq (a);
    for (auto v : a)
        std::cout<< v << " ";
    std::cout << std::endl;
}

答案 2 :(得分:1)

如果你想真正删除重复的元素,你可以尝试这样的事情:

#include <iostream>    
#include <algorithm>    
#include <vector>       

using namespace std;

int main () {
    int data[] = {1,2,3,2,1};
    vector<int> vectorDATA = (&data[0], &data[0] + 5);
    sort(vectorDATA.begin(),vectorDATA.end());

    for(int i = 0; i < vectorDATA.size()-1; ++i)
    {
        if(vectorDATA[i] == vectorDATA[i+1])
            vectorDATA.erase(vectorDATA.begin()+i+1);
    }

    for(int i = 0; i < vectorDATA.size();++i)
    {
        cout << vectorDATA[i] << " ";
    }
    cout << endl;

  return 0;
}

缺乏这种方法就是元素丢失了他的命令。