2013-05-10 30 views
7

Ich möchte nur Duplikate entfernen. Pool ist vector<pair<string, int>>, aber ich vermisse irgendwie einige Elemente am Anfang des Vektors. Kann jemand die Logik der Entfernung verifizieren? Danke :)Doppelte Einträge in einem C++ Vektor entfernen

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

Haben Sie etwas dagegen, wenn es sortiert wird? – chris

+0

Eww, diese Kopien ... –

+1

Ein einfacher (und wahrscheinlich schneller als der 'O (n^2)' Weise, die es derzeit dauert), dies zu tun, ist das Hinzufügen aller Elemente zu einem 'std :: set' und dann zurück zu einem 'std :: vector'. – Yuushi

Antwort

4

Dies ist ein sehr häufiges Problem.

Da, nachdem Sie ein Element gelöscht haben, die Position j ein Element aufgrund des j ++ in der for-Schleife überspringt. die einfachste Lösung des Problems auf der Grundlage Ihrer Code zu lösen, ist nach generation.erase (iter) hinzufügen J--:

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

Danke, das war es. : D – T3CHN0CR4T

19

Wenn Sie etwas dagegen, den Vektor nicht sortiert wird, dann können Sie std::unique verwenden. Das wäre 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 Jemand sollte einen Wiki/FAQ-Eintrag für alle Brot und Butter-Vektorverwendungen schreiben. – TemplateRex

+0

@rhalbersma, einverstanden. –

+2

@rhalbersma, sollte SO eine Liste der am häufigsten gestellten Fragen zu beliebten Themen, wie Top 10 C++ - Fragen oder etwas pflegen. Das wäre praktisch. : D – T3CHN0CR4T

Verwandte Themen