2014-01-10 126 views
0

我正在使用C++,我想使用二维动态数组。我试过这个:cpp二维动态数组

#include<iostream.h> 
using namespace std; 
void main(){ 
int const w=2; 
int size; 
cout<<"enter number of vertex:\n"; 
cin>>size; 
int a[size][w]; 
for(int i=0; i<size; i++) 
    for(int j=0; j<w; j++){ 
     cin>>a[i][j]; 
    } 

} 

但没有措辞。 和我尝试这样的:不是

int a[size][w]; 

但不工作的

int *a = new a[size][w]; 

你能帮助我吗?

非常感谢。

+0

我希望没有模板或向量或类的帮助..谢谢 –

回答

1

OP是说他想创建一个2维数组,其中一个方面是已知的,恒定的,而另一个维度是动态的..不知道如果我得到了它正确但是在这里:

int main() { 
    const int w = 2; 

    int size = 10; 

    int* arr[w]; 

    for (int i = 0; i < w; ++i) 
     arr[i] = new int[size]; 


    //do whatever with arr.. 
    //std::cout<<arr[0][0]; 

    for (int i = 0; i < w; ++i) 
     for (int j = 0; j < size; ++j) 
      std::cout<<arr[i][j]; 


    for (int i = 0; i < w; ++i) 
     delete[] arr[i]; 

    return 0; 
} 
+0

谢谢大家。这对我来说很好。^_^ –

1

你不能这样做,在C++,请阅读以下关于dynamic memory allocation

的代码应工作

int* twoDimentionalArray = new [size*w] 
+0

这不是一个二维数组,这是一个简单的数组。'twoDimentionalArray + 1'将按照预期指向数组的第二项,但不指向第二行。 –

+0

它可以按照你提出的方式完成,但它需要额外的算术 –

+0

@ichramm是的,它确实需要更多的算术工作,但它是值得的,因为内存保存在一个块中,并且只需要一次内存。您也不需要调用许多删除。通过这种方式,您也可以通过一种间接方式访问数据,而不是两种,所以我认为这是值得的。 – user1708860

2

对于动态大小的数组必须动态地分配它。取而代之的

int *a = new a[size][w]; 

使用

int** a = new int*[size]; 
for(int i = 0; i < size; i++) 
    a[i] = new int[w]; 
+0

这太多次调用'new []'。只有一个维度是动态的,所以一个'new []'(具有适当的类型)就足够了。 –

+0

@DavidRodríguez-dribeas我没有看到你的意思,使用'new []'代码是好的。 – Keeler

+0

@Keeler:在上面的代码中(第二块)有'size + 1'分配,其中只需要一个分配。这具有不同的影响:更高的分配/取消分配成本,内存碎片,更少的数据本地化。 –

4

这里的正确方法是封装一些标准容器,它将为您提供一个良好的接口的内部管理内存。这里常见的方法将会有一个重载operator(),它取两个参数来确定矩阵中的行和列。

这且不说,你正在尝试手动创建是恒定的大小2.阵列随着typedef援助的动态数组的大小,你可以写在一个简单的理解方式:

const int w = 2; 
typedef int array2int[w]; 
int size = some_dynamic_value(); 
array2int *p = new array2int[size]; 

如果没有typedef,语法是有点比较绕口,但可行的:

int (*p)[w] = new int [size][w]; 

在这两种情况下,你会释放内存具有相同的简单语句:

delete [] p; 

与方法做双指针(int **)不同的是,阵列的存储器布局是真的两个维度的阵列,而不是跳转表成多个单独分配的一维阵列,从而提供更好的局部性数据。分配数量较低:一个分配与size + 1分配相比,减少了内存碎片。它还减少了内存泄漏的可能性(分配一个指针,要么泄漏所有内容,要么根本不泄漏)。

+0

Upvoted:提高参考的地点,减少内存碎片,潜在地减少内存泄漏的风险......这个答案包含很多。 – Keeler

+0

如果你解释*为什么*这个在语法上起作用,一步一步会有帮助。这绝对不是一个初学者友好的方式来做到这一点,所以请澄清。 – Keeler

+0

@Keeler:简单的解释是在第一块代码中,它动态地分配一个'array2int'对象数组,数组中的每个元素都是一个静态大小的数组(在这种情况下是'size == 2')数组。其复杂性在于试图解析不需要'typedef'的尴尬语法,但这只是学习如何读取声明:'p'是指向(或数组)'w'维的指针'int'数组。如果您觉得有什么需要进一步解释,请不要问。我同意这不是初学者友好的(我已经提到过我不会使用这种方法) –