C++我想要做这样的:

int n = get_int_from_user();

char* matrix = new char[n][n];

matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';

delete [][] matrix;

但是当然这不会的工作。什么是最好的方式来做到类似的东西吗?我已经看到了一些解决方案,这个但是他们似乎相当混乱。

有帮助吗?

解决方案

手动动态方式:

假设您需要一个宽度为* 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;
}

提升矩阵:

考虑使用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),它可能在任何现代编译器中都可以打开。

其他提示

我通常做这样的事情:

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;怎么样?

你似乎是失踪的全部要点C++(C类):-).这是一种使用就是哭了对一个类来实现。

你的 可能 只是使用STL或其他第3党类图书馆我保证会有的数据结构你在找但是,如果你需要推你自己,只要创建一类是与以下特性。

  • 构造,鉴于n,将创造一个新的n*n列char(例如,charray)..
  • 成员的职能得到并设置价值观的基础上x。y只是指charray[x*n+y];
  • 析构其删除[]'s的阵列。

对于真正的二维数组:

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;

就在我的头顶。毫无疑问,错误。但是,我认为其他人发布了一种更优雅的方法。

boost :: multi_array

手工完成它将是一团糟。

我喜欢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);
}

实施是读者的练习。 ;)

我认为这将是一个很好的。

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];

(在高斯消除中,我们通常需要将一行与另一行交换,因此最好在恒定时间内将指针交换为行,而不是通过线性时间复制进行交换。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top