перераспределение памяти вектора

я использую vector<pair<int,int> > ar[100000];
и я должен использовать его для нескольких тестовых случаев, когда каждый раз, когда я хочу инициализировать его, но я получаю ошибку сегментации для этого.

Я попробовал это с объявлением внутри цикла теста и глобально. он работает нормально для первого теста или если есть только один тест.

Я также пытался удалить вектор после каждого теста, но я не знаю точный синтаксис удаления вектора этого типа, какая-либо помощь?

int main() {
long long a, b, c, d = 0, i, j, n, m, t;
scanf("%lld", &t);
while (t--) {
scanf("%lld %lld", &n, &m);

vector<pair<long long, long long> > ar[n + 9];
for(i = 0; i < m; i++) {
scanf("%lld %lld %lld",&a,&b,&c);
ar[a - 1].push_back(make_pair(b - 1, c));
ar[b - 1].push_back(make_pair(a - 1, c));
}
vector<long long> distance(10000, 100000000);
scanf("%lld", &a);
dijkstra(ar, a - 1, distance);

for (i = 0; i < n; i++) {
if (i == a - 1)
continue;
if (distance[i] != 100000000)
printf("%lld ", distance[i]);
else {
// printf("%lld\n", visited[i]);
printf("-1 ");
}
}
printf("\n");
// ar.clear();
distance.clear();
}
return 0;
}

3

Решение

vector<pair<long long,long long> > ar[n+9]; незаконно в C ++. Размеры массива в стиле C должны быть известны во время компиляции.

Если ваш компилятор допускает это, вы должны использовать расширение компилятора, которое может привести к вашим сбоям. Например, возможно, это вызывает переполнение стека, хотя мы намного превосходим то, что охватывается стандартами C ++.

Вместо использования массива в стиле C используйте вектор:

vector<vector<pair<long long,long long>>> ar(n+9);

Тогда это законно, и если вам не хватит памяти, вы получите bad_alloc Исключение (Добавление catch обработчик для этого случая может быть полезен).

Вы также должны проверить, что индексы массива не выходят за пределы, прежде чем их использовать. Например:

scanf("%lld %lld %lld",&a,&b,&c);
if ( a < 1 || a > ar.size() || b < 1 || b > ar.size() )
throw std::runtime_error("Edge out of bounds");

Также вы должны проверить n < 10000 перед входом в for(i=0;i<n;i++){ петля, потому что i используется в качестве индекса в distance, На самом деле жесткое кодирование 10000 кажется подозрительным здесь.

В качестве альтернативы, используя ar.at(a-1) вместо ar[a-1]и т. д., будет работать для проверки границ.

2

Другие решения


По вопросам рекламы [email protected]