Для выполнения домашнего задания нам было поручено создать связующие деревья для каждого графика, разделить их по регионам и позже отобразить их связующие деревья в порядке возрастания.
У меня есть функция, которая выполняет поиск в ширину, чтобы определить связанные компоненты на графике, а затем передает регион функции, которая создает связующее дерево для каждого региона. Я хочу отобразить мои окончательные двумерные массивы связующего дерева, основываясь на количестве «дорог» или ненулевых элементов, которые у него есть. Все двумерные массивы являются матрицами смежности.
Я объявил массив 2d массивов в моем объявлении класса как
int** spantreelist[10];
Мои деревья — это двумерные матрицы смежности, объявленные
int** trees;
и динамически распределяется позже.
Я назначаю свои спантреи таким образом:
spantreelist[newcount] = tree; //newcount = number of non 0 elements, different for each tree
for (int i = 0; i < 10; i++)
for (int y = 0; y < cities; y++)
for (int r = 0; r < cities; r++)
{
spantreelist[i][y][r] = tree[y][r];
}
Однако, когда я позже вызываю свой последний spantreelist, чтобы напечатать мои 2d массивы, я получаю ошибку сегментации.
for (i = 0; i < 10; i++)
for (j = 0; j < cities; j++)
for (k = 0; k < cities; k++)
cout << spantreelist[i][j][k] <--- seg fault here.
Странная часть, если я просто напишу
соиЬ << спантри [2] [3] [4] // 2
Я получаю значение, которое я хотел.
Любые советы о том, как правильно поместить 2d-массивы в массив, были бы хорошими.
В C ++ нет такого понятия, как «2d array». Есть только массивы. Некоторые из них содержат другие массивы. Другие содержат указатели, которые иногда указывают на другие массивы. Ссылаясь на эти конструкции как на 2D, все вводит в заблуждение и лучше избегать.
У вас есть массив из 10 указателей под названием spantreelist
,
spantreelist[newcount] = tree;
Это присваивает одному элементу spantreelist
массив, проиндексированный newcount
, Все остальные элементы не инициализируются.
for (i = 0; i < 10; i++)
....
spantreelist[i][y][r] = tree[y][r];
for (i = 0; i < 10; i++)
....
cout << spantreelist[i][j][k]
Эти два фрагмента имеют доступ ко всем элементам spantreelist
массив, проиндексированный от 0 до 9. Все они, кроме одного, неинициализированы. Доступ к неинициализированному элементу массива не определен.
Лучший способ справиться с массивами в C ++ — использовать стандартные шаблоны классов библиотек. std::vector
а также std::array
,
Других решений пока нет …