С ++ 2-мерный массив со строками переменного размера

Как вы можете создать 2D-массив, скажем, arr[][] с 5 строками, и каждая строка имеет переменное количество столбцов в нем?

возможно arr[5][] с 1-й строкой arr[0][] с 4 столбцами

2-й ряд arr[1][] с 5 столбцами и так далее?

Я бы не возражал против векторного решения на STL, но я еще не очень хорошо разбираюсь в векторах.


person user1484717    schedule 18.07.2012    source источник
comment
Массивы переменного размера в одном измерении называются зубчатыми массивами. На SO есть множество других сообщений о них. Они хорошо работают для некоторых целей. Тем не менее, я предлагаю ознакомиться с векторами.   -  person Wug    schedule 18.07.2012


Ответы (4)


С 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]. Однако в целом векторное решение намного лучше.

person SingerOfTheFall    schedule 18.07.2012
comment
Я не буду отрицать вас, но отмечу, что вы нацелены на другой язык, чем тот, который он пометил. Ваше редактирование делает его несколько лучше. - person Wug; 18.07.2012
comment
@Wug: C ++ 11 сейчас является официальным стандартом языка программирования C ++, это не другой язык. - person leftaroundabout; 18.07.2012
comment
@leftaroundabout: это одна из тех технических деталей, о которых люди могут и будут спорить. Он почти так же отличается от C ++, как C ++ от C. Большинство современных компиляторов C ++ его не поддерживают. Смысл моего комментария состоял в том, чтобы упомянуть, что он предоставил решение, которое, вероятно, не будет использоваться спрашивающим. - person Wug; 18.07.2012
comment
@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++. Однако я бы действительно не хотел спорить по этому поводу. Я попытался дать исчерпывающий ответ, хотя на это потребовалось время и пара правок. Иногда бывает, что некоторые вещи сразу не принимаются во внимание и приходится редактировать ответ позже, чтобы включить дополнительную информацию. - person SingerOfTheFall; 18.07.2012

Вы можете сделать это так (при условии, что массив из 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. Вы можете увидеть другие ответы для справки.

person Lyubomir Vasilev    schedule 18.07.2012

Способ для разного размера строки

#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
}
person reza moradi    schedule 02.05.2019

Итак, 2D-массивы - это std::vector<std::vector<T>>, где T - это тип. Также mb std::array<std::vector<int>, 5>. Или напишите свой собственный класс массива.

person ForEveR    schedule 18.07.2012