2010-07-29 129 views
0
int *x = new int[5](); 

有了上述的心态,应该如何为二维数组编写代码 - int[][]多维数组和C++中的指针?

int **x = new int[5][5]() //cannot convert from 'int (*)[5]' to 'int **' 

在第一条语句,我可以使用:

x[0]= 1; 

但第二个更复杂,我无法弄清楚。 我应该使用类似:

x[0][1] = 1; 

或者,计算真正的位置,然后获得的价值 第四行和列1

x[4*5+1] = 1; 
+1

你应该*不*做手工的内存管理。不仅因为您必须记住删除所有内容,而且因为您可能会忘记或抛出异常而不安全,因此您的代码很麻烦。使用'std :: vector',它们可以嵌套。 – GManNickG 2010-07-29 23:00:53

回答

2

可以单独做初始化:

int **x = new int*[5]; 
for(unsigned int i = 0; i < 5; i++) 
    x[i] = new int[5]; 
+1

这就是我想要的:) – 2010-07-29 22:36:18

2

在C++中没有new[][]运算符。您将首先必须分配指向int的指针数组:

int **x = new int*[5]; 

然后遍历该数组。对于每个元素,分配整数数组:

for (std::size_t i = 0; i < 5; ++i) 
    x[i] = new int[5]; 

当然,这意味着你将有解除分配时做逆:delete[]每个元素,然后delete[]较大阵列作为一个整体。

4

我喜欢做这种方式:

int *i = new int[5*5]; 

,然后我就指数由5 * row + col阵列。

+0

非常好,这可以避免多个分配的低效率。你可以把它封装在一个通过为你做索引计算隐藏事物的类中。 – 2010-07-29 22:49:09

+0

...然后您可以从C++ FAQ Lite中获得解决方案:http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10 – Cubbi 2010-07-29 23:28:45

+0

我同意,将它包装在类为了做行/列访问是非常好的。 – Simon 2010-07-30 07:18:20

0

阵列FF已经预定义的大小可以简单的写:

int x[5][5]; 

compiles

如果不是,为什么不使用矢量?

+0

是的,该数组不是静态大小。只是学习核心元素。就像你提到的有效方式是stl。 – 2010-07-30 00:21:33

+0

要回答你的问题,如果你使用push_back(),使用嵌套向量可能会非常低效。这是因为重新分配最外层向量的底层内存将触发它所包含向量的重新分配。 – 2011-06-03 11:42:42

+0

如果它会经常调整大小,我会建议你看看'std :: list'。元素检索效率不高,但改变数据的大小将会(相对)便宜。 – 2011-09-29 12:29:51

1

这是你如何做到这一点:

int (*x)[5] = new int[7][5] ; 

我做了两个尺寸不同的,所以你可以看到,你必须在LHS使用哪一个。

0

有几种方式来实现:

  • 使用GCC的平多维数组的支持(TonyK的回答,最相关的问题IMO)。请注意,除非可能是第一个数组,否则您必须在数组类型的任何位置保留数组类型的边界(包括所有数组大小),并且包含您调用的函数,因为生成的代码将采用单个数组。 $ new int [7] [5] $的分配会导致在内存中分配一个数组。由编译器索引(您可以轻松编写一个小程序并打印插槽的地址来说服自己)。使用数组指针数组。该方法的问题是不得不手动分配所有内部数组(循环)。

  • 有些人会建议使用std :: vectors的std :: vector's,但这是效率低下的,因为内存分配和复制时,矢量调整大小时必须发生。

  • Boost在其multi_array库中有一个向量矢量更高效的版本。

在任何情况下,这个问题比较好回答的位置: How do I use arrays in C++?