双链接列表模板中的几件事

Couple of Things In Doubly Linked List Template

本文关键字:几件 列表 链接      更新时间:2023-10-16

我有一个双链表的代码,其中有几行代码的想法不清楚。我请求专家对下面的行发表评论。我上次使用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;
        }
    }
};

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

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

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

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

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

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

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

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

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

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