你可以使用boost :: shared_ptr作为地图的关键吗?

时间:2010-11-10 15:21:30

标签: c++ shared-ptr stdmap

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

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

我已经尝试了这个,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作)。但我对这种方法有了第二个想法。我怀疑那里有一些我不知道的陷阱。

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

4 个答案:

答案 0 :(得分:24)

参考文献可以这样说:

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

返回:未指定的值,例如

  • 运营商LT;是一个严格的弱排序,如C ++标准的第25.3节[lib.alg.sorting]所述;
  • 在运算符&lt;,!(a&lt; b)&amp;&amp; !(b&lt; a),当且仅当两个shared_ptr实例共享所有权或者都是空的时,它们是等效的。

抛出:没有。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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