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

how can I find repeated elements in a vector

本文关键字:元素 向量      更新时间:2023-10-16

我有一个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函数有一个条件,即元素应该是连续的。
也许这很容易,但我就是不明白!感谢您的任何帮助!

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

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来检测重复项的删除-擦除习惯用法。

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

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

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

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

缺少这种方法,那么元素就失去了他的秩序。