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_vecやbasic_maskの要素のうち、マスクselectorがtrueである要素だけを、順序を維持したまま先頭に詰めたデータ並列オブジェクトを返す関数である。
trueである要素の個数をnとすると、結果の先頭n要素に、元のオブジェクトでselectorがtrueだった要素が昇順に並ぶ。残りの要素の値は以下のように決まる。
- (1), (2)
fill_valueを指定しない場合 : 残りの要素は妥当だが未規定の値となる - (3), (4)
fill_valueを指定する場合 : 残りの要素はfill_valueで埋められる
逆の操作はexpandである。
戻り値
selectorがtrueである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
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdライブラリが追加された
- C++26で
- P2664R11 Proposal to extend
std::simdwith permutation API- C++26で置換API(
compress)が追加された
- C++26で置換API(