Verwendung der Standardvorlagenbibliothek std::sort()
zum Sortieren eines als deklarierten Arrays
int v[2000]
;
Bietet C ++ eine Funktion, mit der der Anfangs- und Endindex eines Arrays abgerufen werden kann?
In C ++ 0x / 11 erhalten wir std::begin
und std::end
die für Arrays überladen sind:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Wenn Sie keinen Zugriff auf C ++ 0x haben, ist es nicht schwer, sie selbst zu schreiben:
// for container with nested typedefs, non-const version
template<class Cont>
typename Cont::iterator begin(Cont& c){
return c.begin();
}
template<class Cont>
typename Cont::iterator end(Cont& c){
return c.end();
}
// const version
template<class Cont>
typename Cont::const_iterator begin(Cont const& c){
return c.begin();
}
template<class Cont>
typename Cont::const_iterator end(Cont const& c){
return c.end();
}
// overloads for C style arrays
template<class T, std::size_t N>
T* begin(T (&arr)[N]){
return &arr[0];
}
template<class T, std::size_t N>
T* end(T (&arr)[N]){
return arr + N;
}
std::begin()
undstd::end()
C ++ 1x Ergänzungen? Sie sind sehr nett - hätte von Anfang an so sein sollen, es hätte viele Algorithmen allgemeiner gemacht!std::begin()
undstd::end()
sind nicht Teil des aktuellen C ++ - Standards, aber Sie könnenboost::begin()
und verwendenboost::end()
.begin
undend
Funktion in unserem persönlichen Tool - Kits. Vor C ++ 11 hatten sie jedoch einen seriellen Nachteil: Sie führten nicht zu einem integralen konstanten Ausdruck. Abhängig von den spezifischen Anforderungen würden wir sie verwenden oder ein Makro, das die Aufteilung der beiden vornimmtsizeof
.decltype
sicherlich vereinfacht bestimmte Verwendungen, aber ich sehe nicht, was es mit dem freienbegin
undend
Funktionen zu tun hat . (Und Sie sollten wirklich jeweils zwei davon haben, eines für Arrays im C-Stil und eines für Container mit automatischer Unterscheidung, damit Sie sie in Vorlagen verwenden können, ohne zu wissen, ob der Typ ein Container oder ein Array im C-Stil ist.)In C ++ 11 :
quelle
std::vector
. Mein Code wäre:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Wenn Sie die Größe nicht kennen, können Sie Folgendes verwenden:
Selbst wenn Sie die Größe kennen, ist es eine gute Idee, sie auf diese Weise zu codieren, da dies die Möglichkeit eines Fehlers verringert, wenn die Arraygröße später geändert wird.
quelle
sizeof x/sizeof *x
Tricks eine sicherere Vorlage verwenden :,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
da dies fehlschlägt, wenn Sie anstelle eines Arrays einen Zeiger übergeben. Es kann bei Bedarf in eine Kompilierungszeitkonstante umgewandelt werden, ist jedoch etwas zu schwer in einem Kommentar zu lesen.begin()
und zuend()
funktionieren, die auf alle gängigen Containertypen, einschließlich Arrays, spezialisiert sind, und sie stattdessen zu verwenden. Die Antwort von Xeo ließ mich denken, dass diese bereits zu C ++ hinzugefügt wurden, jetzt scheinen sie es nicht getan zu haben ... Ich werde sehen, was die Leute sonst noch zu sagen haben und dann aktualisieren.begin
,end
,size
,STATIC_SIZE
(Makro , dass die Renditen der Kompilierung ein Zeitkonstante mit der Größe), aber um ehrlich zu sein, den ich je kaum , dass außerhalb von kleinen Codebeispielen verwenden.std::extent<decltype(v)>::value
in C ++ 11Sie können es sortieren
std::sort(v, v + 2000)
quelle
quelle
Sie können sort () in C ++ STL verwenden. sort () Funktion Syntax:
quelle
C ++ - Sortierung mit Sortierfunktion
quelle
std::sort(arr, arr + arr_size)
Verwenden Sie die C ++ -
std::sort
Funktion:quelle
quelle
So einfach ist das ... C ++ bietet Ihnen eine Funktion in STL (Standard Template Library),
sort
die 20% bis 50% schneller ausgeführt wird als die handcodierte Schnellsortierung.Hier ist der Beispielcode für seine Verwendung:
quelle
Mit der Ranges-Bibliothek, die in C ++ 20 enthalten ist, können Sie verwenden
direkt, wo
arr
ist ein eingebautes Array.quelle
Sortiermethode ohne
std::sort
:Führen Sie ein vollständiges Beispiel aus:
quelle
Sie können verwenden,
quelle
begin
undend
Methoden. Sie müssen an a denkenvector
.