- span[meta header]
- std[meta namespace]
- span[meta class]
- function[meta id-type]
- cpp20[meta cpp]
template <std::size_t Offset, std::size_t Count = dynamic_extent>
constexpr span<element_type, see below>
subspan() const; // (1)
constexpr span<element_type, dynamic_extent>
subspan(size_type offset, size_type count = dynamic_extent) const; // (2)- dynamic_extent[link /reference/span/dynamic_extent.md]
任意の位置からN個の要素を参照するspanオブジェクトを取得する。
- (1) : テンプレートパラメータで指定された任意の開始位置
Offsetと要素数Countにしたがって要素を取り出す - (2) : パラメータで指定された任意の開始位置
offsetと要素数countにしたがって要素を取り出す
- (1) :
Offset <= Extent && (Count ==dynamic_extent|| Count <= Extent - Offset)がtrueであること
(1)であればOffsetをi、CountをNとし、(2)であればoffsetをi、countをNとして、
i <=size()&& (N ==dynamic_extent|| N <=size()- i)がtrueであること
-
(1) : 以下と等価:
return span<ElementType, see below>( data() + Offset, Count != dynamic_extent ? Count : size() - Offset);
- data()[link data.md]
- dynamic_extent[link /reference/span/dynamic_extent.md]
- size()[link size.md]
- ここで戻り値の型の第2テンプレート引数は以下になる:
Count != dynamic_extent ? Count : (Extent != dynamic_extent ? Extent - Offset : dynamic_extent)
-
(2) : 以下と等価:
return {data() + offset, count == dynamic_extent ? size() - offset : count};
- data()[link data.md]
- dynamic_extent[link /reference/span/dynamic_extent.md]
- size()[link size.md]
定数時間
#include <iostream>
#include <span>
#include <vector>
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5};
std::span<int> s = std::span{v};
// (1) : テンプレート引数として開始位置と要素数を指定して、要素を取得する。
// テンプレート内でこのオーバーロードを使用する場合、s.template subspan<2, 3>(); のように、
// template限定子の指定が必要になることに注意
std::span<int, 3> static_span = s.subspan<2, 3>();
for (int x : static_span) {
std::cout << x << std::endl;
}
std::cout << std::endl;
// (2) : 引数として開始位置と要素数を指定して、要素を取得する
std::span<int, std::dynamic_extent> dynamic_span = s.subspan(2, 3);
for (int x : dynamic_span) {
std::cout << x << std::endl;
}
}- subspan[color ff0000]
3
4
5
3
4
5
- C++20
- Clang: 9.0 [mark verified]
- GCC: ??
- Visual C++: ??