【问题标题】:Is it safe to store a changing object in a stl set?将更改的对象存储在 stl 集中是否安全?
【发布时间】:2015-10-30 22:49:28
【问题描述】:

我想要一个容器来存储唯一的 std::weak_ptrs。 std:set 需要 operator

这实际上安全吗?如果没有,对容器有什么建议吗?

谢谢

【问题讨论】:

  • 在我的 gcc 上,weak_ptrs 似乎不是默认的 std::less
  • operator< 似乎没有为weak_ptr 定义,所以less 不起作用。
  • @Sam:哦,好的,在这种情况下使用std::owner_less<std::weak_ptr<T>> 作为谓词。
  • 非常感谢,owner_less 看起来很完美

标签: c++ stl


【解决方案1】:

user3159253 是正确的。在这里找到完整的答案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html

     weak_ptr::operator<

由于weak_ptr 可以随时过期,因此不可能根据弱指针的值对它们进行排序。访问已删除指针的值会调用未定义的行为,并且 reinterpret_cast 技巧也不好,因为下一个新表达式可以重用相同的指针值。使用 p.lock().get() 进行排序也有类似的缺陷,因为这意味着 p

【讨论】:

  • 那篇论文是一个不错的发现。一方面,我希望弱指针的顺序在到期后保留。直到!
【解决方案2】:

您不能使用weak_ptrs 作为键,除非您使用基于所有者的比较(针对基于值的比较,甚至没有为 weak_ptr 定义,尝试使用 运算符 导致错误)。 问题是它们可能会过期,并且容器的顺序(setmap)将不再一致。

正如 Kerrek SB 正确指出的那样(请原谅我,但移动应用程序不允许我正确链接用户),并且您可以从我在 cmets 中的链接中阅读,您可以从 C+ 开始依赖 std::owner_less +11。

一种有效的方法是使用set,其定义如下:

std::set<std::weak_ptr<C>, std::owner_less<std::weak_ptr<C>>>

请注意,owner_less 可以不那么冗长,因为它会自动推断类型。

请记住,这种方法不会阻止您在访问 set 时调用 expired 方法,因为即使一致排序,它仍可能包含过期对象。

另外,请注意,过期的 weak_ptr 和空的 weak_ptr 之间存在巨大差异,因此基于所有者的比较可能不是那么直观,即使使用上述方法后过期不应该影响它。

Heresomelinks.

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2016-07-11
    • 2010-09-19
    • 2023-04-02
    • 2018-08-15
    • 2021-09-26
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多