动态初始化和使用C ++ STL列表数组

时间:2013-05-05 10:22:35

标签: c++ stl

我有一个类,我已将list数组声明为数据成员。

list <int> **listOfNodes;

我已经为类的构造函数中的列表指针分配了空间,如下所示(这里'v'是我想要的列表编号,作为参数传递给构造函数。)

listOfNodes=new list<int>* [v];
for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  //declaring a new list and making the list pointer point to it
}

现在我在函数中有以下代码,用于从用户那里获取输入并将其添加到相应的列表中。例如,如果用户输入2 5,我需要将新条目5推送到索引为2的列表中,即listOfNodes [2]指向的列表。

int u,v;
cin>>u>>v;
(*(listOfNodes[u])).push_back(v);

但是,不知怎的,我的代码在执行时崩溃了。 有人可以指出我可能做错了什么。

2 个答案:

答案 0 :(得分:2)

for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  
} // <- each temp is destructed here.

您的temp列表会自动分配。这意味着一旦你走出循环范围,它们就会被破坏。现在你的listOfNodes[i]指向一些被破坏的内存(可能它们指向同一个位置,因为编译器每次都在同一地址分配temp。虽然仍然无效。)。

你应该像

那样做
for (int i = 0; i < v; ++i)
{
    listOfNodes[i] = new list<int>;  
}

不要忘记delete动态分配的记忆。您应该只使用列表/矢量列表或使用smart pointers列表。

答案 1 :(得分:2)

避免将C ++容器(list,vector,set,...)与C容器(普通数组)混合使用。如果你想保留一些列表使用向量:

std::vector<std::vector<std::list<int>>> nodes;

而不是

std::list<int>** listOfNodes;

手动跟踪列表实例非常麻烦(正是您所经历的)。因此,根据您的情况,让矢量(或您认为合适的任何其他内容,std::array可能更容易合适)处理列表实例。