Duplikate in Container finden
-
Hi, ich versuche mich gerade an einem Pokerspiel und hab mir gedacht, dass ich mal mit einem der schwersten Teile anfange, dem "Hand-Auswerter". Da ich keinen aus dem Internet benutzen möchte hab ich angefangen einen eigenen zu schreiben ^^ So jetzt zu meiner Frage, die folgende Funktion sucht aus einem Vector Werte, die wiederholt vorkommen,speichert dann die Anzahl an Wiederholungen in einem neuen Vector und gibt diesen dann zurück. Ist das so viel zu kompliziert geschrieben/ geht das einfacher oder denkt ihr das ist gut so fürs Erste ? ^^
std::vector<unsigned short> findDuplicates(std::vector<unsigned short> v) { std::vector<unsigned short> result; bool cancel = true; std::sort(v.begin(), v.end(), [](unsigned short i, unsigned short j){ return i < j; }); while (cancel == true) { auto it = std::adjacent_find(v.begin(), v.end()); if (it != v.end()) { auto i = std::count(it, v.end(), *it); v.erase(it, it + (i - 1)); result.push_back(i); } else { cancel = false; } } return result; }Schon einmal danke für jede Hilfe

-
std::sort(v.begin(), v.end(), [](unsigned short i, unsigned short j){ return i < j; });Wenn einfach der Größe nach sortiert werden soll, musst du kein Vergleichsprädikat angeben.
while (cancel == true)Vergleich mit true? Und ist das nicht gerade das Gegenteil dessen, was cancel dem Wortsinn nach ausdrückt?
In Hinblick auf algorithmische Komplexität ungünstig sind:
auto i = std::count(it, v.end(), *it);Hier machst du keinen Gebrauch davon, dass der Container sortiert ist.
v.erase(it, it + (i - 1));Das scheint ist im Grunde überflüssig. Warum nicht einfach das nächste adjacent_find mit it + i als Anfangsiterator füttern?
-
Hi danke fürs Feedback

Hab den Code jetzt anhand deiner Vorschläge verbessert. Soweit besser ?std::vector<unsigned short> findDuplicates(std::vector<unsigned short> v) { std::vector<unsigned short> result; bool cancel = false; std::sort(v.begin(), v.end()); auto it = std::adjacent_find(v.begin(), v.end()); while (!cancel) { if (it != v.end()) { auto itr = std::adjacent_find(it, v.end(), std::not_equal_to<unsigned short>()) + 1; auto i = std::distance(it, itr); it = std::adjacent_find(it + i, v.end()); result.push_back(i); } else { cancel = true; } } return result; }
-
cancel riecht ungut. wenn möglich, return benutzen, uzm zu sagen, daß eine berechnung erledigt ist und das ergebnis feststeht.
ginge hier ein while (oder do), aber ohne cancel?
-
std::vector<unsigned short> findDuplicates(std::vector<unsigned short> v) { std::vector<unsigned short> result; std::sort(v.begin(), v.end()); auto it = std::adjacent_find(v.begin(), v.end()); while (true) { if (it != v.end()) { auto itr = std::adjacent_find(it, v.end(), std::not_equal_to<unsigned short>()) + 1; auto i = std::distance(it, itr); it = std::adjacent_find(it + i, v.end()); result.push_back(i); } else { return result; } } }Also so ?

-
xxXLukas97Xxx schrieb:
Also so ?

prächtig.

Hab das Gefühl, daß Du da in Wirklichkeit sowas wie einwhile(it != v.end())versteckt hast.
-
Oh ... *räusper* hoffe mal bis hier unten liest niemand

Danke