2013-12-17 6 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

@ Dukeling там у вас есть – 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` 
); 

который Remove-стирают идиомы с помощью unordered_set для обнаружения дубликатов.

+0

Вы можете сократить это, просто вставив и проверив возвращаемое значение, так как вставка сообщит вам, существовал ли этот элемент или нет. – Svalorzen

+0

@Svalorzen более короткая версия б/у. – Yakk

1

В уже упомянутых ответах я не видел исходный код сорт-меньше, так что вот оно. Хеш-таблицу для проверки дубликатов, смещение уникальных элементов по направлению к вектору, обратите внимание, что 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; 
} 
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 Вы забыли сортировку, которая была сделана до удаления. –

Смежные вопросы