2014-09-01 2 views
1

share_ptr을 사용하여 단독 연결 목록을 구현하려고했습니다. 여기에 구현 ... 아래 노드 클래스는 ... 아래shared_ptr을 사용한 단독 연결 목록

template<typename T> 
class Node 
{ 
public: 
    T value; 
    shared_ptr<Node<T>> next; 
    Node() : value(0), next(nullptr){}; 
    Node(T value) : value(value), next(nullptr){}; 
    ~Node() { cout << "In Destructor: " << value << endl; }; 
}; 

링크 된 목록 클래스입니다 ...

template<typename T> 
class LinkedList 
{ 
private: 
    size_t m_size; 
    shared_ptr<Node<T>> head; 
    shared_ptr<Node<T>> tail; 
public: 
    LinkedList() : m_size(0), head(nullptr) {}; 
    void push_front(T value) 
    { 
     shared_ptr<Node<T>> temp = head; 
     head = make_shared<Node<T>>(Node<T>(value)); 

     head->next = temp; 
     m_size++; 

     if (m_size == 1) 
      tail = head; 
    } 
    void pop_front() 
    { 
     if (m_size != 0) 
     { 
      // Here I am having doubt------------------------!!! 
      //shared_ptr<Node<T>> temp = head; 
      head = head->next; 
      m_size--; 
      if (m_size == 0) 
       tail = nullptr; 
     } 
    } 
    bool empty() 
    { 
     return (m_size == 0) ? true : false; 
    } 
    T front() 
    { 
     if (m_size != 0) 
      return head->value; 
    } 
}; 

내 질문은, 내가 제대로 shared_ptr에 대한 사용하고 있습니다 노드 할당? 그렇지 않다면 shared_ptr을 어떻게 할당하고 pop_front 방법으로 노드를 삭제해야합니까?

+0

[This (http://codereview.stackexchange.com/questions/33136/singly-linked-list-with-smart-pointers) – P0W

답변

4

나는 이것이 code review에 속한다고 생각합니다.

가장 중요하게 : shared_ptr을 왜 사용하고 있습니까? shared_ptr은 개체의 소유권이 불분명 함을 의미합니다. 연결된 목록의 경우는 그렇지 않습니다. 모든 노드가 다음 노드를 소유합니다. 보다 쉽고 효율적으로 unique_ptr을 사용하여 표현할 수 있습니다.

이 올바르게 작동하는 것처럼 보입니다. 빈 목록에 pop_front을 사용할 때 아무 것도하지 않고 예외 나 어설 션을 던질 것을 고려할 수 있습니다.

front이 더 문제가됩니다. 목록이 비어 있으면 가비지 개체를 얻을 가능성이 큽니다.

tail의 의미는 무엇입니까? 그것은 아무것도를 위해 사용되지 않는 것처럼 보이고 당신이 뒤에 갈 수 없기 때문에 꼬리를 얻는 것에 대한 진정한 의미는 없습니다.

make_shared<Node<T>>(Node<T>(value))make_shared<Node<T>>(value)이어야합니다. make_shared<Node<T>>(value)value을 생성자의 매개 변수로 사용하여 Node을 만듭니다. make_shared<Node<T>>(Node<T>(value))value을 매개 변수로 사용하여 Node을 만들고 매개 변수로 Node 임시와 함께 Node을 새로 만든 다음 첫 번째 Node을 소멸시킵니다.

복사 및 이동 생성자와 할당 및 이동 할당 연산자가 없습니다.

목록 구현에 만족 한 후 std::forward_list을 대신 사용해보십시오.

관련 문제