保存std::list中的std::set



我有一个集合:

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

有一种更好的方法:

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

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

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

编辑:我知道,在评论之后,这个答案对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
}

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

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

如果只复制引用-指针。然后,列表中事物的修改将反映在集合的项上,反之亦然,因为它们存储Proc*。如果意图是复制实际的Proc对象。张贴的代码做到了。

编辑:反映评论。

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

最新更新