我想要一个容器来存储唯一的std::weak_ptrs。std:set需要operator<,可能是因为它将项目存储在树中。我的担心是,如果我按照显而易见的方式实现operator<(销毁的ptr = null ptr < 有效ptr),那么这个结果可能会在向容器添加项后发生变化,这可能会导致容器出错。
这样做是否安全?如果不是,有没有建议的容器?
谢谢
这样做是否安全?如果不是,有没有建议的容器?
谢谢
user3159253是正确的。在这里找到完整的答案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html
weak_ptr::operator<
除非您使用基于所有者的比较(与基于值的比较相对,后者甚至未定义为weak_ptr,尝试使用operator<会导致错误),否则不能将weak_ptr
用作键。
问题在于它们可能会过期,您的容器(包括set
和map
)的排序将不再一致。
正如Kerrek SB所指出的那样(请原谅我,但移动应用程序不允许我正确链接用户),并且正如您可以从我的评论中的链接中阅读到的那样,您可以依赖C++11开始提供的std::owner_less
。
一个有效的方法是使用以下定义的set
:
std::set<std::weak_ptr<C>, std::owner_less<std::weak_ptr<C>>>
owner_less
可以更简洁,因为它会自动推断类型。set
时调用 expired
方法,因为即使有序,它仍然可能包含已过期的对象。weak_ptr
和空的 weak_ptr
之间存在巨大的区别,因此基于所有者的比较可能不是那么直观,即使使用上述方法后过期也不应该影响它。
这里 一些 链接。
std::owner_less<std::weak_ptr<T>>
作为谓词。 - Kerrek SB