【C++】数値計算用だけどあまり知られていないvalarrayを使ってみた。内積、循環シフトなど

#include<valarray>
#include<iostream>

using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define pn(s) cout << (#s) << " " << (s) << endl

void printValArray(valarray<int> A){
    for(int a : A){
        cout << a << " ";
    }
    cout << endl;
}

int main(){
    valarray<int> A = {1,2,3};
    valarray<int> B = {10,20,30};
    
    // 和
    auto C = A + B;
    printValArray(C);

    // 積
    auto D = A * B;
    printValArray(D);

    // 合計
    int sum = A.sum();
    pn(sum);

    // max
    int max = A.max();
    pn(max);

    // サイズ
    int size = A.size();
    pn(size);

    // 内積
    int inner_product = (A * B).sum();
    pn(inner_product);

    // 循環シフト
    valarray<int> E = {1,2,3,4,5};
    printValArray(E.cshift(1));
    printValArray(E.cshift(-1));

    return 0;
}
$ g++ -std=c++11 experiment.cpp && ./a.out

11 22 33
10 40 90
sum 6
max 3
size 3
inner_product 140
2 3 4 5 1
5 1 2 3 4

valarrayを知ったきっかけ

beta.atcoder.jp