【问题标题】:Creating a array of pointers to arrays of class T创建指向 T 类数组的指针数组
【发布时间】:2014-03-21 19:59:29
【问题描述】:

我正在尝试使用动态数组而不使用向量来创建自己的表类。我明白了

T** values = new T* [rows];

创建一个指针数组或指针的指针。我不确定如何为每个指针初始化一个新数组。我最初认为应该是

for (int x = 0; x < rows; x++)
    values[x] = new T [columns];

但它看起来也有问题,因为我没有在该代码中使用任何星号。所以我又想了想,现在我想我可能不得不使用一个新的指针来遍历数组中的指针。我真的不知道它的代码。我想说的是

T* pointer;
for (pointer = values; pointer < values+rows; pointer++)
    *pointer = new T [columns];

我也不知道如何在指向的数组中设置值。我认为 *values 指向指针数组,而 **pointers 指向值数组。我不确定如何指定我想要的数组.. 是否只是像 **values[0][0] = T 将值设置在第一个指针指向的数组的第一个值内?

【问题讨论】:

  • “我没有在该代码中使用任何星号”——values[x] 中隐藏了一个星号,相当于*(values + x)
  • T** values = new T* [rows * columns]; 为我工作
  • @LordAro 这分配了太多内存。你只需要rows 指针。
  • @LordAro 是的,您应该在顶层分配rows 指针,并在每行分配一个columns 条目数组。
  • @interjay 我不知道这有什么不同,你能详细说明一下吗?

标签: c++ arrays pointers dynamic multidimensional-array


【解决方案1】:

这段代码

T** values = new T* [rows];

for (int x = 0; x < rows; x++)
    values[x] = new T [columns];

有效

如果您想使用第二条记录,则代码将如下所示

T** values = new T* [rows];

for ( T **ptr = values; ptr != values + rows; ++ptr )
    *ptr = new T [columns];

values[0] 等价于*values

要初始化值,您应该使用两个循环(虽然您只能使用一个循环,但代码的可读性会降低)

for ( int i = 0; i < rows; i++ )
{
   for ( int j = 0; j < columnds; j++ ) values[i][j] = SomeValue;
}

【讨论】:

    【解决方案2】:

    正如 Mike Seymour 在 cmets 中所说,您的取消引用星号隐藏在 operator[] 和代码下方

    values[x]     = new T [n];
    

    等价于

    *(values + x) = new T [n];
    

    因此,要访问不需要再次取消引用的元素:

    **values[0][0] = T

    只是

      values[0][0] = T
    

    再考虑一下设计,您甚至不需要数组数组,而只需要一个数组:

    T* values = new T [columns * rows];
    

    您只需通过计算索引即可访问,例如:

    values[y * rows + x]
    

    值得一提的是,即使是出于学习目的,也最好在此处使用std::vector。如果您完全倾向于自己的解决方案,请编写您自己的动态数组类(以RAII 为特色)。具有原始 operator new 和原始指针的表类要么是 non-excepton safe 并且容易泄漏,要么会在这里和那里包含动态数组类的某些部分(duplication of code,并且违反了single responsibility principle)。

    【讨论】:

    • @Jarod42,anatolyg 谢谢!固定的。复制粘贴太快了;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多