Namespaces
Variants

std::ranges::nth_element

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, p. ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur les plages partitionnées)
Opérations d'ensemble (sur les plages triées)
Opérations de fusion (sur les plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur les plages triées)
       
       
Opérations d'ensemble (sur les plages triées)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::random_access_iterator I, std::sentinel_for<I> S,
          class Comp = ranges::less, class Proj = std::identity >
requires std::sortable<I, Comp, Proj>
constexpr I
    nth_element( I first, I nth, S last, Comp comp = {}, Proj proj = {} );
(1) (depuis C++20)
template< ranges::random_access_range R,
          class Comp = ranges::less, class Proj = std::identity >
requires std::sortable<iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R>
    nth_element( R&& r, iterator_t<R> nth, Comp comp = {}, Proj proj = {} );
(2) (depuis C++20)

Réordonne les éléments dans [firstlast) de sorte que :

  • L'élément pointé par nth est changé en l'élément qui apparaîtrait à cette position si [firstlast) était trié par rapport à comp et proj.
  • Tous les éléments avant ce nouvel élément nth sont inférieurs ou égaux à les éléments après le nouvel élément nth. C'est-à-dire, pour chaque itérateur i, j dans les plages [firstnth), [nthlast) respectivement, l'expression std::invoke(comp, std::invoke(proj, *j), std::invoke(proj, *i)) évalue à false.
  • Si nth == last alors la fonction n'a aucun effet.
1) Les éléments sont comparés en utilisant l'objet de fonction de comparaison binaire donné comp et l'objet de projection proj.
2) Identique à (1), mais utilise r comme plage, comme en utilisant ranges::begin(r) comme first et ranges::end(r) comme last.

Les entités de type fonction décrites sur cette page sont des objets de fonction d'algorithme (informellement appelés niebloids), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant l'intervalle des éléments à réorganiser
r - l'intervalle des éléments à réorganiser
nth - l'itérateur définissant le point de partition
comp - comparateur utilisé pour comparer les éléments projetés
proj - projection à appliquer aux éléments

Valeur de retour

1) Un itérateur égal à last .
2) Identique à (1) si r est une lvalue ou d'un type borrowed_range . Sinon, retourne std::ranges::dangling .

Complexité

Linéaire en ranges:: distance ( first, last ) en moyenne.

Notes

L'algorithme utilisé est généralement introselect bien que d'autres algorithmes de sélection avec une complexité moyenne appropriée soient autorisés.

Implémentation possible

Voir également l'implémentation dans msvc stl , libstdc++ , et libc++ : (1) / (2) .

Exemple

#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
#include <ranges>
#include <string_view>
void print(std::string_view rem, std::ranges::input_range auto const& a)
{
    for (std::cout << rem; const auto e : a)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    std::array v{5, 6, 4, 3, 2, 6, 7, 9, 3};
    print("Before nth_element: ", v);
    std::ranges::nth_element(v, v.begin() + v.size() / 2);
    print("After nth_element:  ", v);
    std::cout << "The median is: " << v[v.size() / 2] << '\n';
    std::ranges::nth_element(v, v.begin() + 1, std::greater<int>());
    print("After nth_element:  ", v);
    std::cout << "The second largest element is: " << v[1] << '\n';
    std::cout << "The largest element is: " << v[0] << "\n\n";
    using namespace std::literals;
    std::array names
    {
        "Diva"sv, "Cornelius"sv, "Munro"sv, "Rhod"sv,
        "Zorg"sv, "Korben"sv, "Bender"sv, "Leeloo"sv,
    };
    print("Before nth_element: ", names);
    auto fifth_element{std::ranges::next(names.begin(), 4)};
    std::ranges::nth_element(names, fifth_element);
    print("After nth_element:  ", names);
    std::cout << "The 5th element is: " << *fifth_element << '\n';
}

Sortie :

Before nth_element: 5 6 4 3 2 6 7 9 3 
After nth_element:  2 3 3 4 5 6 6 7 9 
The median is: 5
After nth_element:  9 7 6 6 5 4 3 3 2 
The second largest element is: 7
The largest element is: 9
Before nth_element: Diva Cornelius Munro Rhod Zorg Korben Bender Leeloo 
After nth_element:  Diva Cornelius Bender Korben Leeloo Rhod Munro Zorg 
The 5th element is: Leeloo

Voir aussi

retourne le plus grand élément d'une plage
(objet fonction d'algorithme)
retourne le plus petit élément d'une plage
(objet fonction d'algorithme)
divise une plage d'éléments en deux groupes
(objet fonction d'algorithme)
trie les N premiers éléments d'une plage
(objet fonction d'algorithme)
trouve le Nième élément si la plage était triée
(patron de fonction)