通过用户将内存分配给 class 内的列表 stl

Allocating memory to a list stl inside class through user

class Graph
{
    int num;
public:
        Graph(int n)
    {
        num = n;
    }
    list<int>* mylist = new list<int>[num];
    int* arr = new int[num];
    queue<pair < int, int >> pq;
    void accept();
};
int main()
{
    int n;
    cout << "Enter the number of vertices=";
    cin >> n;
    Graph g=Graph(n);
    g.accept();

}

我有这个 class 的图形,我想分配大小为 'num' 的内存,这是用户在 main 函数中的输入。但它显示内存分配错误。

你应该了解 C++ 的初始化,这很重要并且不同于赋值。

在你的例子中,mylistarr 的初始化发生在 num 的“初始化”之前(事实上,你没有初始化 num,你所做的是 default-initialize 然后分配给它),因此 num 的值在那个时候是不确定的,并且 new 抱怨“内存分配错误”。

初始化成员的正确方式:

class Graph
{
    // write data members together,
    // their declaration positions in class do not indicate execution order
    int num;
    list<int>* mylist;
    int* arr;
    queue<pair < int, int >> pq;
    void accept();
public:
    Graph(int n)
      : num(n), mylist(new list<int>[n]), arr(new int[n])
    // member initializer list start with a ":" and followed by a list of
    //   member_name(initializer_for_this_member)
    // note their order should match the declaration order
    {
    // usually initialization all happen in the initializer list,
    // and constructor body is empty
    }

};

正如 πìντα ῥεῖ 指出的那样,您应该尽可能避免使用 new 并选择标准容器。在您的示例中,我猜您想要一个动态列表数组和一个动态数字数组。为此,您可以使用 std::vector

class Graph
{
    int num;
    vector<list<int>> mylist;
    vector<int> arr;
    queue<pair < int, int >> pq;
    void accept();
public:
    Graph(int n) : num(n), mylist(n), arr(n) { }
    // initialize vector to contain n value-initialized objects
};