Entfernen Sie Doppelte Einträge in einem C++ - Vektor
Wollen einfach nur, um Duplikate entfernen. Pool ist vector<pair<string, int>>
aber ich glaube, ich vermisse einige Elemente zu Beginn der Vektor-irgendwie. Kann jemand überprüfen, die Logik der Entfernung? Danke 🙂
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;
}
- Tun Sie etwas dagegen, wenn es wird sortiert?
- Eww, diese Kopien...
- Ein einfacher (und wahrscheinlich schneller Weg, als die
O(n^2)
Weise, dass es zur Zeit dauert), dies zu tun ist das hinzufügen aller Elemente, die zu einerstd::set
und dann wieder zu einemstd::vector
. - Auch, ich nehme an, du meinst
Pool
ist einvector<pair<string, int>>
? - Ich dachte die setzt nur funktionieren würde, basierend auf den integer-Datentyp? Ich Vergleiche bei string-Duplikate. EDIT ja, sorry Tippfehler 😉
- Ist diese Anweisung if(j == i){continue;} notwendig? Sie können einfach starten Sie die Schleife von i+1.
- Führen könnte ein segmentation fault, wenn ich das Letzte element.
std::set
arbeiten auf der Grundlage entwederoperator<
oder geben Sie einen Vergleich-Funktion verwenden kann. Es wäre ein ziemlich nutzloses gesetzt, wenn es funktioniert nur für Ganzzahlen!- In jedem Fall, Sie don nicht verwenden. Sie können Sortieren Sie Ihre Vektorgrafik und verwenden
std::unque
. Das wäre O(Nlog(N))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein sehr häufiges Problem.
Da nach dem löschen ein element der position j darauf springen Sie ein element durch die j++ auf die for-Schleife.
die einfachste Lösung um das problem zu lösen, basierend auf deinem code ist das hinzufügen von j-- generation.erase(iter):
Wenn Euch das nichts ausmacht Sortierung des Vektors, dann können Sie
std::unique
. Das wäre O(Nlog(N))std::unique
niemand scheint es Wert zu erwähnen, dassunique
berücksichtigt nicht das Letzte element ist.std::unique
's Verhalten scheint sehr intuitiv für mich.std::sort
?