Comment utiliser la bibliothèque de modèles standard std::sort()
pour trier un tableau déclaré comme
int v[2000]
;
Le C ++ fournit-il une fonction qui peut obtenir l'index de début et de fin d'un tableau?
En C ++ 0x / 11, nous obtenons std::begin
et std::end
qui sont surchargés pour les tableaux:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Si vous n'avez pas accès à C ++ 0x, il n'est pas difficile de les écrire vous-même:
// 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()
etstd::end()
C ++ 1x? Ils sont très gentils - cela aurait dû être ainsi depuis le début, cela aurait rendu beaucoup d'algorithmes plus génériques!std::begin()
etstd::end()
ne font pas partie de la norme C ++ actuelle, mais vous pouvez utiliserboost::begin()
etboost::end()
.begin
etend
fonctionnaient dans nos kits d'outils personnels. Avant C ++ 11, cependant, ils avaient un inconvénient serios: ils ne résultaient pas en une expression constante intégrale. Donc, en fonction des besoins spécifiques, nous les utiliserions, ou une macro qui faisait la division des deuxsizeof
.decltype
simplifie certainement certaines utilisations, mais je ne vois pas ce que cela a à voir avec les fonctions gratuitesbegin
etend
. (Et vous devriez vraiment en avoir deux pour chacun d'eux, un pour les tableaux de style C et un autre pour les conteneurs, avec discrimination automatique, afin de pouvoir les utiliser dans des modèles, sans savoir si le type est un conteneur ou un tableau de style C.)En C ++ 11 :
la source
std::vector
. Mon code serait:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Si vous ne connaissez pas la taille, vous pouvez utiliser:
Même si vous connaissez la taille, c'est une bonne idée de le coder de cette façon car cela réduira la possibilité d'un bogue si la taille du tableau est modifiée plus tard.
la source
sizeof x/sizeof *x
astuce, vous devriez utiliser un modèle plus sûr:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
car cela échouera si au lieu d'un tableau, vous passez un pointeur. Il peut être converti en une constante de temps de compilation si nécessaire, mais il devient un peu trop difficile à lire dans un commentaire.begin()
et de faireend()
fonctionner des modèles spécialisés pour tous les types de conteneurs courants, y compris les tableaux, et de les utiliser à la place. La réponse de Xeo m'a fait penser que ceux-ci avaient déjà été ajoutés au C ++, maintenant il semble qu'ils ne l'ont pas fait ... Je vais voir ce que les autres ont à dire et puis mettre à jour.begin
,end
,size
,STATIC_SIZE
(macro qui renvoie un constante de temps de compilation avec la taille), mais pour être honnête, j'utilise presque jamais que , en dehors des petits échantillons de code.std::extent<decltype(v)>::value
en C ++ 11Vous pouvez le trier
std::sort(v, v + 2000)
la source
la source
vous pouvez utiliser sort () dans C ++ STL. Fonction sort () Syntaxe:
la source
Tri C ++ à l'aide de la fonction de tri
la source
std::sort(arr, arr + arr_size)
Utilisez la
std::sort
fonction C ++ :la source
la source
C'est aussi simple que cela ... C ++ vous fournit une fonction en STL (Standard Template Library) appelée
sort
qui s'exécute 20% à 50% plus vite que le tri rapide codé à la main.Voici l'exemple de code pour son utilisation:
la source
Avec la bibliothèque Ranges fournie en C ++ 20, vous pouvez utiliser
directement, où
arr
est un tableau intégré.la source
méthode de tri sans
std::sort
:Exécutez l' exemple complet:
la source
vous pouvez utiliser,
la source
begin
etend
. Vous devez penser à unvector
.