我正在实现一个动态规划算法,需要在开始之前创建一些二维内存(内存的大小取决于参数,也没有明确的上限)。我尝试使用普通的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多维数组库。我没有使用过它,也没有读过很多描述,但也许值得研究一下