在C++中,我想做类似这样的事情:
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
但是显然这样做是行不通的。那么有没有更好的方式实现类似的功能呢?我看过一些解决方案,但它们似乎非常混乱。
在C++中,我想做类似这样的事情:
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
但是显然这样做是行不通的。那么有没有更好的方式实现类似的功能呢?我看过一些解决方案,但它们似乎非常混乱。
手动动态方式:
假设您想要一个宽度为*高度的数组,最有效的方式是只使用单维数组:
char *matrix = new char[width*height];
要删除它:
delete[] matrix;
访问它的方法:
char getArrayValue(char *matrix, int row, int col)
{
return matrix[row + col*width];
}
修改它:
void setArrayValue(char *matrix, int row, int col, char val)
{
matrix[row + col*width] = val;
}
Boost矩阵:
如果您可以接受依赖关系,请考虑使用boost::matrix。
然后,您可以与boost线性代数库进行连接。
这里是一些boost::matrix的示例代码:
#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
for (unsigned j = 0; j < m.size2 (); ++ j)
m (i, j) = 3 * i + j;
在一些编译器上使用栈:
一些编译器实际上允许您在栈上创建具有运行时确定大小的数组。g++是这样一个编译器的例子。但是,VC++默认情况下不能这样做。
因此,在g++中,以下代码是有效的:
int width = 10;
int height = 10;
int matrix[width][height];
Drew Hall提到,这个C99的特性叫做可变长数组(Variable Length Arrays,VLAs),在任何现代编译器中都可以打开。
我通常会这样做:
char *matrix = new char [width * height];
matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';
delete [] matrix;
那么 std::vector< std::vector<int> > array2d;
呢?
对于真正的二维数组:
int n = get_int_from_user();
char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
matrix[i] = new char[n];
}
// Operations on matrix.
for (int i = 0; i < n; i++) {
delete [] matrix[i];
}
delete matrix;
就我个人而言,以下是我的一些想法。毫无疑问会有错误。然而,我认为其他人贴出的方法更加优雅。
我喜欢1维数组的方法(Brian R. Bondy的选定答案),扩展思路是将数据成员封装成类,这样就不需要单独跟踪宽度:
class Matrix
{
int width;
int height;
char* data;
public:
Matrix();
Matrix(int width, int height);
~Matrix();
char getArrayValue(int row, int col);
void setArrayValue(int row, int col, char val);
}
我觉得这个不错。
int n = get_int_from_user();
char **matrix=new (char*)[n];
for(int i=0;i<n;i++)
matrix[i]=new char[n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
for(int i=0;i<n;i++)
delete []matrix;
delete []matrix;
std::vector<int> m;
然后在运行时调用m.resize()。
int* matrix = new int[w*h];
int** matrix = new int*[h];
for(size_t i(0); i < h; ++i)
matrix[i] = new int[w];