2012-04-17 84 views
1

我是C++的新手,我花了一晚思考这个问题。我想创建一个2维数组,给出了第一维的长度。第二维的长度从1增加。对于二维数组a [] [],a [0] []有1个元素,a [1] []有2个元素,a [2] []有3个元素等。C++中的二维步长阵列

它听起来不响像一个坚硬的结构,但我找不到一个创建它 - 我所能做的就是创建ax * x数组,这意味着一半的空间都浪费在我身上。

任何人有任何想法?提前致谢。

+4

除非它是一个非常大的数组,那么最简单的方法是只不担心“浪费”的空间。 – 2012-04-17 21:56:51

+0

如果你可以使用矢量,他们是完美的。 – chris 2012-04-17 21:56:51

回答

1

std::vector解决方案:

vector< vector<int> > stairs; 

for(int i = 0; i < n; i++) // n is size of your array 
    stairs[i].resize(i+1); 

你也可以做到这一点使用普通指针:

int * stairs[n]; 
for(int i = 0; i < n ; i++) 
    stairs[i] = new int[i+1]; 

但是这时候你就不用担心删除这样的特征时不再需要它。

+2

你应该不鼓励新的C++用户使用原始指针和不受保护的动态内存分配:) – enobayram 2012-04-17 22:19:30

+0

这似乎是一个easist解决方案。我没有时间尝试,但我会尽快做到,并回复你。此外,我会尝试忽略“浪费的空间”,看看如何影响性能。 – 2012-04-19 09:53:49

+0

运行后,我认为这是我想要的。谢谢。我也试过这个: array < vector>楼梯; 因为我知道数组的大小,但似乎C++不允许这样做。 – 2012-04-19 16:27:29

1

请尝试考虑您的阵列的动态分配。

Dynamic array allocation

另一种方法,使多维数组使用已知 作为指针的指针的一个概念。就像罗恩星期四所说的,大多数人认为像行电子表格这样的二维数组(这只是 很好)的二维数组,但是在'引擎盖下',C++使用的是ptr到ptrs。首先,你首先创建一个基址指针。接下来,分配一行 指针并将第一个地址分配给基址指针。 接下来,分配的内存来容纳每一行的列数据和行指针数组

但在分配 地址,如果你是新的CPP,我以为你不会来处理大量的数据,所以不要担心内存!

1

一个解决方案是定义一个类,该类包含大小为x *(x + 1)/ 2的单维数据数组,并且过载为type & operator()(int r, int c)以执行正确的索引类型。

template<class datatype, int size> 
class strange2dArray { 
    datatype data[size*(size+1)/2]; 

    datatype & operator()(int r, int c) { 
     // assert if the indexes are correct 
     return data[r*(r+1)/2+c]; 
    } 
}; 

BTW,除非你做这个学习C++,你应该使用某种数学库(或其他)的为您提供这样的基本数据结构。他们会更高效和安全地实施它。

0

首先,让我们看到的Python测试:

>>> a=[] 
>>> a[0]=3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list assignment index out of range 
>>> a={} 
>>> a[0]=3 

哎呀,看起来像阵列,简化版,意味着它是数组。如果你想要动态大小的“数组”,你可以使用映射。 是的,这是第一个解决方案:

#include <map> 
#include <iostream> 
using namespace std; 

typedef std::map<int, int> array_d2; //length of second dimensional is increased 
array_d2 myArray[10] ; //length of first dimensional is given 


int main() 
{ 
myArray[0][1] = 3; 
myArray[0][2] = 311; 

//following are tests 
cout << myArray[0][1] << endl; 
cout << myArray[0][2] << endl; 

return 0; 
} 

(输出为:)

$ ./test 
3 
311 

我的第二个解决方案是使用的东西更像是一个数组,但有大小调整功能,你应该重写opertation []使其自动为用户。

#include <vector> 
#include <iostream> 
using namespace std; 

//length of second dimensional is increased 
class array_d2 { 
    int m_size; 
    vector<int> m_vector; 
    public: 
    array_d2 (int size=10) { 
     m_size = size; 
     m_vector.resize(m_size); 
    }; 
    int& operator[] (int index) { 
     if (index >= m_size) { 
     m_size = index + 1; 
     m_vector.resize(m_size); 
    } 
    return m_vector[index]; 
    }; 
}; 

array_d2 myArray[10] ; //length of first dimensional is given 


int main() 
{ 
myArray[0][1] = 3; 
myArray[0][20] = 311; 
myArray[1][11] = 4; 
myArray[1][12] = 411; 


//following are tests 
cout << myArray[0][1] << endl; 
cout << myArray[0][20] << endl; 
cout << myArray[1][11] << endl; 
cout << myArray[1][12] << endl; 

return 0; 
} 

(输出)

$ ./test1 
3 
311 
4 
411