具有可变大小行的 C++ 二维数组

Posted

技术标签:

【中文标题】具有可变大小行的 C++ 二维数组【英文标题】:C++ 2 dimensional array with variable size rows 【发布时间】:2012-07-17 03:14:26 【问题描述】:

如何创建一个 2D 数组,例如,arr[][],有 5 行,每行包含可变数量的列?

可能是arr[5][] 第一行arr[0][] 4 列

第二行arr[1][] 5 列等等?

我不介意 STL 矢量解决方案,但我还不太了解矢量。

【问题讨论】:

一维大小可变的数组称为锯齿状数组。 SO上有许多关于它们的其他帖子。它们可以很好地用于某些目的。不过,我确实建议您熟悉向量。 【参考方案1】:

使用 C++11,您可以使用向量轻松完成此操作(添加换行符以提高可读性):

std::vector< std::vector <int > > arr = 
1,2,3,
4,5,
6,7,8,9,0
;

如果您没有 C++11 编译器,它的工作方式完全相同,但您将无法轻松初始化它们。您可以单独设置元素:

std::vector< std::vector <int > > arr;//vector of vectors. Think of each element as of a "row"
std::vector<int> sub;//a temporary "row"
sub.push_back(1);
sub.push_back(2);
arr.push_back(sub);//Adding a "row" to the vector
sub.clear();//Making another one
sub.push_back(1);
sub.push_back(12);
sub.push_back(54);
arr.push_back(sub);//Adding another "row" to the vector

或者你可以用一个普通的数组来初始化每个“行”:

std::vector< std::vector <int > > arr;
static const int arr[] = 1,2,3,4;//A "row" as an ordinary array
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) ); //Setting a "Row" as a vector
arr.push_back(vec);//Adding the "row" to the vector of vectors. 

用普通数组做你想做的事是不可能的,因为当你创建一个array[X][Y] 时,它自动是一个X*Y 矩阵。但是,您可以使用指针数组:

int * array[3];
//also possible: int ** array =  new int*[3]; but don't forget to delete it afterwards.
int sub1[3] = 1,2,3;
int sub2[2] = 1,2;
int sub3[4] = 1,2,3,4;
array[0] = sub1;
array[1] = sub2;
array[2] = sub3;

并使用array[X][Y] 访问元素。但是,矢量解决方案总体上要好得多。

【讨论】:

我不会对你投反对票,但我会指出你的目标语言与他标记的语言不同。您的修改让它变得更好了。 @Wug:C++11 是现在 C++ 编程语言的官方标准,它不是另一种语言。 @leftaroundabout:这是人们可以并且将会争论的技术问题之一。它与 C++ 的区别几乎与 C++ 与 C 的区别一样。大多数当前的 C++ 编译器不支持它。我评论的重点是提到他提供了一个提问者可能没有用的解决方案。 @Wug,这不是真正的技术性,标准明确表示 (1.1 - [intro.scope]):This International Standard specifies requirements for implementations of the C++ programming language. The first such requirement is that they implement the language, and so this International Standard also defines C++. 但是,我真的不喜欢争论它。我试图提供一个完整的答案,尽管这需要一些时间和一些编辑。有时会发生一个人没有立即考虑某些事情,并且必须稍后编辑答案以包含其他信息。【参考方案2】:

你可以这样做(假设一个int元素的数组):

int** arr = new int*[5];
for(size_t i = 0; i < 5; ++i)

    arr[i] = new int[4];

这为您提供了一个 5 x 4 的二维动态分配数组。然后您可以像这样使用它:arr[i][j] = 15;

使用完数组后不要忘记释放内存:

for(size_t i = 0; i < 5; ++i)

    delete[] arr[i];

delete[] arr;

不过,我建议使用std::vector。您可以查看其他答案以供参考。

【讨论】:

【参考方案3】:

一种不同行大小的方法

#include <iostream>
#include <string>
int main()

  int test1[]=1,2,3;
  int test2[]=4,5;

  int *test[]=test1,test2;

  std::cout << test[0][1];//2
  std::cout << test[1][1];//5

【讨论】:

【参考方案4】:

所以,二维数组是std::vector&lt;std::vector&lt;T&gt;&gt;,其中T 是类型。另外,mb std::array&lt;std::vector&lt;int&gt;, 5&gt;。或者编写自己的数组类。

【讨论】:

以上是关于具有可变大小行的 C++ 二维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中声明可变大小的二维数组?

将二维数组传递给 C++ 函数

C++上二维数组的大小

c++二维数组和二级指针

在 C++ 中具有二维数组的函数

C++中二维数组传参的方法详解