Unordered_set:移动移除

时间:2014-01-13 05:41:58

标签: c++ c++11 move-semantics

在c ++ 11中,std :: unordered_set容器提供了insert重载和新函数emplace,因此它可以与非可复制构造的键一起使用,例如std :: unique_ptr。

当您想要删除其中一个键时会发生什么? auto temp = std::move(*some_iterator)有效吗?是否有一些功能允许我们擦除一个元素并同时将其移动到一个临时值?

编辑:我试图保持简短,甜蜜和简单,但要更清楚:

  • 是否有一个迭代器适配器(可能是move_iterator?),它允许我从容器中移动一个元素,并删除该迭代器?
  • 如果没有,为什么不呢?未来的c ++不应该包含这种接口吗?

这种情况似乎是不可能的:您不能在删除密钥之前使密钥无效,并且在删除密钥后无法访问密钥。

2 个答案:

答案 0 :(得分:6)

对于std::unordered_set<T>,成员emplace()使得对象不必移动:您可以emplace()将不可移动的对象放入容器中。

要回答这个问题:您不能std::move() std::unordered_set<T>个元素,因为所有元素都是constconst个对象无法移动。当erase()来自std::unique_ptr<T>的{​​{1}}指向的对象将为std::unordered_set<std::unique_ptr<T>>时:没有接口允许您在delete时恢复指针元素。也没有erase()成员将元素粘贴到另一个容器中,在可以忽略它之前可以忽略它。

答案 1 :(得分:0)

我的解决方案就是将元素放在std::shared_ptr中。这样你就可以复制它们,然后最终将元素移出shared_ptr

编程方面的成本是你必须自己定义哈希函数。

假设您将std::string放入集合中:

struct MyHasher
{
    size_t operator()(const std::shared_ptr<std::string>& element) const
    {
        return std::hash<std::string>()(*element);
    }
};

然后你像这样unordered_set

std::unordered_set<std::string,MyHasher> the_set;

现在,您可以随意移动元素。