【问题标题】:Can you use a boost::shared_ptr as a key for a map?你可以使用 boost::shared_ptr 作为地图的键吗?
【发布时间】:2010-11-10 15:21:29
【问题描述】:

我可能需要重新考虑我的整体设计,但就目前而言,看起来我可能想做一些类似的事情:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;

我试过这个,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作)。但我对这种方法有了第二个想法。我怀疑其中有一些我不知道的问题。

那么,以上内容在实际意义上有效吗?或者我这样做时是否有一些我不知道的缺陷?

【问题讨论】:

  • @Sam,你还没有发现问题并不意味着它不存在。我认为询问此类非标准用法的潜在问题是个好主意。
  • 感谢大家的回复。正如你们中的一些人所指出的,这主要是糟糕设计的症状。我试图在错误的地方解决问题。从那以后,我重新检查了我的设计,不需要做我质疑的糟糕地图。关于为什么这是一个坏主意的回答也非常有启发性。我的直觉知道它不会完全按照我的意愿去做。直到现在我才明白为什么。 (事实上​​,我试图做的不适用于我上面模板化的地图)

标签: c++ shared-ptr stdmap


【解决方案1】:

参考有这样的说法:

template<class T, class U>
  bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws

返回:一个未指定的值,使得

  • operator
  • 在 operator

抛出:什么都没有。

注意:允许将 shared_ptr 对象用作关联容器中的键。

【讨论】:

  • 很高兴你找到了这个。快速浏览一下标题后,我得出了相反的结论,但这是基于我自己有缺陷的分析。
  • 但是为什么要使用 shared_ptr 作为容器中的键呢?
  • 感谢您的回答和澄清。正如我怀疑的那样,我需要重新审视我的方法。在我的情况下,我正在寻找一种简单的方法来跟踪 shared_ptr 和“B”,但这不起作用。
  • @davka: 这样您就可以将 shared_ptr 放入 set
【解决方案2】:

是的,您可以使用共享指针作为 std::map 的键,但这是设计损坏的明确标志。它会根据一些随机内存位置进行排序。

你的问题有点含糊。如果您说出您将如何使用该地图以及您要归档什么,您可能会得到更有用的答案。

【讨论】:

  • 随机排序的映射对于快速查找与对象关联但不属于对象的数据仍然很有用。我不会贸然下结论设计失败。
  • @Mark 你能举个例子吗?如果映射的键是指针,那么为什么映射的值不是对象的一部分?效果是一样的。
  • 如果要根据特定对象搜索数据怎么办?在将数据附加到 UI 列表中的项目时,我已经使用了很多次,当 API 没有提供这样做的合理方法时。
  • @Noah 然后写一个包装器。通过这样做,您还可以简化代码的单元测试,因为您可以用模拟对象替换您的对象。
【解决方案3】:

我对共享指针不是 100% 熟悉,但如果有办法访问原始指针,您可以使用它作为键(如果您出于某种原因仍然担心)。

【讨论】:

  • 但是地图不会阻止 shared_ptr 自我毁灭。如果您要将 shared_ptr 本身放入地图中,那么您可以使其在地图中找到对 ptr 的唯一引用。
  • 我不明白...他只是想要一个指向 B 对象的指针的映射,所以我说如果他因为某种原因害怕使用共享 ptr,他可以使用指针本身。
  • 或者你的意思是在地图中有一个shared_ptr的副本,它会阻止对象被删除?
  • 您无需存储原始指针即可执行此操作。您可以存储共享指针并覆盖映射的比较运算符。
【解决方案4】:

如果您将它与 boost::python 一起使用,请小心! 如果您从 Python 传入这些 shared_ptr 对象,则 C++ 中基于比较 shared_ptr 对象的所有操作都可能会失败

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多