最終更新日時(UTC):
が更新

履歴 編集

function
<span>

std::span::subspan(C++20)

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)であればOffsetiCountNとし、(2)であればoffseticountNとして、

戻り値

  • (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

処理系

参照