- valarray[meta header]
- std[meta namespace]
- class template[meta id-type]
namespace std {
template <class T>
class valarray;
}
valarray
は、数値演算に特化した一次元配列クラスである。
配列の全ての要素に対して、同じ操作を効率的に適用できる。たとえば、生配列で以下のように行う演算は、
int a[N];
int b[N];
int c[N];
for (std::size_t i = 0; i < N; ++i) {
c[i] = a[i] + b[i];
}
valarray
では以下のように書ける:
valarray<int> a(N);
valarray<int> b(N);
valarray<int> c = a + b;
処理系によっては、このような演算を、CPUのSIMD命令によって並列に計算するよう最適化する。
なお、戻り値型に ValOrProxy
と表記している箇所は、valarray
<T>
か代理の型のいずれかであることを、引数型に ValOrProxy
と表記している箇所は、valarray
<T>
と代理の型のいずれでも受け取ることが可能であることを表している。
<valarray>
の概要も参照のこと。
テンプレートパラメータは、以下を意味する:
名前 |
説明 |
対応バージョン |
value_type |
要素型T |
|
名前 |
説明 |
対応バージョン |
swap |
2つのvalarray オブジェクトを入れ替える |
C++11 |
名前 |
説明 |
対応バージョン |
begin |
先頭の要素を指すイテレータを取得する |
C++11 |
end |
末尾の次を指すイテレータを取得する |
C++11 |
#include <iostream>
#include <valarray>
template <class T>
void print(const char* name, const std::valarray<T>& v)
{
std::cout << name << " : {";
bool first = true;
// 範囲for文で全要素を走査する
for (const T& x : v) {
if (first) {
first = false;
}
else {
std::cout << ',';
}
std::cout << x;
}
std::cout << "}" << std::endl;
}
int main()
{
// 四則演算
// 全ての要素同士に同じ演算子を適用する
{
std::valarray<int> a = {3, 6, 9};
std::valarray<int> b = {4, 5, 6};
std::valarray<int> plus = a + b;
print("add", plus);
std::valarray<int> minus = a - b;
print("minus", minus);
std::valarray<int> multiply = a * b;
print("multiply", multiply);
std::valarray<int> divide = a / b;
print("divide", divide);
std::valarray<int> modulo = a % b;
print("modulo", modulo);
}
std::cout << std::endl;
// 数学関数
// 全ての要素に同じ関数を適用する
{
std::valarray<float> a = {0.1f, 0.2f, 0.3f};
std::valarray<float> sin = std::sin(a);
print("sin", sin);
std::valarray<float> cos = std::cos(a);
print("cos", cos);
}
std::cout << std::endl;
// 配列の一部に対して操作を行う
{
std::valarray<int> a = {1, 2, 3, 4, 5, 6};
const std::size_t start = 1u; // 開始位置
const std::size_t length = 3u; // 要素数
const std::size_t stride = 2u; // 何個置きに処理するか
// {2, 4, 6}を抽出し、その全要素を* 2する
a[std::slice(start, length, stride)] *= std::valarray<int> {2, 2, 2};
print("slice + multiply", a);
}
}
- std::valarray[color ff0000]
- std::sin[link valarray/sin.md]
- std::cos[link valarray/cos.md]
- std::slice[link slice.md]
add : {7,11,15}
minus : {-1,1,3}
multiply : {12,30,54}
divide : {0,1,1}
modulo : {3,1,3}
sin : {0.0998334,0.198669,0.29552}
cos : {0.995004,0.980067,0.955337}
slice + multiply : {1,4,3,8,5,12}