При запуске моего кода отображается завершение вызова после создания экземпляра 'std::bad_alloc' what(): std::bad_alloc

Мой код представляет собой реализацию графа на С++. Я скопировал свой код с веб-сайта, но когда я пытаюсь запустить его в своей локальной среде IDE, он выдает ошибку.

#include<iostream>
#include<vector>
#include<list>
#define pi 3.14159
#define ll long long
#define pb push_back
#define pf push_front

using namespace std;

class Graph{       // Graph class 
        int v;
        list <int> *l;
    public:
        Graph(int v)
        {
            this-> v = v;
            l = new list<int>[v];
        }
        void add_edge (int i , int j)
        {
            l[i].pb(j);
            l[j].pb(i);
        }
        void show_adj()
        {
            for(int i = 0  ; i < v ; i++)
                {
                cout << i << "->";
                for(int a : l[i])
            {
                cout << a << ",";
            }
            cout << "\n";
                }
        }
};

int main() // main body
{

    Graph g(4);
    g.add_edge(7,4);
    g.add_edge(7,3);
    g.add_edge(3,1);
    g.add_edge(4,1); // adding an edge
    g.show_adj(); //showing the edges
//vector<int> v;
//int t; cin >> t;
//while(t--)
//{
//
//}

return(0);
}

Мой код показывает

завершение вызывается после создания экземпляра 'std::bad_alloc' what(): std::bad_alloc

Я понял, что это связано с нехваткой памяти или с выпадением переменных из функции main(), но я не могу понять, как решить проблему в этой конкретной ситуации. Если это актуально, я работаю на компьютере с Windows.

Пожалуйста, помогите мне понять, в чем проблема.

Если вы можете опубликовать фрагменты кода, мне будет очень легко.


person immortal    schedule 08.03.2021    source источник
comment
Во-первых, вы не должны использовать эти ужасные макросы, такие как pb, ll и т. д. Люди здесь должны читать и понимать ваш код, и использование этих макросов в этом не поможет. Во-вторых, если вы использовали std::vector<std::list<int>> l; вместо list <int>*l;, а затем l.at(i).push_back(j);, ошибка будет показана вам как исключение std::out_of_range. Это никак не связано с нехваткой памяти. Эти методы написания кода, которые могут выполнять самодиагностику, не могут быть изучены на любом веб-сайте онлайн-соревнований по программированию, который вы используете.   -  person PaulMcKenzie    schedule 08.03.2021


Ответы (1)


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

    Graph(int v)
    {
        this-> v = v;
        l = new list<int>[v];
    }

Graph g(4);

Итак, это означает, что в g.l есть место для четырех списков с номерами 0, 1, 2 и 3.

g.add_edge(7,4);

    void add_edge (int i , int j)
    {
        l[i].pb(j);
        l[j].pb(i);
    }

Это пытается установить значение l[7]. Но l[3] — последний элемент в l.

Кроме того, вы уверены, что вам нужен массив списков?

person David Schwartz    schedule 08.03.2021
comment
Большое спасибо за ответ. Это действительно сработало. Я только изучаю графики в cpp, поэтому выбрал этот подход. - person immortal; 08.03.2021