Реализация древовидной структуры данных - Узел - PullRequest
1 голос
/ 12 апреля 2019

Могу ли я попросить вас просмотреть мой код и дать мне несколько советов, что я могу сделать лучше в своей реализации?Я хотел бы, чтобы вы судили мое правило пяти.Я пытался придерживаться хороших стандартов кодирования C ++.

У меня есть несколько проблем:

1. Я запутался в выпуске данных из вектора.Должен ли я позвонить clear() или поменять его местами с пустым вектором, как я сделал в своем коде ниже.

Как работает std::move().После вызова std::move(node) я все еще должен удалить все элементы узла или переместить это для меня?

Заголовочный файл для узла

template <typename V>
class Node
{
private:
    bool visited;
    V value;
    std::vector<Node*> children;
    V time;

public:
    Node(V value,V time);
    Node(const Node<V> &node1);
    Node( Node<V> && node1);
    Node();
    ~Node();
    /////////////////////
    Node& operator=(const Node &n1);
    Node& operator=(Node&& other);
     // more code....
};

Cpp файл для узла

template <typename V>
Node<V>::Node()
        : visited(false) , time(0) , value(0)
{
    children.clear();
}

template <typename V>
Node<V>::Node(V value,V time)
        : value(value) , time(time) , visited(false)
{
    children.clear();
}

template <typename V>
Node<V>::~Node()
{
    children.clear();
    std::vector<Node<V>*>Vec_temp;
    children.swap(Vec_temp);
    value = 0;
    time = 0;
    visited = false;
}

template <typename V>
Node<V>::Node(const Node<V>&node)
{
    value = node.get_value();
    children = node.children;
    time = node.get_time();
    visited = node.was_visited();
}

template <typename V>
Node<V>::Node(Node<V> &&node)
    : value(std::move(node.value)) , time(std::move(node.time)) , visited(std::move(node.visited)) , children(std::move(node.children))
{
    std::vector<Node<V>*>temporary;
    node.children = temporary;
    node.visited = false;
    node.value = 0;
    node.time = 0;
}

template <typename V>
Node<V>& Node<V>::operator=(const Node<V> &n1){
    if(this !=&n1) {
        std::cout << "operator = \n";
        value = n1.value;
        time = n1.time;
        visited = n1.visited;
        /// allocate new memory and coppy
        std::vector<Node<V> *> new_children;
        std::copy(n1.children.begin(), n1.children.end(), 
        std::back_inserter(new_children));
        /// deallocate old memory
        std::vector<Node<V> *> delocate;
        children.swap(delocate);
        /////
        children = new_children;
    }
    return *this;
}

template <typename V>
Node<V>& Node<V>::operator=(Node&& node){
    if( this == &node) return *this;
    /// dealacation
    children.clear();
    /// allocation
    value = node.value;
    time = node.time;
    visited = node.visited;
    children = node.children;
    /// deallocation of node
    std::vector<Node<V>*> temporary;
    node.children = temporary;
    node.visited = false;
    node.value = 0;
    node.time = 0;
return *this;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...