最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

function
<valarray>

# std::valarray::operator>>=

    valarray<T>& operator>>=(const ValOrProxy<T>& xs); // (1)
    valarray<T>& operator>>=(const T& x);              // (2)

## 概要

右シフトの複合代入を行う。

- (1) : `*this`の各要素に、`xs`の各要素の値だけ右シフトした結果を代入する。
- (2) : `*this`の各要素に、`x`の値だけ右シフトした結果を代入する。

## 効果

- (1) : 以下のコードと等価のことを行う：

    for (std::size_t i = 0; i < size(); ++i) {
      (*this)[i] >>= xs[i];
    }

- (2) : 以下のコードと等価のことを行う：

    for (std::size_t i = 0; i < size(); ++i) {
      (*this)[i] >>= x;
    }

## 戻り値

`*this`

## 備考

- 引数の型 `ValOrProxy` は、`valarray`、あるいは、その代理となる型である。
  `<valarray>` の概要も参照のこと。
- (1) : `*this` と `xs` の要素数が異なる場合、未定義動作を引き起こす。

## 例

    #include <cassert>
    #include <valarray>
    #include <cstdint>
    #include <algorithm>

    template <class T>
    bool equal_valarray(const std::valarray<T>& a, const std::valarray<T>& b)
    {
      const std::valarray<bool> result = a == b;
      return std::all_of(std::begin(result), std::end(result), [](bool b) { return b; });
    }

    int main()
    {
      const std::valarray<std::uint8_t> a = {
        0b01010001,
        0b10100000,
        0b01011000
      };
      const std::valarray<std::uint8_t> b = {
        4,
        4,
        4
      };
      const std::valarray<std::uint8_t> expected = {
        0b00000101,
        0b00001010,
        0b00000101
      };

      std::valarray<std::uint8_t> result1 = a;
      result1 >>= b;
      assert((equal_valarray(result1, expected)));

      std::valarray<std::uint8_t> result2 = a;
      result2 >>= 4;
      assert((equal_valarray(result2, expected)));
    }

### 出力