list — C ++: ошибка St9bad_alloc для небольшого ввода

Я построил программу для преобразования мультиграфа в неориентированный граф с несколькими ребрами и удаленными собственными циклами, используя список смежности как представление графа.
`

 #include<iostream>
#include<istream>
#include<algorithm>
#include<list>
using namespace std;

int main()
{
list<int> adj[3];
list<int> auxArray[3];
list<int> adjnew[3];
cout<<adjnew[2].back()<<endl; // Gives output 0, whereas it should have some garbage
//value

for(int i = 0;i<3;i++){
int x;
while(true){ // reading a line of integers until new line is encountered , peek()
returns the next input character without extracting it.
cin>>x;
adj[i].push_back(x);
auxArray[i].push_back(x);
if(cin.peek() == '\n') break;
}
}

//flatten the adj-list
for(int i = 0;i<3;i++){
list<int>::iterator it = adj[i].begin();
while(it != adj[i].end()){
auxArray[*it].push_back(i);
it++;
}
}

for(int i = 0;i<3;i++){
list<int>::iterator it = auxArray[i].begin();
while(it != auxArray[i].end()){
//cout<<*it<<" "<<adjNew[*it].back()<<endl;
if((*it != i) && ((adjnew[*it].back()) != i)){
// cout<<*it<<" -> "<<i<<endl;
adjnew[*it].push_back(i);
}
it++;
}
}

for(int i = 0;i<3;i++){
list<int>::iterator it = adjnew[i].begin();
while(it != adjnew[i].end()){
cout<<*it<<" ";
it++;
}
cout<<endl;
}
return 0;
}

`

Но это показывает St9bad_alloc ошибка, тогда как мой список имеет размер всего 3.

Кроме того, adjnew [2] .back () присваивается «0» без инициализации, тогда как у него должно быть некоторое значение мусора.

Input:
1 2 1
0
1 1

Output of Program(Incorrect because of 0 as back element in adjnew[2]):
1 2
0 2
1

Correct Output:
1 2
0 2
0 1

Все предложения приветствуются!

-1

Решение

cout<<adjnew[2].back()<<endl;

в начале простое неопределенное поведение в пустом контейнере.

валгринд дает

Conditional jump or move depends on uninitialised value(s)

для этой строки:

if ((*it != i) && ((adjnew[*it].back()) != i))

Опять неопределенное поведение в пустом контейнере.

Подсказка: вы можете использовать container.at () вместо operator [] для проверки диапазона.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector