Пара вещей в шаблоне двусвязного списка - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть код двусвязного списка, и есть несколько строк этого кода, идея которых не ясна. Я прошу экспертов прокомментировать строки с комментариями в следующем. Это давно, когда я в последний раз использовал 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 ]

1 голос
/ 27 февраля 2012

Первая - это функция для определения, является ли список пустым. В двусвязном списке, если у вас есть хотя бы один элемент, указатели head и tail (которые указывают соответственно на начало и конец списка) должны указывать на действительный элемент. Следовательно, вы можете проверить, является ли список пустым, проверив, не указывают ли оба этих указателя на допустимый элемент (т. Е. null). Это то, что делает выражение !head || !tail - проверяет, является ли какой-либо указатель null, и если так, то список пуст.

operator bool() - это оператор преобразования. По сути, это означает, что всякий раз, когда список приводится к bool, эта функция вызывается, а результат используется в качестве значения bool. Функция возвращает информацию о том, является ли список не пустым, поэтому выражение типа bool result = myList; сделает result значением true, если список не пуст.

1 голос
/ 27 февраля 2012

operator bool() const является оператором преобразования. Если экземпляр double_linked используется в контексте, где требуется bool, эта функция будет вызвана для выполнения преобразования. (И будет иметь значение true, если список не пустой в вашем случае.)

Другая функция представляет собой обычную старую функцию, которая будет возвращать true, если head или tail равно нулю.

Подробнее об операторах преобразования см. Как работают операторы преобразования в C ++?

0 голосов
/ 27 февраля 2012

Это предикат, сообщающий нам, является ли он пустым или нет, он проверяет, равны ли указатели 0 (ноль).

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

Это позволяет пользователю рассматривать экземпляр контейнера как логическое значение, которое имеет значение true, если оно не пустое.

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

Реализован связанный список - хороший пример программирования, но если вы хотите использовать связанный список в вашем реальном коде, тогда вам действительно следует использовать std :: list (in).

...