Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
Défini dans l'en-tête <ranges>
Défini dans l'en-tête <iterator>
inline namespace /* unspecified */ {

inline constexpr auto size = /* unspecified */ ;

}
(depuis C++20)
(objet de point de personnalisation)
Signature d'appel
template < class T >

requires /* voir ci-dessous */

constexpr auto size ( T && t ) ;
(depuis C++20)

Calcule le nombre d'éléments dans t en temps constant.

Étant donné la sous-expression dont t désigne l'objet résultat (éventuellement matérialisé ) comme E , et le type de E comme T :

Les cas mal formés diagnostiquables ci-dessus entraînent un échec de substitution lorsque ranges :: size ( E ) apparaît dans le contexte immédiat d'une instanciation de modèle.

Table des matières

Objets de point de personnalisation

Le nom ranges::size désigne un objet de point de personnalisation , qui est un objet fonction constant d'un type de classe littéral semiregular . Voir CustomizationPointObject pour plus de détails.

Notes

Chaque fois que ranges :: size ( e ) est valide pour une expression e , le type de retour est integer-like .

La norme C++20 exige que si l'appel sous-jacent à la fonction size retourne une prvalue, la valeur de retour soit construite par déplacement à partir de l'objet temporaire matérialisé. Toutes les implémentations retournent directement la prvalue à la place. L'exigence est corrigée par la proposition post-C++20 P0849R8 pour correspondre aux implémentations.

L'expression ranges:: distance ( e ) peut également être utilisée pour déterminer la taille d'une plage e . Contrairement à ranges :: size ( e ) , ranges:: distance ( e ) fonctionne même si e est une plage non dimensionnée, au prix d'une complexité linéaire dans ce cas.

Exemple

#include <iostream>
#include <ranges>
#include <type_traits>
#include <vector>
int main()
{
    auto v = std::vector<int>{};
    std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n';
    auto il = {7};     // std::initializer_list
    std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n';
    int array[]{4, 5}; // array has a known bound
    std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n';
    static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false);
}

Sortie :

ranges::size(v) == 0
ranges::size(il) == 1
ranges::size(array) == 2

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 Appliqué à Comportement publié Comportement corrigé
P2602R2 C++20 il existe un mécanisme pour interdire certains size non-membres trouvés par ADL suppression de ce mécanisme

Voir aussi

retourne un entier signé égal à la taille d'un intervalle
(objet de point de personnalisation)
spécifie qu'un intervalle connaît sa taille en temps constant
(concept)
retourne la distance entre un itérateur et un sentinelle, ou entre le début et la fin d'un intervalle
(objet fonction algorithme)
(C++17) (C++20)
retourne la taille d'un conteneur ou d'un tableau
(modèle de fonction)