Recherche…


Remarques

La famille de fonctions std::sort se trouve dans la bibliothèque d' algorithm .

Tri des conteneurs de séquence avec un ordre spécifique

Si les opérateurs d'un conteneur sont déjà surchargés, std::sort peut être utilisé avec des foncteurs spécialisés pour trier dans l'ordre croissant ou décroissant:

C ++ 11
#include <vector>
#include <algorithm>
#include <functional>

std::vector<int> v = {5,1,2,4,3};

//sort in ascending order (1,2,3,4,5)
std::sort(v.begin(), v.end(), std::less<int>());

// Or just:
std::sort(v.begin(), v.end());

//sort in descending order (5,4,3,2,1)
std::sort(v.begin(), v.end(), std::greater<int>());

//Or just:
std::sort(v.rbegin(), v.rend());
C ++ 14

En C ++ 14, il n'est pas nécessaire de fournir l'argument de modèle pour les objets de fonction de comparaison et de laisser l'objet déduire en fonction de ce qu'il reçoit:

std::sort(v.begin(), v.end(), std::less<>());     // ascending order
std::sort(v.begin(), v.end(), std::greater<>());  // descending order

Tri des conteneurs de séquence par un opérateur moins surchargé

Si aucune fonction de std::sort n'est passée, std::sort ordonnera les éléments en appelant operator< sur des paires d'éléments, ce qui doit renvoyer un type convertible contextuellement en bool (ou simplement bool ). Les types de base (entiers, flottants, pointeurs, etc.) ont déjà été créés dans des opérateurs de comparaison.

Nous pouvons surcharger cet opérateur pour que l'appel de sort par défaut fonctionne sur les types définis par l'utilisateur.

// Include sequence containers
#include <vector>
#include <deque>
#include <list>

// Insert sorting algorithm
#include <algorithm>    

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
    
    // Use variable to provide total order operator less
    //`this` always represents the left-hand side of the compare.
    bool operator<(const Base &b) const { 
        return this->variable < b.variable;
    }
    
    int variable;
};

int main() {
    std::vector <Base> vector;
    std::deque <Base> deque;
    std::list <Base> list;
    
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // Insert them into backs of containers
    vector.push_back(a);
    vector.push_back(b);
    
    deque.push_back(a);
    deque.push_back(b);
    
    list.push_back(a);
    list.push_back(b);
    
    // Now sort data using operator<(const Base &b) function
    std::sort(vector.begin(), vector.end());
    std::sort(deque.begin(), deque.end());
    // List must be sorted differently due to its design
    list.sort();

    return 0;
}

Tri des conteneurs de séquence à l'aide de la fonction de comparaison

// Include sequence containers
#include <vector>
#include <deque>
#include <list>

// Insert sorting algorithm
#include <algorithm>

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
       
    int variable;
};

bool compare(const Base &a, const Base &b) {
    return a.variable < b.variable;
}

int main() {
    std::vector <Base> vector;
    std::deque <Base> deque;
    std::list <Base> list;
    
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // Insert them into backs of containers
    vector.push_back(a);
    vector.push_back(b);
    
    deque.push_back(a);
    deque.push_back(b);
    
    list.push_back(a);
    list.push_back(b);
    
    // Now sort data using comparing function
    std::sort(vector.begin(), vector.end(), compare);
    std::sort(deque.begin(), deque.end(), compare);
    list.sort(compare);

    return 0;
}

Tri des conteneurs de séquence à l'aide d'expressions lambda (C ++ 11)

C ++ 11
// Include sequence containers
#include <vector>
#include <deque>
#include <list>
#include <array>
#include <forward_list>

// Include sorting algorithm
#include <algorithm>

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
    
    int variable;
};


int main() {
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // We're using C++11, so let's use initializer lists to insert items.
    std::vector <Base> vector = {a, b};
    std::deque <Base> deque = {a, b};
    std::list <Base> list = {a, b};
    std::array <Base, 2> array = {a, b};
    std::forward_list<Base> flist = {a, b};
    
    // We can sort data using an inline lambda expression
    std::sort(std::begin(vector), std::end(vector),
      [](const Base &a, const Base &b) { return a.variable < b.variable;});

    // We can also pass a lambda object as the comparator
    // and reuse the lambda multiple times
    auto compare = [](const Base &a, const Base &b) {
                     return a.variable < b.variable;};
    std::sort(std::begin(deque), std::end(deque), compare);
    std::sort(std::begin(array), std::end(array), compare);
    list.sort(compare);
    flist.sort(compare);

    return 0;
}

Tri et séquence des conteneurs

std::sort , trouvé dans l' algorithm tête de bibliothèque standard, est un algorithme de bibliothèque standard pour trier une plage de valeurs, définie par une paire d'itérateurs. std::sort prend comme dernier paramètre un foncteur utilisé pour comparer deux valeurs; c'est comme ça qu'il détermine la commande. Notez que std::sort n'est pas stable .

La fonction de comparaison doit imposer un ordre strict, faible sur les éléments. Une simple comparaison inférieure à (ou supérieure à) suffit.

Un conteneur avec des itérateurs à accès aléatoire peut être trié à l'aide de l'algorithme std::sort :

C ++ 11
#include <vector>
#include <algorithm>

std::vector<int> MyVector = {3, 1, 2}

//Default comparison of <
std::sort(MyVector.begin(), MyVector.end());

std::sort exige que ses itérateurs soient des itérateurs à accès aléatoire. Les conteneurs de séquence std::list et std::forward_list (nécessitant C ++ 11) ne fournissent pas d'itérateurs d'accès aléatoire, ils ne peuvent donc pas être utilisés avec std::sort . Cependant, ils ont des fonctions de membre de sort qui implémentent un algorithme de tri qui fonctionne avec leurs propres types d'itérateurs.

C ++ 11
#include <list>
#include <algorithm>

std::list<int> MyList = {3, 1, 2}

//Default comparison of <
//Whole list only.
MyList.sort();

Leurs fonctions de sort membres sort toujours la liste entière, de sorte qu'elles ne peuvent pas trier un sous-ensemble d'éléments. Cependant, puisque list et forward_list ont des opérations d’épissage rapides, vous pouvez extraire les éléments à trier de la liste, les trier, puis les réutiliser là où ils étaient assez efficacement comme ceci:

void sort_sublist(std::list<int>& mylist, std::list<int>::const_iterator start, std::list<int>::const_iterator end) {
    //extract and sort half-open sub range denoted by start and end iterator 
    std::list<int> tmp;
    tmp.splice(tmp.begin(), list, start, end);
    tmp.sort();
    //re-insert range at the point we extracted it from
    list.splice(end, tmp);
}

tri avec std :: map (croissant et décroissant)

Cet exemple trie les éléments dans l'ordre croissant d'une clé à l' aide d'une carte. Vous pouvez utiliser n'importe quel type, y compris la classe, au lieu de std::string , dans l'exemple ci-dessous.

#include <iostream>
#include <utility>
#include <map>

int main()
{
    std::map<double, std::string> sorted_map;
    // Sort the names of the planets according to their size
    sorted_map.insert(std::make_pair(0.3829, "Mercury"));
    sorted_map.insert(std::make_pair(0.9499, "Venus"));
    sorted_map.insert(std::make_pair(1,      "Earth"));
    sorted_map.insert(std::make_pair(0.532,  "Mars"));
    sorted_map.insert(std::make_pair(10.97,  "Jupiter"));
    sorted_map.insert(std::make_pair(9.14,   "Saturn"));
    sorted_map.insert(std::make_pair(3.981,  "Uranus"));
    sorted_map.insert(std::make_pair(3.865,  "Neptune"));

    for (auto const& entry: sorted_map)
    {
        std::cout << entry.second << " (" << entry.first << " of Earth's radius)" << '\n';
    }
}

Sortie:

Mercury (0.3829 of Earth's radius)
Mars (0.532 of Earth's radius)
Venus (0.9499 of Earth's radius)
Earth (1 of Earth's radius)
Neptune (3.865 of Earth's radius)
Uranus (3.981 of Earth's radius)
Saturn (9.14 of Earth's radius)
Jupiter (10.97 of Earth's radius)

Si des entrées avec des clés égales sont possibles, utilisez multimap au lieu de map (comme dans l'exemple suivant).

Pour trier les éléments de manière décroissante , déclarez la carte avec un foncteur de comparaison correct ( std::greater<> ):

#include <iostream>
#include <utility>
#include <map>

int main()
{
    std::multimap<int, std::string, std::greater<int>> sorted_map;
    // Sort the names of animals in descending order of the number of legs
    sorted_map.insert(std::make_pair(6,   "bug"));
    sorted_map.insert(std::make_pair(4,   "cat"));
    sorted_map.insert(std::make_pair(100, "centipede"));
    sorted_map.insert(std::make_pair(2,   "chicken"));
    sorted_map.insert(std::make_pair(0,   "fish"));
    sorted_map.insert(std::make_pair(4,   "horse"));
    sorted_map.insert(std::make_pair(8,   "spider"));

    for (auto const& entry: sorted_map)
    {
        std::cout << entry.second << " (has " << entry.first << " legs)" << '\n';
    }
}

Sortie

centipede (has 100 legs)
spider (has 8 legs)
bug (has 6 legs)
cat (has 4 legs)
horse (has 4 legs)
chicken (has 2 legs)
fish (has 0 legs)

Tri des tableaux intégrés

L'algorithme de sort trie une séquence définie par deux itérateurs. Ceci est suffisant pour trier un tableau intégré (également appelé c-style).

C ++ 11
int arr1[] = {36, 24, 42, 60, 59};

// sort numbers in ascending order
sort(std::begin(arr1), std::end(arr1));

// sort numbers in descending order
sort(std::begin(arr1), std::end(arr1), std::greater<int>());

Avant C ++ 11, la fin du tableau devait être "calculée" en utilisant la taille du tableau:

C ++ 11
// Use a hard-coded number for array size
sort(arr1, arr1 + 5);

// Alternatively, use an expression
const size_t arr1_size = sizeof(arr1) / sizeof(*arr1);
sort(arr1, arr1 + arr1_size);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow