我是C++的新手,我花了一晚思考这个问题。我想创建一个2维数组,给出了第一维的长度。第二维的长度从1增加。对于二维数组a [] [],a [0] []有1个元素,a [1] []有2个元素,a [2] []有3个元素等。C++中的二维步长阵列
它听起来不响像一个坚硬的结构,但我找不到一个创建它 - 我所能做的就是创建ax * x数组,这意味着一半的空间都浪费在我身上。
任何人有任何想法?提前致谢。
我是C++的新手,我花了一晚思考这个问题。我想创建一个2维数组,给出了第一维的长度。第二维的长度从1增加。对于二维数组a [] [],a [0] []有1个元素,a [1] []有2个元素,a [2] []有3个元素等。C++中的二维步长阵列
它听起来不响像一个坚硬的结构,但我找不到一个创建它 - 我所能做的就是创建ax * x数组,这意味着一半的空间都浪费在我身上。
任何人有任何想法?提前致谢。
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];
但是这时候你就不用担心删除这样的特征时不再需要它。
你应该不鼓励新的C++用户使用原始指针和不受保护的动态内存分配:) – enobayram 2012-04-17 22:19:30
这似乎是一个easist解决方案。我没有时间尝试,但我会尽快做到,并回复你。此外,我会尝试忽略“浪费的空间”,看看如何影响性能。 – 2012-04-19 09:53:49
运行后,我认为这是我想要的。谢谢。我也试过这个: array < vector
请尝试考虑您的阵列的动态分配。
另一种方法,使多维数组使用已知 作为指针的指针的一个概念。就像罗恩星期四所说的,大多数人认为像行电子表格这样的二维数组(这只是 很好)的二维数组,但是在'引擎盖下',C++使用的是ptr到ptrs。首先,你首先创建一个基址指针。接下来,分配一行 指针并将第一个地址分配给基址指针。 接下来,分配的内存来容纳每一行的列数据和行指针数组
但在分配 地址,如果你是新的CPP,我以为你不会来处理大量的数据,所以不要担心内存!
一个解决方案是定义一个类,该类包含大小为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++,你应该使用某种数学库(或其他)的为您提供这样的基本数据结构。他们会更高效和安全地实施它。
首先,让我们看到的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
除非它是一个非常大的数组,那么最简单的方法是只不担心“浪费”的空间。 – 2012-04-17 21:56:51
如果你可以使用矢量,他们是完美的。 – chris 2012-04-17 21:56:51