从一个 unordered_set 移动一个智能指针到另一个

Moving a smart pointer from one unordered_set from another

template<class T>
Class Node
{
    //irrelavant functs
};
class A
{
    unordered_set<unique_ptr<Node<T>>, myHash<Node<T>>, myEqual<Node<T>>> nodes
    shared_ptr<A> child;

    void moveToChild()
    {
        for(auto it = nodes.begin(); it < nodes.end(); ++it) {
            if (some_cond) {
                child->nodes.emplace(std::move(*it));
            }
        }
    }
};

我有一个 class,它在 unordered_set 中保存了一堆节点,并且有一个指向自身的指针,称为子节点。当满足某些任意条件时,此 class 应将其指向 Node 对象的部分(或全部)指针移动到子节点容器。但我不确定是否可行,因为 unordered_set 中的键是常量。

我不介意构造一个新的智能指针,但我负担不起每次移动它或从 unordered_set 中移除它时构造一个新节点。如果 unique_ptrs 无法实现我想做的事情,我想知道 shared_ptrs 是否可行?

我从来没有为 STL 容器实现自己的分配器,所以不确定我是否在正确的轨道上,但我正在考虑为 unordered_set 编写一个自定义分配器,如果它是真的,如果对象为假,它会删除对象它不会释放指针,而是将其从容器中删除(同样,不确定我是否可以对容器的行为做出如此巨大的改变)

那么,是否可以通过某种方式将智能指针从一个 unordered_set 移动到另一个而不释放它?

注意:请不要注意拼写错误和语法错误,这是我的代码的粗略简化版本。

您的代码运行 std::set 时只通过常量引用返回其元素,在迭代器上使用 <,而不是从 std::unordered_set 和一些无关紧要的拼写错误中删除开膛破肚的元素。

void moveToChild() {
    for(auto it = nodes.begin(); it != nodes.end();)
        if (some_cond) {
            child->nodes.emplace(std::move(const_cast<nodes::reference>(*it)));
            // Must const_cast above because the set only gives constant access.
            it = nodes.erase(it); // Remove element
        } else
            ++it;
}