我有一个类,我已将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);
但是,不知怎的,我的代码在执行时崩溃了。 有人可以指出我可能做错了什么。
答案 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
可能更容易合适)处理列表实例。