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

来自cppreference.com
< cpp‎ | ranges‎ | concat view
 
 
范围库
范围适配器
 
 
constexpr auto size()
    requires(sized_range<Views> && ...);
(1) (C++26 起)
constexpr auto size() const
    requires(sized_range<const Views> && ...);
(2) (C++26 起)

返回元素数量。

等价于 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_ )
       );

返回值

如上所述。

复杂度

常数。

注解

concat_view 的复杂度是常数时间(即便某些情况下是它所拼接范围数量的线性函数,且它是这个视图的一项静态已知的形参时也是如此),这是因为范围概念所规定的时间复杂度形式上是基于给定范围的元素总数(大小)表述的,而非基于该范围的静态已知形参。

示例

基本版本可以在 Compiler Explorer 上测试。

#include <cassert>
#include <forward_list>
#include <list>
#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::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: 由于 d,cat 并不是 sized_range
 
    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);
}

参阅

返回等于范围大小的整数
(定制点对象)
返回等于范围大小的有符号整数
(定制点对象)