从一个 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;
}
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;
}