【问题标题】:C++ Define Array with Const intC++ 用 const int 定义数组
【发布时间】:2014-07-07 06:29:35
【问题描述】:

我只是在学习 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;
}

并且编译器说:operator new 中的数组大小必须是常量。 所以我搜索了一下,有人说,这些不是'编译器时间常数'。

但很明显,我不能在这里使用那个大小作为宏...... 然后。我应该如何使用构造函数获得适当大小的数组?

【问题讨论】:

  • 您应该真正使用单个一维数组,并通过两个索引添加访问权限。一维数组可以是std::vector<int> 以简化事情。
  • 忘记数组,使用 std::vector。
  • 删除将是delete[] data; btw - delete[] 表单涵盖任何维度的数组。

标签: c++ arrays constructor size constants


【解决方案1】:

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

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

像这样创建它:

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

并像这样访问它:

data[i][j];

正如 jaunchopanza 所说,您还可以使用一维数组,这可能会更好。您可以用类似的方式创建和编辑它:

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

优点是访问速度更快,尤其是在x_sizey_size 很大的情况下。还有一个优点是向量的向量可以存储在任何地方,因为每一行(或列)将在内存中的不同位置。如果您打算获取重叠超过一行(或一列)的数据,那么最好使用一维数组来提高速度。

您可以在此处找到更多信息: http://en.cppreference.com/w/cpp/container/vector

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

【讨论】:

  • 投反对票的人,是否愿意添加评论解释,以便我可以更好地回答?
  • OP 似乎正在尝试获取一个数据块,这是正确的做法。向量的向量是一堆零散的数据块。这似乎不是表示标准 N*M 矩阵的最佳方式。
  • @juanchopanza 是的,我想你可能刚刚看到我也编辑了它。
  • 恕我直言,没有“最好”的方式来表示矩阵;这取决于你要用它做什么。向量的向量有一些优点和一些缺点。
  • @MattMcNabb 我同意,我的意思是矢量的矢量更容易阅读。
【解决方案2】:

你应该这样写(虽然它不是异常安全的)

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

【讨论】:

  • 这违反了三法则和异常安全;即使你修复了这两个问题,与使用向量向量的单行选项相比,这也是大量的代码膨胀。
  • 此代码用于教育目的,以修复他的原始想法,是的,它不是异常安全的 :)
  • 这是出于教育目的的事实正是为什么这是一个糟糕的答案:我们应该教 C++ 新手有关资源管理、raii、值语义等;不是手动内存管理
  • @Manu343726 我不同意你的看法,尽管强烈推荐使用 raii 和资源管理,但它们并非总是在所有编译器和系统中都可用,我认为我编写的代码摘录应该熟悉每个 C++ 程序员
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 2018-12-01
  • 2015-07-16
  • 2015-04-02
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多