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

use*_*717 12 c++ arrays vector jagged-arrays multidimensional-array

你怎么能创建一个2D数组,比如arr[][]5行,每行中的列数可变?

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

第2行arr[1][]有5列,依此类推?

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

Sin*_*all 17

使用C++ 11,您可以使用向量轻松完成(为了可读性而添加了换行符):

std::vector< std::vector <int > > arr = {
{1,2,3},
{4,5},
{6,7,8,9,0}
};
Run Code Online (Sandbox Code Playgroud)

如果您没有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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用普通数组初始化每个"行":

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. 
Run Code Online (Sandbox Code Playgroud)

用普通数组做你想做的事情是不可能的,因为当你做一个时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;
Run Code Online (Sandbox Code Playgroud)

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

  • @Wug:C++ 11现在是C++编程语言的官方标准,它不是一种不同的语言. (7认同)
  • @Wug,它不是真正的技术性,标准清楚地说(1.1 - [intro.scope]):`这个国际标准规定了C++编程语言实现的要求.第一个这样的要求是它们实现了语言,所以这个国际标准也定义了C++."但是,我真的不想争论它.我试图提供一个完整的答案,虽然花了一些时间和一些编辑.有时会发生一个人不立即考虑某些事情,并且必须稍后编辑答案以包含其他信息. (6认同)

Lyu*_*lev 7

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

int** arr = new int*[5];
for(size_t i = 0; i < 5; ++i)
{
    arr[i] = new int[4];
}
Run Code Online (Sandbox Code Playgroud)

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

使用完阵列后,不要忘记取消分配内存:

for(size_t i = 0; i < 5; ++i)
{
    delete[] arr[i];
}
delete[] arr;
Run Code Online (Sandbox Code Playgroud)

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


For*_*veR -1

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