Namensräume
Varianten
Aktionen

std::list<T,Allocator>::sort

Von cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
void sort();
(1)
template< class Compare >
void sort( Compare comp );
(2)

Sortiert die Elemente und erhält die Reihenfolge von äquivalenten Elementen. Keine Referenzen oder Iteratoren werden ungültig.

1) Elemente werden mittels operator< verglichen.
2) Elemente werden mit comp verglichen.

Wenn eine Ausnahme ausgelöst wird, ist die Reihenfolge der Elemente in *this undefiniert.

Inhalt

[bearbeiten] Parameter

comp - Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das ​true zurückgibt, wenn das erste Argument *weniger* (d.h. *vorher*) als das zweite geordnet ist.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

bool cmp(const Type1& a, const Type2& b);

Obwohl die Signatur nicht unbedingt const& haben muss, darf die Funktion die übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte vom Typ (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig Type1, es sei denn, für Type1 ist ein Move äquivalent zu einem Kopieren(since C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ list<T,Allocator>::const_iterator dereferenziert und dann implizit in beide konvertiert werden kann. ​

Typanforderungen
-
Compare muss die Anforderungen an Compare erfüllen.

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Komplexität

Gegeben sei N als size()

1) Ungefähr N·log(N) Vergleiche mit operator<.
2) Ungefähr N·log(N) Anwendungen der Vergleichsfunktion comp.

[bearbeiten] Anmerkungen

std::sort benötigt zufällige Zugriffsiteratoren und kann daher nicht mit list verwendet werden. Diese Funktion unterscheidet sich auch von std::sort dadurch, dass sie nicht erfordert, dass der Elementtyp der list vertauschbar ist, die Werte aller Iteratoren beibehält und eine stabile Sortierung durchführt.

[bearbeiten] Beispiel

#include <functional>
#include <iostream>
#include <list>
 
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
 
int main()
{
    std::list<int> list{8, 7, 5, 9, 0, 1, 3, 2, 6, 4};
    std::cout << "initially: " << list << '\n';
 
    list.sort();
    std::cout << "ascending: " << list << '\n';
 
    list.sort(std::greater<int>());
    std::cout << "descending:" << list << '\n';
}

Ausgabe

initially:  8 7 5 9 0 1 3 2 6 4
ascending:  0 1 2 3 4 5 6 7 8 9
descending: 9 8 7 6 5 4 3 2 1 0

Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 1207 C++98 war unklar, ob Iteratoren und/oder Referenzen ungültig werden gültig bleiben

[bearbeiten] Siehe auch

kehrt die Reihenfolge der Elemente um
(public member function) [edit]