Gibt es in STL einen sortierten Container?

7

ALLE

Gibt es in STL einen sortierten Container? Was ich meine, ist folgendes:

Ich habe einen std :: Vektor wo Foo eine benutzerdefinierte Klasse ist. Ich habe auch einen Vergleicher, der die Felder der Klasse Foo vergleicht.

Nun, irgendwo in meinem Code mache ich:

%Vor%

sortiert den Vektor nach den Regeln, die ich im Komparator definiert habe.

Nun möchte ich ein Element der Klasse Foo in diesen Vektor einfügen. Wenn ich könnte ich möchte nur schreiben:

%Vor%

und was passieren würde ist, dass der Vektor dieses neue Element entsprechend dem Komparator an seinen Platz setzen wird.

Stattdessen muss ich jetzt schreiben:

%Vor%

was nur eine Verschwendung von Zeit ist, da der Vektor bereits sortiert ist und alles was ich brauche ist, das neue Element passend zu platzieren.

Nun kann ich wegen der Art meines Programms nicht std :: map & lt; & gt; da ich keine Schlüssel / Wert-Paare habe, nur einen einfachen Vektor.

Wenn ich stl :: list verwende, muss ich nach jedem Einfügen erneut sortieren.

Vielen Dank für Ihre Vorschläge.

    
Igor 23.03.2013, 01:49
quelle

2 Antworten

26

Ja, std::set , std::multiset , std::map , und std::multimap werden alle mit std::less als Standardvergleichsoperation. Die zugrunde liegende Datenstruktur ist typischerweise ein ausgewogener binärer Suchbaum, beispielsweise ein Rot-Schwarz-Baum. Wenn Sie also ein Element zu diesen Datenstrukturen hinzufügen und dann über die enthaltenen Elemente iterieren, wird die Ausgabe in sortierter Reihenfolge angezeigt. Die Komplexität des Hinzufügens von N Elementen zu der Datenstruktur ist O (N log N) oder das gleiche wie das Sortieren eines Vektors von N Elementen unter Verwendung einer beliebigen gemeinsamen O (log N) -Komplexitätssortierung.

In Ihrem spezifischen Szenario, da Sie keine Schlüssel / Wert-Paare haben, ist std::set oder std::multiset wahrscheinlich Ihre beste Wette.

    
Jason 23.03.2013 01:51
quelle
-1

Ich denke nicht, dass die Funktionalität in STL existiert, ein std :: vector kann nur mit partition , nth_element , stable_partition , < strong> partial_sort , stable_sort und sort .

Sie könnten jedoch einen Wrapper für std :: vector

erstellen %Vor%     
james82345 23.03.2013 02:23
quelle

Tags und Links