2

我有一套:

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所有迭代的元素?

4

2 回答 2

9

有一种更好的方法可以做到这一点:

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

在您的原始代码中,您应该替换????*itendProcessorsfinalProc

正如@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可见范围后自动释放。

于 2013-07-30T11:06:12.590 回答
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对象,并将指针从 new 推送到列表中。

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

如果您只复制引用 - 指针。然后对 list 中事物的修改将反映在 set 的项目上,反之亦然Proc*。如果意图是复制实际Proc对象。发布的代码可以做到这一点。

编辑:反映评论。

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

于 2013-07-30T11:14:01.320 回答