Difference between revisions of "cpp/container/span/subspan"
From cppreference.com
(P1227) |
Andreas Krug (Talk | contribs) m (Capitalized 1st letter) |
||
(8 intermediate revisions by 6 users not shown) | |||
Line 2: | Line 2: | ||
{{cpp/container/span/navbar}} | {{cpp/container/span/navbar}} | ||
{{dcl begin}} | {{dcl begin}} | ||
− | {{dcl | num=1| 1= | + | {{dcl|since=c++20|num=1|1= |
template< std::size_t Offset, | template< std::size_t Offset, | ||
std::size_t Count = std::dynamic_extent > | std::size_t Count = std::dynamic_extent > | ||
− | constexpr std::span<element_type, E /* see below */> subspan() const; | + | constexpr std::span<element_type, E /* see below */> |
+ | subspan() const; | ||
}} | }} | ||
− | {{dcl | num=2|1= | + | {{dcl|since=c++20|num=2|1= |
− | constexpr std::span<element_type, std::dynamic_extent> | + | constexpr std::span<element_type, std::dynamic_extent> |
− | subspan( | + | subspan( size_type Offset, |
− | + | size_type Count = std::dynamic_extent ) const; | |
}} | }} | ||
{{dcl end}} | {{dcl end}} | ||
− | Obtains a span that is a view over the {{ | + | Obtains a span that is a view over the {{c|Count}} elements of this span starting at offset {{c|Offset}}. If {{c|Count}} is {{lc|std::dynamic_extent}}, the number of elements in the subspan is {{c|size() - offset}} (i.e., it ends at the end of {{c|*this}}). |
− | The behavior is undefined if either {{ | + | @1@ Is ill-formed if |
− | * {{ | + | * {{c|Offset}} is greater than {{c|Extent}}, or |
− | * {{ | + | * {{c|Count}} is not {{lc|std::dynamic_extent}} and {{c|Count}} is greater than {{c|Extent - Offset}}. |
+ | |||
+ | The behavior is undefined if either {{c|Offset}} or {{c|Count}} is out of range. This happens if | ||
+ | * {{c|Offset}} is greater than {{lc|size()}}, or | ||
+ | * {{c|Count}} is not {{lc|std::dynamic_extent}} and {{c|Count}} is greater than {{c|size() - Offset}}. | ||
The extent {{tt|E}} of the span returned by {{v|1}} is determined as follows: | The extent {{tt|E}} of the span returned by {{v|1}} is determined as follows: | ||
− | * If {{ | + | * If {{c|Count}} is not {{lc|std::dynamic_extent}}, {{c|Count}}; |
− | * Otherwise, if {{tt|Extent}} is not {{ | + | * Otherwise, if {{tt|Extent}} is not {{lc|std::dynamic_extent}}, {{c|Extent - Offset}}; |
− | * Otherwise, {{ | + | * Otherwise, {{lc|std::dynamic_extent}}. |
− | === Return value === | + | ===Return value=== |
− | The requested subspan {{tt|r}}, such that {{c|1=r.data() == this->data() + Offset}}. If {{ | + | The requested subspan {{tt|r}}, such that {{c|1=r.data() == this->data() + Offset}}. If {{c|Count}} is {{lc|std::dynamic_extent}}, {{c|1=r.size() == this->size() - Offset}}; otherwise {{c|1=r.size() == Count}}. |
+ | |||
+ | ===Example=== | ||
+ | {{example | ||
+ | |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 === | + | ===See also=== |
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/container/span/dsc first}} | + | {{dsc inc|cpp/container/span/dsc first}} |
− | {{dsc inc | cpp/container/span/dsc last}} | + | {{dsc inc|cpp/container/span/dsc last}} |
{{dsc end}} | {{dsc end}} | ||
− | {{langlinks|ja|zh}} | + | {{langlinks|de|es|ja|ru|zh}} |
Latest revision as of 04:34, 5 November 2023
template< std::size_t Offset, std::size_t Count = std::dynamic_extent > |
(1) | (since C++20) |
constexpr std::span<element_type, std::dynamic_extent> subspan( size_type Offset, |
(2) | (since C++20) |
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).
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.
[edit] 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.
[edit] Example
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
[edit] See also
obtains a subspan consisting of the first N elements of the sequence (public member function) | |
obtains a subspan consisting of the last N elements of the sequence (public member function) |