繁体   English   中英

Unordered_set:移动移除

[英]Unordered_set: remove with move

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

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

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

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

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

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

要回答这个问题:你不能将std::move()元素从std::unordered_set<T>删除,因为元素都是const而且const对象不能被移动。 当从std::unordered_set<std::unique_ptr<T>> erase() std::unique_ptr<T> ,指向的对象将被delete d:没有允许你在erase()恢复指针的接口erase()元素。 也没有一个splice()成员将元素粘贴到另一个容器中,在那里可以忽略它直到它是时候摆脱它。

我的解决方案只是将元素放在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;

现在,您可以移动所有想要的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM