Namespaces
Variants

std::ranges:: nth_element

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
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éorganise les éléments dans [ first , last ) de telle sorte que :

  • L'élément pointé par nth est modifié pour devenir l'élément qui se trouverait à cette position si [ first , last ) était trié par rapport à comp et proj .
  • Tous les éléments précédant ce nouvel élément nth sont inférieurs ou égaux à les éléments suivant le nouveau nth . C'est-à-dire que pour tout itérateur i , j dans les intervalles [ first , nth ) , [ nth , last ) 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 fonction de comparaison binaire donné comp et l'objet de projection proj .
2) Identique à (1) , mais utilise r comme plage, comme si on utilisait 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 fonction d'algorithme (informellement appelés niebloids ), c'est-à-dire :

Table des matières

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 dans une plage
(objet fonction algorithme)
retourne le plus petit élément dans une plage
(objet fonction algorithme)
divise une plage d'éléments en deux groupes
(objet fonction algorithme)
trie les N premiers éléments d'une plage
(objet fonction algorithme)
trie partiellement la plage donnée en s'assurant qu'elle est partitionnée par l'élément donné
(modèle de fonction)