2013-12-17 46 views
0

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

+1

最多4个,最少4.这不是一个真正的多种尺寸:) – jrok

+0

@jrok抱歉! – Engine

+0

@Dikeling在那里你得到了它 – Engine

回答

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来检测重复的移除擦除成语。

+0

你可以通过插入和检查返回值来缩短这一点,因为插入会告诉你元素是否已经存在。 – Svalorzen

+0

@Svalorzen使用较短的版本。 – Yakk

1

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

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

的这种方法是再元素失去了秩序缺乏。

+1

只有当重复的元素是连续的,它才能工作! – Engine

+1

@engine您在删除之前忘记了正在进行的排序。 –

相关问题