Namespaces
Variants

std::ranges::concat_view<Vistas...>::size

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
constexpr auto size()
    requires(sized_range<Views> && ...);
(1) (desde C++26)
constexpr auto size() const
    requires(sized_range<const Views> && ...);
(2) (desde C++26)

Devuelve el número de elementos.

Equivalente a
return std::apply
       (
           [](auto... sizes)
           {
               using CT = ranges::common_type_t<decltype(sizes)...>;
               return (make-unsigned-like-t <CT>(sizes) + ...);
           },
           tuple-transform (ranges::size, views_ )
       );
.

Valor de retorno

Como se describió anteriormente.

Complejidad

Constante.

Notas

La complejidad de concat_view es de tiempo constante (aunque en algunos casos sea una función lineal del número de rangos que concatena, el cual es un parámetro estáticamente conocido de esta vista) porque la complejidad temporal, según lo requieren los conceptos de rangos, se expresa formalmente con respecto al número total de elementos (el tamaño) de un rango dado, y no a los parámetros estáticamente conocidos de ese rango.

Ejemplo

#include <cassert>
#include <forward_list>
#include <list>
#include <print>
#include <ranges>

int main()
{
    constexpr static auto a = {1, 2};
    constexpr static auto b = {1, 2, 3};
    constexpr static auto c = {1, 2, 3, 4};

    constexpr auto con{std::views::concat(a, b, c)};
    static_assert(std::ranges::sized_range<decltype(con)>);
    static_assert(con.size() == 2 + 3 + 4);
    std::println("con = {}", con);

    std::forward_list d = b;
    static_assert(not std::ranges::sized_range<std::forward_list<int>>);
    const auto cat{std::views::concat(b, c, d)};
    static_assert(not std::ranges::sized_range<decltype(cat)>);
    // auto x = cat.size(); // error: cat is not sized_range because of d
    std::println("cat = {}", cat);

    std::list e = c;
    const auto dog{std::views::concat(a, b, e)};
    static_assert(std::ranges::sized_range<decltype(dog)>);
    assert(dog.size() == 2 + 3 + 4);
    std::println("dog = {}", dog);
}

Salida:

con = [1, 2, 1, 2, 3, 1, 2, 3, 4]
cat = [1, 2, 3, 1, 2, 3, 4, 1, 2, 3]
dog = [1, 2, 1, 2, 3, 1, 2, 3, 4]

Véase también

devuelve un entero igual al tamaño de un rango
(objeto de punto de personalización)
devuelve un entero con signo igual al tamaño de un rango
(objeto de punto de personalización)