Я не могу объявить динамически массив векторов - PullRequest
1 голос
/ 23 апреля 2020

Моя цель - создать список смежности для представления графа, и я решил сделать это с помощью векторов. Моя проблема заключается в том, что количество вершин и ребер графа не всегда одинаково, и оно задается на входе. Поэтому я стараюсь динамически объявлять массив векторов. Вот мой код (где N обозначает число ребер):

int N;
vector <int> *arr;
arr = new vector <int> [N];
cin >> N;`

Каждый раз, когда я пытаюсь обработать вектор (ig arr[0].push_back(3);), я получаю ошибку сегментации. Что я делаю неправильно: (*

Редактировать: N обозначает количество узлов , а не ребер. Это не влияет на ошибку сегментации, а только способ представления графа с помощью векторы

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Ты почти там; но вы читаете N после , используя его. Программа на C ++ выполняется построчно, поэтому, когда дело доходит до new vector <int> [N], значение N еще не читается! В терминах C ++ вы затем используете неинициализированную переменную , которая является формой неопределенного поведения . В C ++, в отличие от большинства других языков, очень просто написать бессмысленную программу, и компилятор не остановит вас (хотя может выдать предупреждение - обратите внимание на это!).

Если вы переместитесь cin >> N; до new vector <int> [N], тогда это будет работать лучше, но подождите, есть лучшее решение ...

Вместо необработанных массивов, более идиоматично c иметь вектор векторов. Это безопаснее и проще:

std::vector<std::vector<int>> arr;
int n;
cin >> n;
arr.resize(n);

Или просто объявить вектор после того, как n известен:

int n;
cin >> n;
std::vector<std::vector<int>> arr(n);
0 голосов
/ 23 апреля 2020

Если вам нужен динамический c N, вы можете использовать вектор вместо массива:

std::vector<std::vector<int>> arr(N);
arr[42].push_back(42);

Также убедитесь, что ваша переменная N инициализирована, иначе вы столкнетесь доступ из arr вне пределов, который, вероятно, является причиной segfault.

...