2013-12-17 44 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您在刪除之前忘記了正在進行的排序。 –

相關問題