C++ 在std::列表中保存std::set
我有一套:C++ 在std::列表中保存std::set,c++,list,set,C++,List,Set,我有一套: std::set<Proc*> finalProc = getFinalProc(); std::set finalProc=getFinalProc(); 我只想把这个集合中的所有元素复制到一个列表中。我想我必须遍历集合并保存列表中的元素?我想我犯了一个大错误,但我找不到解决办法: std::list<Proc*> firstLevel; for(std::set<Processor*>::iterator it = endProcessor
std::set<Proc*> finalProc = getFinalProc();
std::set finalProc=getFinalProc();
我只想把这个集合中的所有元素复制到一个列表中。我想我必须遍历集合并保存列表中的元素?我想我犯了一个大错误,但我找不到解决办法:
std::list<Proc*> firstLevel;
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){
firstLevel.push_back( ???? );
}
std::list firstLevel;
对于(std::set::iterator it=endProcessors.begin();it!=endProcessors.end();++it){
第一级。推回(;
}
这个想法是
向后推
所有迭代元素?有一种更好的方法:
std::list<Proc*> firstLevel(finalProc.begin(), finalProc.end());
firstLevel中指针指向的所有内存在退出
firstLevel
可见性范围后将自动释放。编辑:我知道,在评论之后,这个答案对OP没有帮助,但一开始并不清楚。因此,如果有人来到这里,想要一种复制真实物体的方法,我想离开这里。只是为了完整
如果要复制指向Proc
对象的指针,请选择sashas answer
但是,若要复制集合中保存的实际对象,则需要显式复制它们
std::list<Proc*> firstLevel;
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){
firstLevel.push_back( new Proc(**it) ); //1
}
std::list firstLevel;
对于(std::set::iterator it=endProcessors.begin();it!=endProcessors.end();++it){
第一级。推回(新进程(**it));//1
}
[1]取消引用迭代器,取消引用指针以获取实际对象,然后从中创建一个新的Proc
对象,并将指针从“新建”推送到列表中
我看到已经有人投了反对票,所以也许我会尝试详细说明
如果只复制引用-指针。然后列表中事物的修改将反映在集合的项上,反之亦然,因为它们存储Proc*
。如果目的是复制实际的Proc
对象。发布的代码可以做到这一点
编辑:
反映评论
当然,重要的是要记住,当存储指针时,当容器被破坏时,只调用它的元素。在这种情况下,这将是
Proc*
。我的意思是只有指针会丢失。如果我们在创建向量时显式复制元素,当然我们需要显式迭代并在每个元素上使用delete
,以正确地释放内存。另一种选择是使用智能指针,但原来的示例没有,所以我也留下了它。太简单了。。。谢谢迭代器中的push_是什么错误的想法?我看到一个bug传入。注意,他存储了指向Proc
的指针。您将复制这些参考资料。我不确定这是否是有意的。我的意思是,如果OP说的“保存元素”意味着保存其状态,那么这将无法按预期工作。我知道这是名单上的内容。我在问这是否是真正的意图。@user好的,知道这一点很重要。我看到一些代码将指针存储在列表中,但希望复制实际对象。我还看到了想要复制引用的代码。我只是觉得需要澄清一下。对于使用智能指针的建议+1。我有类似的代码,相信我,在复制指针时释放元素两次要容易得多,而且发生的次数也比看起来要多。我还要强调一点。已经向您展示了更好的方法,但为了完整起见,您将用*it
替换??<代码>它
被视为一个指针,因此*
将其“取消引用”并获取值,然后将其推入列表
。谢谢。指针副本很好。但我会记住这一点。thanks@sasha哈哈,好吧,我完全理解,但是这样的评论就可以了。然而,同样的问题依然存在,在你的回答中,我认为这更危险,因为元素只需要删除一次。一个人需要关心在哪里做这件事。特别是当您有指向同一元素的指针的多个副本时。@luk32,在我的情况下,一切都很好,因为我复制了一个副本。并且unique\u ptr
以后会自动删除它。@sasha我看到你编辑了答案。现在真的很好,我投了赞成票。只有将来有人来问这个问题,并想复制实际元素时,我才会离开我的问题。@luk32,请随意离开,因为您比我早做过。和+1表示您的注意)
std::list<Proc*> firstLevel;
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){
firstLevel.push_back( new Proc(**it) ); //1
}