Создать двумерный динамический массив с произвольным количеством элементов в каждой строке
Как можно создать двумерный динамический массив с произвольным количеством элементов в каждой строке?
Ответы (4 шт):
vector<vector<int> > vect{ { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
А по моему - когда речь идет о "произвольном количестве элементов в каждой строке", то термин "произвольный" надо понимать так: "в каждой строке может быть сколько хочешь элементов".
Такую задачу решает уже "вектор векторов":
vector<vector<int>> arr;
Раз в каждой строке может быть разное количество элементов...
Вариант первый, скорее С'шный. Именно динамический массив. Например, 4 строки, длины строк - 5, 2, 3, 8.
int ** arr = new int*[4];
arr[0] = new int[5];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[8];
Все. Минусы - надо помнить размеры (длины строк), их довольно сложно менять - для этого надо создать новую строку с требуемым размером, перекопировать в нее нужные элементы, изменить указатель на строку, удалить исходную...
Вариант второй - использование векторов.
vector<vector<int>> arr(4);
arr[0].resize(5);
arr[1].resize(2);
arr[2].resize(3);
arr[3].resize(8);
Здесь все гораздо удобнее. Во-первых, каждая строка знает свой размер, arr знает, сколько в нем строк. Изменить размер легко - просто resize(), или, если его надо увеличить на 1 элемент - push_back().
В обоих вариантах работает обращение c двумя индексами arr[i][j].
Произвольное количество элементов настораживает. Тут лучше учесть, что может не хватить памяти для заданного числа элементов, и обработать этот случай некоторым образом:
size_t row;
cin >> row;
int** p = new int*[row];
size_t i{}, size{};
cout << "вводим размеры массивов\n";
try {
while (i < row) {
cin >> size;
size += 100;
p[i] = new int[size];
++i;
}
}
catch (std::bad_alloc)
{
//...
std::cerr << "не хватило памяти для " << i <<" _ ой строки";
}
//....