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;
        }
    }
};
4

3 回答 3

1

operator bool() const是一个转换运算符。如果在需要 bool 的上下文中使用 of 的实例,double_linked则将调用此函数进行转换。(并且将评估true列表是否在您的情况下为空。)

true另一个函数是一个普通的旧函数,如果其中一个headtail为空,它将返回。

有关转换运算符的更多信息,请参阅:转换运算符如何在 C++ 中工作?

于 2012-02-26T21:40:01.783 回答
1

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

operator bool()事情是一个转换运算符。这基本上意味着,每当列表转换为 时bool,都会调用该函数并将结果用作 的值bool。该函数返回列表是否不为空,因此如果列表不为空,则类似这样的bool result = myList;表达式。resulttrue

于 2012-02-26T21:41:48.807 回答
0

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

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

这允许用户将容器的实例化视为布尔值,如果它不为空,则为真。

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

实现链表是一个很好的编程练习,但如果你想在实际代码中使用链表,那么你应该真正使用 std::list (in )。

于 2012-02-26T21:43:00.823 回答