2015-01-30 2 views
1
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)); 
      } 
     } 
    } 
}; 

У меня есть класс, который содержит кучу узлов в unordered_set и имеет указатель на себя, называемый child. Когда выполняются некоторые произвольные условия, этот класс должен перемещать некоторые (или все) его указатели на объекты узла в контейнер дочерних узлов. Но я не уверен, возможно ли это, так как ключи в unordered_sets являются константами.Перемещение умного указателя из одного unordered_set из другого

Я не против создания нового умного указателя, но я не могу позволить себе создавать новый узел каждый раз, когда я его перемещаю или удаляю из unordered_set. Если то, что я пытаюсь сделать, невозможно с помощью unique_ptrs, мне было интересно, возможно ли это с помощью shared_ptrs?

Я никогда не реализовал свои собственные распределители для контейнеров STL, поэтому не уверен, что я нахожусь на правильном пути, но я подумывал написать пользовательский распределитель для unordered_set, который принимает bool, если это правда, он удаляет объект objet if он ошибочен, он не освобождает указатель, но удаляет его из контейнера (опять же, не уверен, могу ли я сделать такое резкое изменение в поведении контейнера)

Итак, возможно ли каким-то образом перемещать умный указатель с одного неупорядоченного_set другому, не освобождая его?

Примечание: Пожалуйста, не обращайте внимания на ошибки опечаток и синтаксиса, это очень упрощенная версия моего кода.

+0

Вам нужно будет удалить векторные элементы из родительского списка, если вы переводили на дочерний. – AndyG

+1

@AndyG Я готов создать временный shared_ptr и стереть исходный файл из набора, но я не уверен, могу ли я сделать это, не освобождая точки интеллектуального указателя объекта. – duoren

ответ

2

Ваш код работает afool ​​из 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; 
} 
Смежные вопросы