Namespaces
Variants

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

Von de.cppreference.net
 
 
Bereichsbibliothek
Bereichsadapter
 
 
constexpr auto size()
    requires(sized_range<Views> && ...);
(1) (seit C++26)
constexpr auto size() const
    requires(sized_range<const Views> && ...);
(2) (seit C++26)

Gibt die Anzahl der Elemente zurück.

Äquivalent zu
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_ )
       );
.

Rückgabewert

Wie oben beschrieben.

Komplexität

Konstante.

Hinweise

Die Komplexität von concat_view ist konstant (obwohl sie in einigen Fällen eine lineare Funktion der Anzahl der zusammengeführten Bereiche ist, was ein statisch bekannter Parameter dieser Ansicht ist), weil die Zeitkomplexität, wie von den Ranges-Konzepten gefordert, formal in Bezug auf die Gesamtzahl der Elemente (die Größe) eines gegebenen Bereichs ausgedrückt wird und nicht in Bezug auf die statisch bekannten Parameter dieses Bereichs.

Beispiel

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

Ausgabe:

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]

Siehe auch

gibt einen ganzzahligen Wert zurück, der der Größe eines Ranges entspricht
(Anpassungspunktobjekt)
gibt einen vorzeichenbehafteten ganzzahligen Wert zurück, der der Größe eines Ranges entspricht
(Anpassungspunktobjekt)