1

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

这听起来不像是一个硬结构,但我找不到两个来创建它——我所能做的就是创建 ax * x 数组,这意味着一半的空间对我来说是浪费的。

有人有什么想法吗?提前致谢。

4

4 回答 4

1

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

动态数组分配

制作多维数组的另一种方法是使用称为指针的概念。就像 Ron 在星期四所说的那样,大多数人认为 2D 数组就像具有行和列的电子表格(这很好),但是“在引擎盖下”,C++ 使用 ptr 到 ptrs。首先,您从创建基指针开始。接下来,分配一个行指针数组并将第一个的地址分配给基指针。接下来,分配内存来保存每行列数据并分配行指针数组中的地址

但是,如果您是 CPP 的新手,我认为您不会处理大量数据,所以不必担心内存!

于 2012-04-17T22:00:34.923 回答
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];

但是这一次您将不得不担心在不再需要时删除此结构。

于 2012-04-17T22:00:53.053 回答
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];
   }
};

顺便说一句,除非您这样做是为了学习 C++,否则您可能应该使用某种数学库(或其他)来为您提供此类基本数据结构。他们将更有效、更安全地实施它。

于 2012-04-17T22:03:08.137 回答
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

我的第二个解决方案是使用类似数组的东西,但具有调整大小的功能,您应该覆盖操作 [] 以使其自动为用户使用。

#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-18T04:34:32.843 回答