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)
概要
任意の位置から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);
- ここで戻り値の型の第2テンプレート引数は以下になる:
Count != dynamic_extent ? Count : (Extent != dynamic_extent ? Extent - Offset : dynamic_extent)
-
(2) : 以下と等価:
return {data() + offset, count == dynamic_extent ? size() - offset : count};
計算量
定数時間
例
#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;
}
}
出力
3
4
5
3
4
5
バージョン
言語
- C++20
処理系
- Clang: 9.0 ✅
- GCC: ??
- Visual C++: ??