夫妇在双重链接的名单模板中

时间:2012-02-26 21:36:35

标签: c++ templates doubly-linked-list

我有一个双重链接列表的代码,并且该代码的行数很少,这个想法并不清楚。我要求专家评论下面有评论的行。这是我上次使用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;
        }
    }
};

3 个答案:

答案 0 :(得分:1)

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

另一个函数是一个普通的旧函数,如果truehead为空,它将返回tail

有关转换运算符的详情,请参阅:How do conversion operators work in C++?

答案 1 :(得分:1)

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

operator bool()是转化运算符。它基本上意味着,无论何时将列表强制转换为bool,都会调用该函数,并将结果用作bool的值。该函数返回列表是否为空,因此如果列表不为空,则bool result = myList;这样的表达式会使resulttrue

答案 2 :(得分:0)

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

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

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

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

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