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)));
}
出力