valarray支持对整个数组的各类数学计算以及一些间接访问。
比如对所有元素进行模运算,和另一个数组做swap操作,对所有的元素apply一个function。比较经典的是slice selector class。

slice( std::size_t start, std::size_t size, std::size_t stride );

它代表了下列位置的元素子集:

start + 0 * stride
start + 1 * stride

start + (size-1) * stride

下面的代码是我在dash上看到的例子,非常优雅的例子:

#include <iostream>
#include <valarray>
class Matrix {
    std::valarray<int> data;
    int dim;
 public:
    Matrix(int r, int c) : data(r*c), dim(c) {}
    int& operator()(int r, int c) {return data[r*dim + c];}
    int trace() const {
        return data[std::slice(0, dim, dim+1)].sum();
    }
};

int main()
{
    Matrix m(3,3);
    int n = 0;
    for(int r=0; r<3; ++r)
       for(int c=0; c<3; ++c)
           m(r, c) = ++n;
    std::cout << "Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is " << m.trace() << '\n';
}

output:

Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is 15

分类: C plus plus

发表评论

电子邮件地址不会被公开。 必填项已用*标注