2013-07-30 51 views
1

我在C++编程中很新,并且有一些问题。在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迭代元素?

感谢

+0

你已经显示了更好的方式来做到这一点,但只是为了完整性,你会用'* it'来代替'????'。 'it'有点像一个指针,所以'*'“对其进行”引用“,并获取值,然后将它推入'list'中。 – BoBTFish

回答

7

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

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

在你原来的代码,你应该已经取代????*itendProcessorsfinalProc

正如@ luk32笔记,可能你有一个bug(如果你想复制实际的数据,而不是指针)。在这种情况下,你可以看到@ 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

这么该死的简单...谢谢。迭代器的push_back有什么错误的想法? – user2633791

+0

没有错,但此代码更短。 – Seagull

+1

我看到一个错误传入。请注意,他存储了指向'Proc'的指针。您将制作这些参考文件的副本。不知道这是否是有意的。 – luk32

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以正确释放内存。另一种方法是使用智能指针,但最初的例子没有,所以我也把它留下了。

+0

谢谢。指针副本就好了。但我会牢记这一点。谢谢 – user2633791

+0

@sasha哈哈,好吧,我完全理解,但像这样的评论会很好。然而,同样的问题依然存在,在你的回答中,我认为更危险的是,因为这些元素只需要被删除一次。人们需要关心到哪里去做。特别是如果你有多个指向同一元素的指针副本。 – luk32

+0

@ luk32,在我的情况下,一切都很好,因为我做了一个副本。 ''unique_ptr'稍后会自动删除它。 –

相关问题