std::span
cppreference.com
<tbody>
</tbody>
template< class T, std::size_t Extent = std::dynamic_extent > class span; |
( C++20) | |
span , . span , , .
span , : T .
span : T.
|
|
( C++23) |
| T | ; , | |
| Extent | std::dynamic_extent,
|
element_type
|
T
|
value_type
|
std::remove_cv_t<T>
|
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
pointer
|
T*
|
const_pointer
|
const T*
|
reference
|
T&
|
const_reference
|
const T&
|
iterator
|
LegacyRandomAccessIterator, ConstexprIterator contiguous_iterator, value_type value_type
|
const_iterator(C++23)
|
std::const_iterator<iterator>
|
reverse_iterator
|
std::reverse_iterator<iterator>
|
const_reverse_iterator(C++23)
|
std::const_iterator<reverse_iterator>
|
: iterator , T .
Container iterator span.
<tbody> </tbody>
static constexpr std::size_t extent = Extent; |
( C++20) | |
-
(C++20) |
span (public -) |
(C++20) |
span (public -) |
(C++11) |
(public -) |
(C++11) |
(public -) |
(C++11) |
(public -) |
(C++11) |
(public -) |
(C++20) |
(public -) |
(C++20) |
(public -) |
(C++20) |
(public -) |
(C++20) |
(public -) |
(C++20) |
(public -) |
(C++20) |
(public -) |
(C++20) |
, (public -) |
(C++20) |
, N (public -) |
(C++20) |
, N (public -) |
(C++20) |
(public -) |
,
(C++20) |
span , ( ) |
,
(C++20) |
size_t, , span () |
<tbody> </tbody>
template<class T, std::size_t Extent> inline constexpr bool ranges::enable_borrowed_range<std::span<T, Extent>> = true; |
||
ranges::enable_borrowed_range span borrowed_range.
template<class T, std::size_t Extent> inline constexpr bool ranges::enable_view<std::span<T, Extent>> = Extent == 0 || Extent == dynamic_extent; |
||
ranges::enable_view span view.
std::span , , C++23.
__cpp_lib_span |
202002L |
(C++20) | std::span
|
std::span .
#include <algorithm>
#include <cstddef>
#include <iostream>
#include <span>
template<class T, std::size_t N>
[[nodiscard]]
constexpr auto slide(std::span<T,N> s, std::size_t offset, std::size_t width) {
return s.subspan(offset, offset + width <= s.size() ? width : 0U);
}
template<class T, std::size_t N, std::size_t M>
constexpr bool starts_with(std::span<T,N> data, std::span<T,M> prefix) {
return data.size() >= prefix.size()
&& std::equal(prefix.begin(), prefix.end(), data.begin());
}
template<class T, std::size_t N, std::size_t M>
constexpr bool ends_with(std::span<T,N> data, std::span<T,M> suffix) {
return data.size() >= suffix.size()
&& std::equal(data.end() - suffix.size(), data.end(),
suffix.end() - suffix.size());
}
template<class T, std::size_t N, std::size_t M>
constexpr bool contains(std::span<T,N> span, std::span<T,M> sub) {
return std::ranges::search(span, sub).begin() != span.end();
}
void print(const auto& seq) {
for (const auto& elem : seq) std::cout << elem << ' ';
std::cout << '\n';
}
int main()
{
constexpr int a[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
constexpr int b[] { 8, 7, 6 };
for (std::size_t offset{}; ; ++offset) {
static constexpr std::size_t width{6};
auto s = slide(std::span{a}, offset, width);
if (s.empty())
break;
print(s);
}
static_assert(starts_with(std::span{a}, std::span{a,4})
&& starts_with(std::span{a+1, 4}, std::span{a+1,3})
&& !starts_with(std::span{a}, std::span{b})
&& !starts_with(std::span{a,8}, std::span{a+1,3})
&& ends_with(std::span{a}, std::span{a+6,3})
&& !ends_with(std::span{a}, std::span{a+6,2})
&& contains(std::span{a}, std::span{a+1,4})
&& !contains(std::span{a,8}, std::span{a,9}));
}
:
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
C++:
| WG | C++20 | span view
|
default_initializable
|
(C++23) |
( ) |
(C++20) |
- view ( ) |
(C++11) |
, ( ) |
(C++17) |
( ) |