2012-02-26 30 views
0

我有双重链接列表的代码,并且有几行代码中的想法不明确。我请求专家对以下评论的评论进行评论。自从我上次使用C++以来,就已经很长时间了。只有两条线我表示对我来说是不可理解的。双链表列表模板中的几件事情

template <typename T> 
class double_linked 
{ 
    struct node 
    { 
     T data; 
     node* prev; 
     node* next; 
     node(T t, node* p, node* n) : data(t), prev(p), next(n) {} 
    }; 
    node* head; 
    node* tail; 
public: 
    double_linked() : head(NULL), tail (NULL) {} 
    template<int N> 
    double_linked(T (&arr) [N]) : head(NULL), tail (NULL) 
    { 
     for(int i(0); i != N; ++i) 
      push_back(arr[i]); 
    } 

    bool empty() const { return (!head || !tail); } // this doing? 
    operator bool() const { return !empty(); } // this doing? i know operators need in C++ but dont know the use of it here 
    void push_back(T); 
    void push_front(T); 
    T pop_back(); 
    T pop_front(); 

    ~double_linked() 
    { 
     while(head) 
     { 
      node* temp(head); 
      head=head->next; 
      delete temp; 
     } 
    } 
}; 
+0

我知道它告诉列表是否为空,但我再次知道其实现数组 – 2012-02-26 21:40:41

回答

1

operator bool() const是一个转换运算符。如果在需要布尔的上下文中使用double_linked的实例,则会调用此函数来执行转换。 (而将计算为true如果列表中没有你的情况是空的。)

另一个功能是一个普通的旧功能,这将返回true如果任headtail为空。

欲了解更多有关转换操作符,请参阅:How do conversion operators work in C++?

+0

的细节如何? – 2012-02-26 21:43:21

+0

我不明白你的问题。一个'double_linked'数组不会有这些方法/操作符。 – Mat 2012-02-26 21:44:46

+0

operator bool()const,多一点或简单的解释请,谢谢 – 2012-02-26 21:46:18

1

首先是要确定列表为空的函数。在一个双向链表中,如果你至少有一个元素,那么headtail指针(分别指向列表的开始和结束)必须指向一个有效元素。因此,如果两个指针都不指向有效元素(即null),则可以通过测试来测试列表是否为空。这就是表达式!head || !tail所做的 - 检查指针是否为null,如果是,则列表为空。

operator bool()东西是一个转换操作符。它基本上意味着,无论何时将列表转换为bool,都会调用该函数,并将结果用作bool的值。该函数返回列表是否为空,因此如果列表不为空,则类似bool result = myList;的表达式将使resulttrue

0

这是一个谓词,告诉我们它是否为空,它检查指针是否为0(空)。

bool empty() const { return (!head || !tail); } // this doing? 

这允许用户把容器的实例作为一个布尔值,如果不是空的,则为true。

operator bool() const { return !empty(); } // this 

实现链表是一个很好的锻炼; Tibial编程,但如果你想在你的实际代码使用链表,那么你真的应该使用std ::列表()。

+0

请多需要一些简单的解释,谢谢 – 2012-02-26 21:45:34