2013-05-10 18 views
7

Po prostu chcesz usunąć duplikaty. Pula to vector<pair<string, int>>, ale wydaje mi się, że brakuje mi niektórych elementów na początku wektora. Czy ktokolwiek może zweryfikować logikę usunięcia? Dzięki :)Usuń zduplikowane wpisy w C++ Vector

Pool Master::eliminateDuplicates(Pool generation) 
{ 
    for(int i = 0; i < generation.size(); i++) 
    { 
     string current = generation.at(i).first; 

     for(int j = i; j < generation.size(); j++) 
     { 
      if(j == i) 
      { 
       continue; 
      } 
      else 
      { 
       string temp = generation.at(j).first; 
       if(current.compare(temp) == 0) 
       { 
        Pool::iterator iter = generation.begin() + j; 
        generation.erase(iter); 
       } 
      } 
     } 
    } 

    return generation; 
} 
+1

Czy masz coś przeciwko sortowaniu? – chris

+0

Eww, te kopie ... –

+1

Łatwiejszym (i prawdopodobnie szybszym sposobem niż sposób 'O (n^2)', który obecnie bierze) z tego jest dodanie wszystkich elementów do 'std :: set', a następnie z powrotem do 'std :: vector'. – Yuushi

Odpowiedz

4

Jest to bardzo częsty problem.

Ponieważ po skasowaniu element pozycja j wskazał pominie jeden element ze względu na j ++ w pętli for. najprostszym rozwiązaniem, aby rozwiązać problem w oparciu o kodzie jest dodanie j-- po generation.erase (ITER):

generation.erase(iter); 
    j--; 
+0

Dzięki, to było to. : D – T3CHN0CR4T

19

Jeśli nie przeszkadza sortowania wektor, a następnie można użyć std::unique. To byłoby O (Nlog (N))

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

int main() 
{ 
    std::vector<int> v{1,2,3,1,2,3,3,4,5,4,5,6,7}; 
    std::sort(v.begin(), v.end()); 
    auto last = std::unique(v.begin(), v.end()); 
    v.erase(last, v.end()); 
    for (const auto& i : v) 
     std::cout << i << " "; 
    std::cout << "\n"; 
} 
+6

+1 Ktoś powinien napisać wpis wiki/FAQ dla wszystkich zastosowań wektora chlebowego i masła. – TemplateRex

+0

@rhalbersma, zgodzili się. –

+2

@rhalbersma, SO powinien utrzymywać listę najczęściej zadawanych pytań na popularne tematy, takie jak 10 pytań C++ lub coś podobnego. Byłoby to przydatne. : D – T3CHN0CR4T