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更多的细节.
#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访问速度可能更快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.此属性表示没有别名,可以通过优化编译器来利用它.