最終更新日時:
が更新

履歴 編集

function template
<simd>

std::simd::compress(C++26)

namespace std::simd {
  template<simd-vec-type V>
  constexpr V
    compress(const V& v,
             const typename V::mask_type& selector); // (1) C++26
  template<simd-mask-type V>
  constexpr V
    compress(const V& v,
             const type_identity_t<V>& selector);    // (2) C++26

  template<simd-vec-type V>
  constexpr V
    compress(const V& v,
             const typename V::mask_type& selector,
             const typename V::value_type& fill_value); // (3) C++26
  template<simd-mask-type V>
  constexpr V
    compress(const V& v,
             const type_identity_t<V>& selector,
             const typename V::value_type& fill_value); // (4) C++26
}

概要

compressは、basic_vecbasic_maskの要素のうち、マスクselectortrueである要素だけを、順序を維持したまま先頭に詰めたデータ並列オブジェクトを返す関数である。

trueである要素の個数をnとすると、結果の先頭n要素に、元のオブジェクトでselectortrueだった要素が昇順に並ぶ。残りの要素の値は以下のように決まる。

  • (1), (2) fill_valueを指定しない場合 : 残りの要素は妥当だが未規定の値となる
  • (3), (4) fill_valueを指定する場合 : 残りの要素はfill_valueで埋められる

逆の操作はexpandである。

戻り値

selectortrueであるi番目の要素をvから昇順に取り出して先頭に詰め、残りを未規定値((1), (2))またはfill_value((3), (4))で埋めたデータ並列オブジェクト。

例外

投げない

#include <simd>
#include <print>

namespace simd = std::simd;

int main()
{
  simd::vec<int, 4> v([](int i) { return i + 1; });  // {1, 2, 3, 4}

  // 偶数の要素だけを先頭に詰める。残りは0で埋める
  auto selector = (v % 2 == 0);             // {false, true, false, true}
  auto r = simd::compress(v, selector, 0);  // {2, 4, 0, 0}

  for (int i = 0; i < r.size(); ++i)
    std::print("{} ", r[i]);
  std::println("");
}

出力

2 4 0 0 

バージョン

言語

  • C++26

処理系

関連項目

参照