刚刚遇到需要在STL容器中存储堆分配指针(到B类)的情况。拥有私有容器(类A)的类也创建了B的实例。类A将能够为A的客户端返回一个指向B实例的const指针。
现在,如果这些指针存储在一个集合或一个向量中,这有关系吗?我想过有一个集合只是为了验证没有存储重复项,但是由于地址存储,可以存储两个具有相同数据的B指针(除非我提供了一个比较类,用于我假设的数据比较)。
对此(非常模糊)主题的任何想法?替代品的优缺点是什么? smart_pointers是否值得关注?
请问我是否有任何要求不明确,谢谢!
答案 0 :(得分:4)
将指针存储在标准容器中没有任何问题 - 无论是矢量,集合,映射还是其他。你只需要知道谁拥有那个记忆并确保它得到适当的释放。选择容器时,请选择最符合您需求的容器。 vector非常适合随机访问和附加,但不适合插入容器中的其他位置。 list非常适合插入,但它没有随机访问权限。集合确保容器中没有重复项并且它已经排序(尽管如果集合保存指针并且您没有提供比较器函数,排序不是很有用),而映射是一组键值对,所以排序和访问是通过密钥完成的。等等。每个容器都有其优点和缺点,哪种情况最适合特定情况,完全取决于这种情况。
至于指针,再次,在容器中有指针是好的。您需要担心的问题是谁拥有内存,因此必须担心释放内存。如果有一个明确的对象拥有特定指针指向的内容,那么它应该是释放它的那个对象。如果它本质上是拥有内存的容器,那么你需要确保在容器被销毁之前删除容器中的所有指针。
如果你担心有多个指向浮动的相同数据的指针,或者对于特定的内存块没有明确的所有者,那么智能指针是一个很好的解决方案。 Boost的shared_ptr
可能是一个很好用的,shared_ptr
将成为C ++ 0x的一部分。许多人会建议你应该总是使用共享指针,但是会涉及一些开销,它是否最适合你的特定应用程序将完全取决于你的应用程序。
最终,您需要了解各种容器类型的优点和缺点,并确定最佳容器是什么,无论您正在做什么。对于如何处理指针管理也是如此。您需要以明确拥有特定内存块的方式编写程序,并确保该所有者在适当时释放它。共享指针只是一个解决方案(虽然是一个很好的解决方案)。最好的解决方案取决于您的计划的细节。
答案 1 :(得分:0)
为什么首先会有重复?如果A类是负责创建实例的唯一实体,并且它私有地保存容器,意味着其他人无法改变它,那么在我看来应该没有重复的原因。好吧,如果有的话,在将指针添加到向量之前,是否可以通过某些检查来补救?
我不知道为什么将指针存储在哪种容器中会很重要。容器并不真正操纵他们的数据,他们只以不同的方式提供对它们的访问。所以,这取决于你:)
答案 2 :(得分:0)
如果需要在stl容器中存储指针,请使用shared_ptr。
现在,这个集听起来完全错了。你打算怎么办? 如果需要添加和删除,请列出。 如果你需要迭代范围或全部,那么矢量。 如果您需要访问特定的,知道密钥,然后映射。 看看其他人。一种尺寸并不适合所有人。
答案 3 :(得分:0)
我的回答是,您所做出的任何决定都必须考虑到您的目标。如果您需要一个集合强制执行的“不允许重复”规则,则使用集合。如果没有,那么你可能想要使用矢量或任何容器都可以做到这一点。
至于smart_pointers是的,它们真的很有用。他们应该被使用吗?我不知道,我再一次不知道你的最终目标是什么,或者你想要解决的问题。
基本上它归结为此。如果我说“我想用锤子。你觉得怎么样?”你可能会说“好吧,我知道锤子对于钉子和木头场景非常好,但它们也可以用来作为伤害人的工具或者作为书架。看,等一下,这是什么又一次?“问题是我没有,真的说我为什么要用锤子。我还没有说过我想要实现的目标。
因此,如果您有一个总体目标,那么为什么不让我们知道,那么如果您使用正确的工具来完成工作将是显而易见的,我们可以为您提供更多帮助。
答案 4 :(得分:0)
在我看来,坚持使用矢量,除非你有真正的理由不这样做。与向量相比,集合带来一些运行时开销以及相当大的语义开销。