【发布时间】:2009-07-14 02:51:21
【问题描述】:
我正在实现一个 n 维数组类,它是一个模板,如下所示(注意数据存储在一个线性数组中,其长度是所有维度的乘积):
template< class valType, int rank >
class NDimensionalArray
{
public:
private:
valType* m_data;
int* m_dimensions;
int m_rank;
};
所以这个想法是用户(我)可以指定一个等级为 2 且具有特定维度的数组,即:
NDimensionalArray<double,2> matrix(10,10);
现在的困难在于为 1->n 维专门构造构造函数,每个构造函数接受 n 个参数,其中 n 是数组的秩。现在我想到了在 printf() 中使用类似 valarray 的方法,但是这样定义了一个 2 维的一维数组,即:
NDimensionalArray<double,1> matrix(10,10);
将是完全可以接受的行为。我可以使用一些巧妙的技巧让编译器进行重复吗?实际上,只要我知道等级,并且具有每个维度的长度,构造函数就可以是通用的:
{
int nElements = m_dimensions[0];
for ( int i=1 ; i<m_rank ; ++i )
nElements *= m_dimensions[i];
m_data = new valType[nElements];
}
编辑:请注意,访问者也需要类似的操作。
我还考虑过构造函数的选项,如下所示:
NDimensionalArray( const NDimensionalArray<int,1>& dimensions );
可以这样使用:
NDimensionalArray<int,1> dimVec(2); // Need a specification for 1-dimensional arrays.
dimVec(0) = 10;
dimVec(1) = 10;
NDimensionalArray<double,2> matrix(dimVec);
这将是一个可行的解决方案,但与我想要的用途相比,它很难看。访问多维数组也会变得非常痛苦,并且必须为每次访问构建一个维度向量非常缓慢。
【问题讨论】:
-
出于好奇,难道
boost::multi_array完全不需要你编写这样一个类就可以做你想做的事吗? -
确实会。这更像是一个“我想知道我怎么能做到”的项目。你知道的好奇心。
标签: c++