【发布时间】:2020-05-29 21:25:30
【问题描述】:
我使用unique_ptrs 将一些对象的所有权存储在unordered_set 中。
但我不知道有什么好的方法可以在时机成熟时将其中一个从片场中删除。
代码如下所示:
typedef unique_ptr<MyType> MyPtr;
unordered_set<MyPtr> owner;
MyPtr p = make_unique<MyType>("foo")
MyType *pRaw = p.get();
owner.insert(std::move(p));
// Later ...
// I want to do something like this (cannot be written as-is, of course):
// owner.erase(pRaw);
有没有办法做到这一点?
当然,我可以使用 begin() 和 end() 迭代整个集合,但将它们放入集合中的全部意义在于提高这些查找效率。
我已经想到了一些事情:
- 使用
shared_ptr。对于我的情况,这是错误的抽象。所有权是独一无二的。 - 使用原始指针,忘记unique_ptr。这放弃了
unique_ptr提供的所有优势。 - 使用
unordered_set::begin(key)查找存储桶。据我所知,我无法创建与我要删除的unique_ptr匹配的密钥。但我很高兴被证明是错误的(:
(事实上,我使用eastl::unordered_set 解决了这个问题,它的find_as 函数用于自定义键)
【问题讨论】:
-
erase有什么问题? -
@Eljay
unique_ptr == raw_ptr格式不正确。 -
@Eljay:
erase采用迭代器。我如何获得迭代器?erase的另一种形式需要unique_ptr,但我无法创建其中一个,因为它们是......独一无二的(: -
使用这里提到的
unordered_map<rawptr, uniqptr>:stackoverflow.com/q/18939882 或等到 c++20 获得模板化的 find 方法 en.cppreference.com/w/cpp/container/unordered_set/find -
嗯,我在想,当您插入时存储返回的迭代器,而当您想擦除时使用该迭代器。喜欢
auto pRaw_iter = owner.insert(std::move(p)).first; owner.erase(pRaw_iter) /* instead of owner.erase(pRaw) */;。如果您确定要删除哪些内容,则此方法有效,但如果这是“待确定”,那么这将非常痛苦...
标签: c++ c++14 unique-ptr unordered-set