Создать двумерный динамический массив с произвольным количеством элементов в каждой строке

Как можно создать двумерный динамический массив с произвольным количеством элементов в каждой строке?


Ответы (4 шт):

Автор решения: user276668
vector<vector<int> > vect{ { 1, 2, 3 }, 
                               { 4, 5, 6 }, 
                               { 7, 8, 9 } }; 
→ Ссылка
Автор решения: S.H.

А по моему - когда речь идет о "произвольном количестве элементов в каждой строке", то термин "произвольный" надо понимать так: "в каждой строке может быть сколько хочешь элементов".

Такую задачу решает уже "вектор векторов":

    vector<vector<int>> arr;
→ Ссылка
Автор решения: Harry

Раз в каждой строке может быть разное количество элементов...

Вариант первый, скорее С'шный. Именно динамический массив. Например, 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].

→ Ссылка
Автор решения: AR Hovsepyan

Произвольное количество элементов настораживает. Тут лучше учесть, что может не хватить памяти для заданного числа элементов, и обработать этот случай некоторым образом:

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 <<" _ ой строки";
} 
//....
→ Ссылка