Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
Определено в заголовке <ranges>
Определено в заголовке <iterator>
inline namespace /* unspecified */ {

inline constexpr auto size = /* unspecified */ ;

}
(since C++20)
(объект точки кастомизации)
Сигнатура вызова
template < class T >

requires /* see below */

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

Вычисляет количество элементов в t за постоянное время.

Для подвыражения, в котором subexpression обозначает (возможно материализованный ) результирующий объект как t , и тип E как T :

  • Если T является массивом неизвестной границы, ranges :: size ( E ) является некорректной конструкцией.
  • В противном случае, если T является типом массива, ranges :: size ( E ) является эквивалентным по выражению decay-copy  ( std:: extent_v < T > ) (до C++23) auto ( std:: extent_v < T > ) (начиная с C++23) .
  • В противном случае, если выполняются все следующие условия, ranges :: size ( E ) является эквивалентным по выражению decay-copy  ( t. size ( ) ) (до C++23) auto ( t. size ( ) ) (начиная с C++23) :
  • В противном случае, если выполняются все следующие условия, ranges :: size ( E ) является эквивалентным по выражению decay-copy  ( size ( t ) ) (до C++23) auto ( size ( t ) ) (начиная с C++23) :
  • В противном случае, если выполняются все следующие условия, ranges :: size ( E ) является эквивалентным по выражению to-unsigned-like  ( ranges:: end ( t ) - ranges:: begin ( t ) ) :
  • В противном случае, ranges :: size ( E ) является некорректно сформированным.

Вышеуказанные диагностируемые случаи с нарушением формата приводят к неудаче подстановки когда ranges :: size ( E ) появляется в непосредственном контексте инстанцирования шаблона.

Содержание

Объекты точек кастомизации

Имя ranges::size обозначает объект точки кастомизации , который является константным функциональным объектом типа литерального semiregular класса. Для подробностей см. CustomizationPointObject .

Примечания

Всякий раз, когда ranges :: size ( e ) является валидным для выражения e , возвращаемый тип является integer-like .

Стандарт C++20 требует, чтобы если базовый вызов функции size возвращает prvalue, возвращаемое значение конструируется перемещением из материализованного временного объекта. Все реализации напрямую возвращают prvalue вместо этого. Требование исправлено пост-C++20 предложением P0849R8 для соответствия реализациям.

Выражение ranges:: distance ( e ) также может использоваться для определения размера диапазона e . В отличие от ranges :: size ( e ) , ranges:: distance ( e ) работает даже если e является диапазоном без размера, ценой линейной сложности в этом случае.

Пример

#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);
}

Вывод:

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

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P2602R2 C++20 there's machinery to prohibit certain non-member size found by ADL removed such machinery

Смотрите также

возвращает знаковое целое число, равное размеру диапазона
(объект точки кастомизации)
указывает, что диапазон знает свой размер за постоянное время
(концепт)
возвращает расстояние между итератором и стражем, или между началом и концом диапазона
(функциональный объект алгоритма)
(C++17) (C++20)
возвращает размер контейнера или массива
(шаблон функции)