C++のvalarrayという不遇なライブラリ


このエントリーをはてなブックマークに追加

きっかけが何だったか忘れましたが、C++にはvalarrayという数値計算用のライブラリがあることを知りました。numpyやMatlab/Octaveのように、array同士の足し算ができたりします。

#include <iostream>
#include <valarray>

using namespace std;

int main(){
    valarray<int> v1(10, 3); // [10, 10, 10]を生成。なぜかvectorと引数の順番が逆...
    valarray<int> v2(100, 3); // [100, 100, 100]を生成。

    // arrayの要素の和を計算
    cout << "sum = " << v1.sum() << endl;

    // array同士の足し算
    v2 += v1;
    for( auto& val : v2 ) {
        cout << val << ", ";
    }
    cout << endl;

    return 0;
}

出力例です。

sum = 30
110, 110, 110,

ブログを検索すると、valarrayは定期的に再発見されて話題になってるようです(STLのvalarrayを知った - ブログ駆動学習帖【C++】valarrayがすごい件 - Yoh Okunoの日記)。しかし私はvalarrayが実際のコードで使われているところを見たことがなかったので、最近まで知りませんでした。

stl - C++ valarray vs. vector - Stack Overflowにvalarrayの経緯が詳しく書かれています。どうやら高速な数値計算を目的として開発が始まったようですが、人気が出なくてコンパイラのサポートも得られず、そのまま下火になった的なことが書かれています。またblitz++などのテクニックのほうが主流になってしまったとも書かれています。

今のところ自分にはvalarrayを使う動機は見つからなさそうです。