2014-11-15 10 views
6

Gefunden, dass std::unordered_set und std::unordered_map hat Bereich basiert erase(first, last), die meiner Meinung nach ist eine andere nette Möglichkeit, sich in Bein zu schießen.Was ist ein echter Anwendungsfall für die std :: unordered_ (set | map) entfernungsbasierte Löschung?

Vielleicht kennt jemand einen echten Anwendungsfall für eine solche Funktionalität?

Oder dies kann als schlechtes Design angesehen werden?

+2

Das bereichsbasierte Löschen gehört zu den allgemeinen ungeordneten Containeranforderungen und ist einfach bereitzustellen und zu implementieren. Ich nehme an, es wäre schwieriger, diese Überladung explizit von den Karten mit dem eindeutigen Schlüssel zu entfernen, als sie einfach zu lassen, auch wenn sie nicht viel nutzt. Sie werden feststellen, dass es in den Abschnitten zu ungeordneter Karte und Menge nicht wirklich erwähnt wird. –

+0

Ich bin bereit, diesen Kommentar als richtige Antwort zu akzeptieren, kann aber nicht – acc15

Antwort

1

OK, ich have an answer. In C++ 14 wird klargestellt, dass Elemente, die nicht gelöscht werden, die gleiche Reihenfolge beibehalten "dies ermöglicht das Löschen einzelner Elemente während der Iteration durch den Container."

Ihre Iteration wird in zufälliger Reihenfolge sein. Sie können jedoch alle, die Sie besucht haben, in einem Anruf löschen. Der zu löschende Bereich entspricht dem Bereich, den Sie wiederholt haben.

+0

mit anderen Worten während der Iteration über "random-ordered" -Sequenz muss ich Bereich verfolgen, nur zum Löschen in einem Vorgang durchführen? Dies kann wahrscheinlich bei großen Sequenzen verstärkt werden. Dies hängt jedoch stark von der Verteilung der Daten ab, die gelöscht werden sollten. – acc15

+1

Wenn die Reihenfolge keine Rolle spielt, dann auch nicht. Angenommen, Sie sammeln eine Liste mit zu bemalenden Häusern und behalten diese in einer ungeordneten Karte bei, während die Daten eintreffen. Wenn der Malvorgang ausgelöst wird, dauert es * beliebige * 10 Elemente (falls es mehr gibt) und gibt Arbeitsaufträge für Crews ** und ** entfernt sie von der Liste. Sie haben damit angefangen, wie weit Sie den Vorwärts-Iterator durchgehen und '* it' in der Schleife verarbeiten. Löschen Sie dann 'begin(), um nur die Verarbeiteten zu entfernen. Das ist effizienter, als jedes zu löschen, während Sie den Iterator weiterentwickeln. –

+0

Ja, ich habe eine Idee, danke. Allerdings sieht das immer noch ganz nach einer bestimmten Aufgabe aus (warum 10 Häuser? Warum nicht alle? - wenn alles dann 'clear()' - wäre besser) - aber diese Aufgabe kann passieren. Danke noch einmal. – acc15

2

Ich denke, es ist die Kompatibilität mit regulären Karte und Set zu gewährleisten.

Aber ich denke immer noch, dass es im Prinzip nützlich ist. Wenn ein Bereich von Werten zurückgezogen wird, möchten Sie sie aus der Sammlung entfernen. Aber der normale Anwendungsfall sieht nach oben (eine Million Mal häufiger als Einfügen/Löschen) und wird nicht durchlaufen, so dass die ungeordnete Version gut ist.

Wie kann es dich erschießen? Es ist nicht anders, als jedes einzelne in einer Schleife zu löschen. Ah, der einfache Start, der Vorwärts-Traversal-Endbereich funktioniert nicht, also glaubt man, dass die gelieferte Funktion nicht das tut, was man braucht, um richtig zu kommen, aber das gleiche Vorwärts-Traversal, das auf einer Karte funktioniert, aber durchbricht eine ungeordnete_map?

Gee, oder?

+1

Ja, zwischen std :: map und std :: unordered_map ist nicht möglich, wenn Sie range-based Erase() verwenden, da im Falle einer ungeordneten Sammlung Sie sehr erhalten -hard-to-Predict Ergebnisse – acc15

Verwandte Themen