【发布时间】:2014-01-31 19:16:57
【问题描述】:
在 c++11 中,std::unordered_set 容器提供了插入重载和新函数 emplace,以便它可以与不可复制构造的键一起使用,例如 std::unique_ptr。
当您想删除其中一个键时会发生什么? auto temp = std::move(*some_iterator) 有效吗?是否有一些函数可以让我们同时擦除一个元素并将其移动到一个临时对象中?
编辑:我尽量保持简短、甜美和简单,但要更清楚:
- 是否有一个迭代器适配器(可能是 move_iterator?)可以让我从容器中移动一个元素并删除该迭代器?
- 如果不是,为什么不呢?未来的 c++ 不应该包含这种接口吗?
情况似乎是不可能的:你不能在删除之前使密钥失效,删除后你也无法访问它。
【问题讨论】:
-
在 C++11 中
std::unordered_container不存在。 -
@Jefffrey 错字,已修复
-
我建议将您的数据结构从
unordered_set<unique_ptr<T>>切换到unordered_map<T*, unique_ptr<T>>,这样您就可以在擦除之前检索unique_ptr:auto temp = std::move(some_iterator->second);。 -
@Casey 这只是一个例子(选择是常见的) - 我想编写可以使用非复制构造对象的通用代码。 api好像是不对称的。
标签: c++ c++11 move-semantics