c++中动态创建的二维(或多维)数组



我正在实现一个动态规划算法,需要在开始之前创建一些二维内存(内存的大小取决于参数,也没有明确的上限)。我尝试使用普通的2-dim c++数组,但显然我不知道第二次元,所以它没有工作。实现它的最合理的方法是什么?标准库或boost中是否有任何类可以使它变得像应该的那样简单?

我需要的功能是相当基本的:创建MxN,获取或设置矩阵[I][j]

唯一让我感到震惊的是的丑陋方式:将其实现为单维数组,并手动执行双索引,如:

value = arr[i*num_i + j];

你总是可以写一个类来隐藏丑陋的…

最基本的方法就是使用std::vector数组。然后你可以随时调整矢量的大小。

同样,如果你可以推迟数组的创建,直到你知道两个维度,你可以使用boost.MultiArray。我想这可能更符合你的要求。

一个非常简单的2d数组只需要几行代码

template<typename T>
struct Matrix2d
{
    int rows, cols;
    std::vector<T> data;
    Matrix2d(int rows, int cols) : rows(rows), cols(cols), data(rows*cols)
    { }
    T operator()(int i, int j) const { return data[i*cols+j]; }
    T& operator()(int i, int j) { return data[i*cols+j]; }
};

使用mat(i, j)进行读操作,mat(i, j) = v进行写操作。

正如James Kanze所建议的2d数组的特殊情况,使用operator[]而不是operator()访问元素也很容易获得c++标准数组语法mat[i][j]mat[i][j] = v:

    T* operator[](int i) { return &data[i*cols]; }
    const T* operator[](int i) const { return &data[i*cols]; }

然而,使用这种解决方案,扩展到更高维数变得更加困难(mat(i, j, k)符号的一个微不足道的问题)。

似乎在这里使用vector是一个好主意,假设您不打算大量复制它,或者不介意复制的开销。此代码未经测试,可能不是100%正确)

typedef std::vector< std::vector< int > > 2dVector;
2dVector vec( 2 );
vec[ 0 ].resize( someSize );
vec[ 1 ].resize( someSize );
vec[ 0 ][ 0 ] = 100;
//Keep on doing stuff here.

或者,您可以使用boost::shared_array(或tr1/c++11等效)来动态分配数组(此代码也未经测试,可能不正确):

typedef boost::shared_array< boost::shared_array< int > > 2dArray;
2dArray arr( new boost::shared_array< int >( firstDimensionSize ) );
BOOST_FOREACH( boost::shared_array< int >& inner, arr )
{
   inner = new int[ secondDimensionSize ];
}
arr[ 0 ][ 1 ] = 100;
编辑:一个快速的谷歌也揭示了boost多维数组库。我没有使用过它,也没有读过很多描述,但也许值得研究一下

相关内容

  • 没有找到相关文章