Constrained algorithms (since C++20)
C++20 fournit
des versions contraintes
de la plupart des algorithmes dans l'espace de noms
std::ranges
. Dans ces algorithmes, une plage peut être spécifiée soit comme une paire
itérateur
-
sentinelle
, soit comme un unique argument de
range
, et les projections et les objets appelables de type pointeur-sur-membre sont pris en charge. De plus, les
types de retour
de la plupart des algorithmes ont été modifiés pour renvoyer toutes les informations potentiellement utiles calculées durant l'exécution de l'algorithme.
Objets fonction d'algorithmes
Un objet-fonction algorithme (AFO), informellement appelé niebloid , est un objet de point de personnalisation (CPO) qui est spécifié comme une ou plusieurs surcharges de modèles de fonction. Le nom de ces modèles de fonction désigne l'objet-fonction algorithme correspondant.
Pour un objet fonction d'algorithme
o
, soit
S
l'ensemble correspondant de modèles de fonction. Alors pour toute séquence d'arguments
args...
,
o
(
args...
)
est
expression-équivalent
à
s
(
args...
)
, où le résultat de la recherche de nom pour
s
est l'ensemble de surcharge
S
.
Les algorithmes contraints dans l'espace de noms
std::ranges
sont définis comme des objets fonction algorithme. En conséquence :
- Les listes d'arguments de template explicites ne peuvent pas être spécifiées lors de l'appel de l'une d'entre elles.
- Aucune d'entre elles n'est visible pour la recherche dépendante des arguments .
- Lorsque l'une d'entre elles est trouvée par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Algorithmes contraints
|
Défini dans l'en-tête
<algorithm>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
Opérations de séquence non modifiantes |
|
|
(C++20)
(C++20)
(C++20)
|
vérifie si un prédicat est
true
pour tous, certains ou aucun des éléments d'un intervalle
(objet fonction algorithme) |
|
(C++20)
|
applique un
objet fonction
unaire aux éléments d'un
intervalle
(objet fonction d'algorithme) |
|
(C++20)
|
applique un objet fonction aux N premiers éléments d'une séquence
(objet fonction d'algorithme) |
|
(C++20)
(C++20)
|
retourne le nombre d'éléments satisfaisant des critères spécifiques
(objet fonction algorithme) |
|
(C++20)
|
trouve la première position où deux plages diffèrent
(objet fonction algorithme) |
|
(C++20)
|
détermine si deux ensembles d'éléments sont identiques
(objet fonction algorithme) |
|
(C++20)
|
renvoie
true
si une plage est lexicographiquement inférieure à une autre
(objet fonction algorithme) |
|
(C++20)
(C++20)
(C++20)
|
trouve le premier élément satisfaisant des critères spécifiques
(objet fonction algorithme) |
|
(C++23)
(C++23)
(C++23)
|
trouve le dernier élément satisfaisant des critères spécifiques
(objet fonction algorithme) |
|
(C++20)
|
trouve la dernière séquence d'éléments dans une certaine plage
(objet fonction algorithme) |
|
(C++20)
|
recherche l'un quelconque des éléments d'un ensemble
(objet fonction algorithme) |
|
(C++20)
|
trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(objet fonction algorithme) |
|
(C++20)
|
recherche la première occurrence d'une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
recherche la première occurrence d'un nombre de copies consécutives d'un élément dans une plage
(objet fonction algorithme) |
|
(C++23)
(C++23)
|
vérifie si la plage contient l'élément ou la sous-plage donnée
(objet fonction algorithme) |
|
(C++23)
|
vérifie si une plage commence par une autre plage
(objet fonction algorithme) |
|
(C++23)
|
vérifie si une plage se termine par une autre plage
(objet fonction algorithme) |
Opérations de modification de séquence |
|
|
(C++20)
(C++20)
|
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
(C++20)
|
copie un certain nombre d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
(C++20)
|
copie une plage d'éléments dans l'ordre inverse
(objet fonction algorithme) |
|
(C++20)
|
déplace une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
(C++20)
|
déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse
(objet fonction algorithme) |
|
(C++20)
|
attribue une certaine valeur à une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
assigne une valeur à un certain nombre d'éléments
(objet fonction algorithme) |
|
(C++20)
|
applique une fonction à une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
sauvegarde le résultat d'une fonction dans un intervalle
(objet fonction algorithme) |
|
(C++20)
|
sauvegarde le résultat de N applications d'une fonction
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
supprime les éléments satisfaisant des critères spécifiques
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
remplace toutes les valeurs satisfaisant des critères spécifiques par une autre valeur
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
copie une plage en remplaçant les éléments satisfaisant des critères spécifiques par une autre valeur
(objet fonction algorithme) |
|
(C++20)
|
échange deux plages d'éléments
(objet fonction algorithme) |
|
(C++20)
|
inverse l'ordre des éléments dans une plage
(objet fonction algorithme) |
|
(C++20)
|
crée une copie d'une plage qui est inversée
(objet fonction algorithme) |
|
(C++20)
|
fait pivoter l'ordre des éléments dans une plage
(objet fonction algorithme) |
|
(C++20)
|
copie et fait pivoter une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
réorganise aléatoirement les éléments dans une plage
(objet fonction algorithme) |
|
décale les éléments dans une plage
(objet fonction algorithme) |
|
|
(C++20)
|
sélectionne N éléments aléatoires d'une séquence
(objet fonction algorithme) |
|
(C++20)
|
supprime les éléments dupliqués consécutifs dans une plage
(objet fonction algorithme) |
|
(C++20)
|
crée une copie d'une plage d'éléments qui ne contient pas de doublons consécutifs
(objet fonction algorithme) |
Opérations de partitionnement |
|
|
(C++20)
|
détermine si la plage est partitionnée par le prédicat donné
(objet fonction algorithme) |
|
(C++20)
|
divise une plage d'éléments en deux groupes
(objet fonction algorithme) |
|
(C++20)
|
copie une plage en divisant les éléments en deux groupes
(objet fonction algorithme) |
|
(C++20)
|
divise les éléments en deux groupes tout en préservant leur ordre relatif
(objet fonction algorithme) |
|
(C++20)
|
localise le point de partition d'une plage partitionnée
(objet fonction algorithme) |
Opérations de tri |
|
|
(C++20)
|
vérifie si une plage est triée par ordre croissant
(objet fonction algorithme) |
|
(C++20)
|
trouve la plus grande sous-plage triée
(objet fonction algorithme) |
|
(C++20)
|
trie une plage en ordre croissant
(objet fonction algorithme) |
|
(C++20)
|
trie les N premiers éléments d'une plage
(objet fonction algorithme) |
|
(C++20)
|
copie et trie partiellement une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
trie une plage d'éléments en préservant l'ordre entre les éléments égaux
(objet fonction algorithme) |
|
(C++20)
|
trie partiellement la plage donnée en s'assurant qu'elle est partitionnée par l'élément donné
(objet fonction algorithme) |
Opérations de recherche binaire (sur des plages triées) |
|
|
(C++20)
|
retourne un itérateur vers le premier élément
non inférieur
à la valeur donnée
(objet fonction algorithme) |
|
(C++20)
|
retourne un itérateur vers le premier élément
supérieur
à une certaine valeur
(objet fonction algorithme) |
|
(C++20)
|
détermine si un élément existe dans une plage partiellement ordonnée
(objet fonction algorithme) |
|
(C++20)
|
renvoie la plage d'éléments correspondant à une clé spécifique
(objet fonction algorithme) |
Opérations sur les ensembles (sur des plages triées) |
|
|
(C++20)
|
fusionne deux plages triées
(objet fonction algorithme) |
|
(C++20)
|
fusionne deux plages ordonnées en place
(objet fonction algorithme) |
|
(C++20)
|
renvoie
true
si une séquence est une sous-séquence d'une autre
(objet fonction algorithme) |
|
(C++20)
|
calcule la différence entre deux ensembles
(objet fonction algorithme) |
|
(C++20)
|
calcule l'intersection de deux ensembles
(objet fonction algorithme) |
|
(C++20)
|
calcule la différence symétrique entre deux ensembles
(objet fonction algorithme) |
|
(C++20)
|
calcule l'union de deux ensembles
(objet fonction algorithme) |
Opérations sur le tas |
|
|
(C++20)
|
vérifie si la plage donnée est un tas maximum
(objet fonction algorithme) |
|
(C++20)
|
trouve le plus grand sous-intervalle qui est un tas maximum
(objet fonction algorithme) |
|
(C++20)
|
crée un tas maximum à partir d'une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
ajoute un élément à un tas maximum
(objet fonction algorithme) |
|
(C++20)
|
supprime le plus grand élément d'un tas maximum
(objet fonction algorithme) |
|
(C++20)
|
transforme un tas maximum en une plage d'éléments triés par ordre croissant
(objet fonction algorithme) |
Opérations minimum/maximum |
|
|
(C++20)
|
retourne la plus grande des valeurs données
(objet fonction algorithme) |
|
(C++20)
|
retourne le plus grand élément dans une plage
(objet fonction algorithme) |
|
(C++20)
|
renvoie la plus petite des valeurs données
(objet fonction algorithme) |
|
(C++20)
|
renvoie le plus petit élément dans une plage
(objet fonction algorithme) |
|
(C++20)
|
retourne le plus petit et le plus grand de deux éléments
(fonction objet d'algorithm) |
|
(C++20)
|
retourne les plus petits et les plus grands éléments dans une plage
(objet fonction algorithme) |
|
(C++20)
|
limite une valeur entre une paire de valeurs limites
(objet fonction algorithme) |
Opérations de permutation |
|
|
(C++20)
|
détermine si une séquence est une permutation d'une autre séquence
(objet fonction algorithme) |
|
(C++20)
|
génère la prochaine permutation lexicographique supérieure d'une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
génère la permutation lexicographique précédente d'une plage d'éléments
(objet fonction algorithme) |
Opérations numériques contraintes
|
Défini dans l'en-tête
<numeric>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
|
(C++23)
|
remplit une plage avec des incréments successifs de la valeur de départ
(objet fonction algorithme) |
Opérations de pliage contraintes
|
Défini dans l'en-tête
<algorithm>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
|
(C++23)
|
plie à gauche une plage d'éléments
(objet fonction algorithme) |
|
(C++23)
|
plie à gauche une plage d'éléments en utilisant le premier élément comme valeur initiale
(objet fonction algorithme) |
|
(C++23)
|
plie à droite une plage d'éléments
(objet fonction algorithme) |
|
(C++23)
|
plie à droite une plage d'éléments en utilisant le dernier élément comme valeur initiale
(objet fonction algorithme) |
|
(C++23)
|
plie à gauche une plage d'éléments et retourne une
paire
(itérateur, valeur)
(objet fonction algorithme) |
|
plie à gauche une plage d'éléments en utilisant le premier élément comme valeur initiale et retourne une
paire
(itérateur,
optional
)
(objet fonction algorithme) |
|
Algorithmes de mémoire non initialisée contraints
|
Défini dans l'en-tête
<memory>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
|
(C++20)
|
copie une plage d'objets vers une zone mémoire non initialisée
(objet fonction algorithme) |
|
(C++20)
|
copie un nombre d'objets vers une zone mémoire non initialisée
(objet fonction algorithme) |
|
(C++20)
|
copie un objet vers une zone mémoire non initialisée, définie par une plage
(objet fonction algorithme) |
|
(C++20)
|
copie un objet vers une zone mémoire non initialisée, définie par un début et un compte
(objet fonction algorithme) |
|
(C++20)
|
déplace une plage d'objets vers une zone mémoire non initialisée
(objet fonction algorithme) |
|
(C++20)
|
déplace un nombre d'objets vers une zone mémoire non initialisée
(objet fonction algorithme) |
|
construit des objets par
initialisation par défaut
dans une zone mémoire non initialisée, définie par une plage
(objet fonction algorithme) |
|
|
construit des objets par
initialisation par défaut
dans une zone mémoire non initialisée, définie par un début et un compte
(objet fonction algorithme) |
|
|
construit des objets par
initialisation par valeur
dans une zone mémoire non initialisée, définie par une plage
(objet fonction algorithme) |
|
|
construit des objets par
initialisation par valeur
dans une zone mémoire non initialisée, définie par un début et un compte
(objet fonction algorithme) |
|
|
(C++20)
|
détruit une plage d'objets
(objet fonction algorithme) |
|
(C++20)
|
détruit un nombre d'objets dans une plage
(objet fonction algorithme) |
|
(C++20)
|
détruit un objet à une adresse donnée
(objet fonction algorithme) |
|
(C++20)
|
crée un objet à une adresse donnée
(objet fonction algorithme) |
Algorithmes de génération de nombres aléatoires contraints
|
Défini dans l'en-tête
<random>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
|
(C++26)
|
remplit une plage avec des nombres aléatoires provenant d'un générateur de bits aléatoires uniforme
(objet fonction algorithme) |
Types de retour
|
Défini dans l'en-tête
<algorithm>
|
|
|
Défini dans l'espace de noms
std::ranges
|
|
|
(C++20)
|
fournit un moyen de stocker un itérateur et un objet fonction comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker deux itérateurs comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker deux itérateurs comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker trois itérateurs comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker trois itérateurs comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker deux objets ou références du même type comme une seule unité
(modèle de classe) |
|
(C++20)
|
fournit un moyen de stocker un itérateur et un drapeau booléen comme une seule unité
(modèle de classe) |
|
(C++23)
|
fournit un moyen de stocker un itérateur et une valeur comme une seule unité
(modèle de classe) |
|
(C++23)
|
fournit un moyen de stocker un itérateur et une valeur comme une seule unité
(modèle de classe) |
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403L
|
(C++26) | Initialisation par liste pour les algorithmes |
__cpp_lib_ranges
|
201911L
|
(C++20) | Bibliothèque de plages et algorithmes contraints |
__cpp_lib_ranges_contains
|
202207L
|
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last
|
202207L
|
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold
|
202207L
|
(C++23) |
std::ranges
algorithmes de pliage
|
__cpp_lib_ranges_iota
|
202202L
|
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with
|
202106L
|
(C++23) | std::ranges::starts_with , std::ranges::ends_with |
__cpp_lib_shift
|
201806L
|
(C++20) | std::shift_left , std::shift_right |
202202L
|
(C++23) | std::ranges::shift_left , std::ranges::shift_right | |
__cpp_lib_ranges_generate_random
|
202403L
|
(C++26) | std::ranges::generate_random |
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| P3136R1 | C++20 |
les niebloids pouvaient être spécifiés comme des entités spéciales
autres que des objets fonction |
doivent être spécifiés comme des objets fonction |