std::span::subspan(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸŽ€ NAME πŸŽ€

You're reading the std::span::subspan(3) page from the C++ Standard Libary manual, bestie. The name is literally std::span::subspan β€” as in std::span::subspan - std::span::subspan. That's it. That's the name. Slay.

✨ Synopsis ✨

Okay so here's the signature tea, don't spill it:

template< std::size_t Offset,
          std::size_t Count = std::dynamic_extent >         (1)
(since C++20)
constexpr std::span<element_type, E /* see below */>
    subspan() const;

constexpr std::span<element_type, std::dynamic_extent>
    subspan( size_type Offset,                              (2)
(since C++20)
             size_type Count = std::dynamic_extent ) const;

Obtains a span that is a view over the Count elements of this span starting at offset Offset. If Count is std::dynamic_extent, the number of elements in the subspan is size() - offset (i.e., it ends at the end of *this).

Overload (1) is ill-formed if:

  • Offset is greater than Extent, or
  • Count is not std::dynamic_extent and Count is greater than Extent - Offset.
⚠️ The behavior is undefined if either Offset or Count is out of range. This happens if: - Offset is greater than size(), or - Count is not std::dynamic_extent and Count is greater than size() - Offset.

The extent E of the span returned by (1) is determined as follows:

  • If Count is not std::dynamic_extent, Count;
  • Otherwise, if Extent is not std::dynamic_extent, Extent - Offset;
  • Otherwise, std::dynamic_extent.

πŸ’– Return value πŸ’–

The requested subspan r, such that r.data() == this->data() + Offset. If Count is std::dynamic_extent, r.size() == this->size() - Offset; otherwise r.size() == Count.

🌸 Example 🌸

Run this code, bestie:

// Run this code

#include <algorithm>
#include <cstdio>
#include <numeric>
#include <ranges>
#include <span>

void display(std::span<const char> abc)
{
    const auto columns{20U};
    const auto rows{abc.size() - columns + 1};

    for (auto offset{0U}; offset < rows; ++offset)
    {
        std::ranges::for_each(abc.subspan(offset, columns),
       std::putchar);
        std::putchar('\n');
    }
}

int main()
{
    char abc[26];
    std::iota(std::begin(abc), std::end(abc), 'A');
    display(abc);
}

🫢 Output 🫢

ABCDEFGHIJKLMNOPQRST
BCDEFGHIJKLMNOPQRSTU
CDEFGHIJKLMNOPQRSTUV
DEFGHIJKLMNOPQRSTUVW
EFGHIJKLMNOPQRSTUVWX
FGHIJKLMNOPQRSTUVWXY
GHIJKLMNOPQRSTUVWXYZ

🌈 See also 🌈

  • first β€” obtains a subspan consisting of the first N elements of the sequence (public member function)
  • last β€” obtains a subspan consisting of the last N elements of the sequence (public member function)

Source/version cuties: http://cppreference.com, dated 2024.06.10. That's the whole page, bestie β€” go be iconic with your subspan πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from