用Const int定义数组



我正在学习c++。我在做初始化列表的练习,所以我做了一个这样的类

class Matrix
{
    public:
        const int x_size;
        const int y_size;
        int *data;
        Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size)
        {
            data = new int[y_size][x_size];
        }
        ~Matrix()
        {
            delete[][] data;
        }
};
int main(void)
{
    Matrix A = Matrix(10, 10);
    return 0;
}

编译器说:new操作符的数组大小必须是常量。所以我搜索了一下,有人说,这些不是"编译器时间常数"。

但是很明显,我不能在这里使用这个大小的宏…然后。我应该如何得到适当大小的数组与构造函数?

如果你只是在学习c++,那么最好的建议是远离内存管理。如果可以的话,使用stl类型。使用std::vector来替换该数组:

std::vector<std::vector<int>> data;

创建如下:

data(y_size, std::vector<int>(x_size, 0));

,并像这样访问它:

data[i][j];

正如jaunchopanza所说,你也可以使用1D数组,这可能会更好。您将以类似的方式创建和编辑它:

std::vector<int> data;
data(y_size * x_size, 0);
data[y_size*i + j];

的优点是访问速度更快,特别是当x_sizey_size比较大的时候。还有一个优点是,向量的向量可以存储在所有地方,因为每一行(或列)将存储在内存中的不同位置。如果您打算获取与多行(或多列)重叠的数据,那么为了提高速度,最好使用1D数组。

你可以在这里找到更多信息:http://en.cppreference.com/w/cpp/container/vector

如果你想把它变成一个矩阵来做数学运算等等。我会强烈推荐Eigen,它是迄今为止最好的矩阵库:http://eigen.tuxfamily.org/index.php?title=Main_Page

你应该这样写STH(尽管它不是异常安全的)

class Matrix
{
    public:
        const int x_size;
        const int y_size;
        int ** data;
        Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size)
        {
            data = new int* [y_size];
            for(int i =0 ; i < y_size ; i++)
            {
                data[i] = new int[x_size] ;
            }
        }
        ~Matrix()
        {
            for(int i= 0 ; i < y_size ; i++)
            {
                delete [] data[i];
            }
            delete[] data;
        }
};

最新更新