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
}