如果目标是查找的恒定时间,我认为没有解决方案。
std::unordered_set<std::unique_ptr<MyClass>>::find
需要一个
std::unique_ptr<MyClass>
as 参数。您将不得不更改容器或更改包含的类型。
一种可能性可能是替换std::unique_ptr
为
std::shared_ptr
,并更改其余代码,以便
MyClass
在创建后立即将所有代码放入 shared_ptr 中,并且仅通过共享指针进行操作。从逻辑上讲,无论如何这可能更加连贯:unique_ptr
几乎暗示(通过它的名称以及它的语义)没有其他指向该对象的指针。另一方面,您可能无法使用 shared_ptr,如果例如MyClass
有指向 other的指针MyClass
,这可能会建立一个循环。
否则,如果您可以接受 O(lg n) 访问,而不是恒定访问(在表相当大之前差异通常不会变得明显),您可以使用
std::vector<MyClass>
, usingstd::lower_bound
来保持排序。与 不同,std::unordered_set<>::find
不std::lower_bound
要求目标值
与序列的类型相同;您所要做的就是确保它们具有可比性,例如通过提供以下内容的对象:value_type
Compare
class MyClassPtrCompare
{
std::less<MyClass const*> cmp;
public:
bool operator()( std::unique_ptr<MyClass> const& lhs,
std::unique_ptr<MyClass> const& rhs ) const
{
return cmp( lhs.get(), rhs.get() );
}
bool operator()( MyClass const* lhs,
std::unique_ptr<MyClass> const& rhs ) const
{
return cmp( lhs, rhs.get() );
}
bool operator()( std::unique_ptr<MyClass> const& lhs,
MyClass const* rhs ) const
{
return cmp( lhs.get(), rhs );
}
bool operator()( MyClass const* lhs,
MyClass const* rhs ) const
{
return cmp( lhs, rhs );
}
};
插入可能涉及许多移动,但移动 astd::unique_ptr
应该相当便宜,并且该解决方案改进的局部性可能会抵消它所带来的额外运行时成本。