在std :: list中保存std :: set

时间:2013-07-30 11:05:25

标签: c++ list set

我是c ++编程的新手,有一些问题。

我有一套:

std::set<Proc*> finalProc = getFinalProc();

我只想将此集合中的所有元素复制到列表中。我以为我必须遍历集合并保存列表中的元素?我想我犯了一个重大错误,但我无法找到解决方案:

std::list<Proc*> firstLevel;
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){
    firstLevel.push_back( ???? );
}

想法是push_back所有迭代元素?

感谢

2 个答案:

答案 0 :(得分:8)

有一种更好的方法:

std::list<Proc*> firstLevel(finalProc.begin(), finalProc.end());

在原始代码中,您应该将????替换为*it,将endProcessors替换为finalProc

正如@ luk32所说,可能你有一个错误(如果你想复制实际数据,而不是指针)。在这种情况下,您可以看到@ luk32解决方案,或者我会在这里找std::unique_ptr(智能指针是在现代C ++中管理内存的首选方式):

std::list<std::unique_ptr<Proc>> firstLevel;
for(const auto& ptr: finalProc){
    firstLevel.push_back(std::make_unique<Proc>(*ptr));
}

在离开firstLevel可见范围后,firstLevel中指针指向的所有内存都将自动释放。

答案 1 :(得分:1)

编辑:我知道,在评论之后,这个答案对OP没有帮助,但一开始并不清楚。因此,如果有人来到这里并想要一种复制实际物体的方法,我想留下它。只是为了完整起见。

如果您想复制指向Proc个对象的指针,请转到sashas回答。

但是,如果要复制实际对象,则需要明确复制它们。

std::list<Proc*> firstLevel;
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){
    firstLevel.push_back( new Proc(**it) ); //1
}

[1] 取消引用迭代器,取消引用获取实际对象的指针,然后从中创建一个新的Proc对象,并将指针从新推送到列表中。

我已经看到了downvotes,所以也许我会尝试详细说明。

如果只复制引用 - 指针。然后,列表中的事物的修改将反映在集合的项目上,反之亦然,因为它们存储Proc*。如果打算复制实际的Proc个对象。发布的代码就是这样。

编辑: 反映意见。

当然重要的是要记住,当你存储指针时,当容器被破坏时,只有它的元素被调用。在这种情况下,Proc*。我的意思是只有指针会丢失。如果我们在创建向量时创建元素的显式副本,当然我们需要显式迭代并在每个元素上使用delete来正确释放内存。另一种方法是使用智能指针,但原始示例没有,所以我也离开了它。