我正在尝试使用动态数组创建自己的表类,而不使用向量。我明白了
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];
我也不知道如何在被指向的数组中设置值。我认为*值指向指针数组,**指针指向值数组。我不知道如何指定我想要的数组..它是否只是**值[0] [0] = T来设置第一个指针所指向的数组的第一个值内的值? / p>
答案 0 :(得分:1)
正如Mike Seymour在评论中所述,您的解除引用星号隐藏在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)和违反{{ 3}})。
答案 1 :(得分:0)
此代码
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;
}