如何使用std :: valarray存储/操作连续的2D数组?

Emi*_*ier 9 c++ multidimensional-array c++-standard-library

如何使用std::valarray存储/操作2D数组?

我想看一个2D数组的例子,其中的元素由行/列索引访问.像这样的伪代码:

matrix(i,j) = 42;
Run Code Online (Sandbox Code Playgroud)

如何初始化这样一个数组的例子也不错.

我已经知道Boost.MultiArray,Boost.uBlas和Blitz ++.

随意回答为什么我不应该使用valarray作为我的用例.但是,我希望多维数组的内存是连续的(列x行)块.没有Java风格的嵌套数组.

MSN*_*MSN 12

脱离我的头顶:

template <class element_type>
class matrix
{
public:
    matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) {  }

    element_type &operator()(size_t row, size_t column)
    {
        // column major
        return m_storage[std::slice(column, m_height, m_stride)][row];

        // row major
        return m_storage[std::slice(row, m_stride, m_height)][column];
    }

private:
    std::valarray<element_type> m_storage;
    size_t m_stride;
    size_t m_height;
};
Run Code Online (Sandbox Code Playgroud)

std::valarray提供了许多有趣的方法来访问元素,通过切片,掩码,多维度切片或间接表.见std::slice_array,std::gslice_array,std::mask_array,和std::indirect_array更多的细节.

  • @MSN:你使用哪个编译器/ stdlib,`matrix :: operator()`编译?在我的gcc 4.4.5的文件`slice_array <T>`(由`valarray <T> :: operator [slice slc]`返回)似乎没有`operator []`.[这就是我的尝试](http://pastebin.com/YVa9CUGD).[`clang`演示网站](http://llvm.org/demo/)也扼杀了它. (2认同)

dir*_*tly 5

#include <iostream>
#include <valarray>

using namespace std;

typedef valarray<valarray<int> > va2d;

int main()
{
    int data[][3] = { {1, 2, 3}, {4, 5, 6} };
    va2d mat(valarray<int>(3), 2);
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
           mat[ i ][ j ] = data[ i ][ j ];
    }
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 3; ++j)
           cout << mat[ i ][ j ] << endl;
}
Run Code Online (Sandbox Code Playgroud)

更多信息valarray:

  • 它针对数值计算进行了优化.
  • 它是一个vector类似的容器,具有切片和切块的特殊成员功能.
  • 没有迭代器
  • 专为矢量机而设计,在当前机器上表现不佳:vector访问速度可能更快
  • 所有编译器都不支持(检查文档)/实施不当
  • 有关可用作参数的类型,请参见26.1 valarray<T>:例如:

3此外,valarray的许多成员和相关函数可以成功实例化,并且当且仅当T满足为每个这样的成员或相关函数指定的附加要求时才会表现出良好定义的行为.

4 [示例:实例化valarray是有效的,但是运算符>()将无法成功实例化valarray操作数,因为complex没有任何排序运算符. - 末端的例子]

编辑#2:标准保证vector,像数组一样,总是使用连续的内存.此外,我们有:

26.5.2类模板valarray

1类模板valarray是一维智能数组,元素从零开始顺序编号.它表示有序值集的数学概念.更高维度的错觉可以通过熟悉的计算索引成语以及广义下标运算符提供的强大子集化能力来产生.

并进一步:

26.5.2.3 valarray元素访问

4同样,表达式&a [i]!=&b [j]对于任何两个数组a和b以及任何size_t i和size_t j的计算结果为true,使得i小于a的长度且j小于长度b.此属性表示没有别名,可以通过优化编译器来利用它.