在C ++中,我想做类似的事情:
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
但当然这不起作用。做类似事情的最佳方法是什么?我已经看到了一些解决方案,但它们看起来很混乱。
答案 0 :(得分:24)
手动动态方式:
假设您需要一个宽度为* height的数组,最有效的方法是使用单维数组:
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;
}
提升矩阵:
Consider using boost::matrix如果您可以拥有依赖项。
然后,您可以绑定到boost linear algebra库。
以下是一些sample code of 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功能称为可变长度数组(VLAs),它可能在任何现代编译器中都可以打开。
答案 1 :(得分:9)
我通常做这样的事情:
char *matrix = new char [width * height];
matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';
delete [] matrix;
答案 2 :(得分:4)
你似乎忽略了C ++(带有类的C)的全部要点:-)。这是一种迫切需要一个类来实现它的用法。
你可以只使用STL或其他第三方类库,我相信你会有你正在寻找的数据结构但是,如果你需要自己动手,只需创建一个类具有以下属性。
答案 3 :(得分:4)
std::vector< std::vector<int> > array2d;
怎么样?
答案 4 :(得分:3)
对于真正的二维数组:
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;
就在我的头顶。毫无疑问,错误。但是,我认为其他人发布了一种更优雅的方法。
答案 5 :(得分:2)
答案 6 :(得分:2)
我喜欢1-d数组方法(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);
}
实施是读者的练习。 ;)
答案 7 :(得分:0)
我认为这将是一个很好的。
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;
答案 8 :(得分:0)
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];
(在高斯消除中,我们通常需要将一行与另一行交换,因此最好在恒定时间内将指针交换为行,而不是通过线性时间复制进行交换。)