C++11 将智能指针从一个无序集合移动到另一个无序集合 模板 类节点 { //无关函数 }; 甲级 { 无序集合节点 共享ptr子系统; void moveToChild() { 用于(自动it=节点.开始();it节点.emplace(std::move(*it)); } } } };

C++11 将智能指针从一个无序集合移动到另一个无序集合 模板 类节点 { //无关函数 }; 甲级 { 无序集合节点 共享ptr子系统; void moveToChild() { 用于(自动it=节点.开始();it节点.emplace(std::move(*it)); } } } };,c++11,move,shared-ptr,unique-ptr,unordered-set,C++11,Move,Shared Ptr,Unique Ptr,Unordered Set,我有一个类,它在无序的集合中保存了一堆节点,并且有一个指向自身的指针,称为child。当满足某些任意条件时,此类应将其指向节点对象的部分(或全部)指针移动到子节点容器。但我不确定这是否可能,因为无序_集中的键是常量 我不介意构造一个新的智能指针,但我不能每次移动它或将其从无序集合中移除时都构造一个新节点。如果我尝试的是使用唯一的\u ptr做不到,我想知道是否可以使用共享的\u ptr 我从来没有为STL容器实现过我自己的分配器,所以我不确定我是否在正确的轨道上,但我正在考虑为无序的_集编写一个

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

我不介意构造一个新的智能指针,但我不能每次移动它或将其从无序集合中移除时都构造一个新节点。如果我尝试的是使用唯一的\u ptr做不到,我想知道是否可以使用共享的\u ptr

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

那么,是否有可能在不释放智能指针的情况下,以某种方式将智能指针从一个无序集移动到另一个无序集


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

您的代码运行在
std::set
上,只通过常量引用返回其元素,在迭代器上使用
节点.emplace(std::move(const_cast(*it));
//必须在上面强制转换常量,因为集合只提供常量访问。
它=节点。擦除(它);//删除元素
}否则
++它;
}

如果要转移到子对象,则需要从父列表中删除向量元素。@AndyG我愿意创建一个临时共享ptr并从集合中删除原始元素,但我不确定在不释放智能指针指向的对象的情况下是否可以这样做。至少对我来说,在GCC 8.3.0中,我在尝试o这样做。据我所知,
擦除(它)
需要该元素的内容是有效的,因此它可以将其与其他内部项目进行比较,等等。但是如果内脏是
std::move
'd,它就会崩溃。一般来说,在对象被移动后对其执行任意操作是不安全的,而且我不知道
擦除
对其可能或可能的内容有任何保证不要躲在引擎盖下面。
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));
            }
        }
    }
};
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;
}