C ++ 2维阵列具有可变大小的行(C++ 2 dimensional array with var

2019-06-26 08:48发布

你怎么能建立一个二维数组,比如说, arr[][]与5行,每行具有可变数量在它的列?

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

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

我不介意一个STL向量解决方案,但我不知道向量很好呢。

Answer 1:

随着C ++ 11,你可以用向量很容易做到这一点(线增加了可读性breakes):

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]它automaticaly是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] 但是,向量的解决方案是更好的整体。



Answer 2:

你可以像下面这样做(假设数组int元素):

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

这给你的5二维动态分配的数组由4.然后,可以使用这样的: arr[i][j] = 15;

不要忘记解除分配内存您正在使用的阵列完成后:

for(size_t i = 0; i < 5; ++i)
{
    delete[] arr[i];
}
delete[] arr;

我会建议使用std::vector ,但是。 你可以看到,以供参考答案。



Answer 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
}


Answer 4:

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



文章来源: C++ 2 dimensional array with variable size rows