Domanda

Ho un codice di elenco doppiamente collegato e ci sono poche righe di quel codice che l'idea non è chiara. Chiedo commenti degli esperti sulle righe che hanno commentato nel seguente. La più tempo ho usato C ++. Ci sono solo due righe che ho indicato non sono comprensibili per me.

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;
        }
    }
};
È stato utile?

Soluzione

operator bool() const è un operatore di conversione. Se un'istanza di double_linked viene utilizzato in un contesto in cui è richiesto un bool, questa funzione verrà chiamata a fare la conversione. (E valuterà a true Se l'elenco non è vuoto nel tuo caso.)

L'altra funzione è una semplice vecchia funzione, che tornerà true se neanche head o tail è zero.

Per ulteriori informazioni sugli operatori di conversione, vedi: Come funzionano gli operatori di conversione in C ++?

Altri suggerimenti

La prima è una funzione per determinare se l'elenco è vuoto. In un elenco doppiamente collegato, se hai almeno un elemento allora il head e tail Pointatori (che indicano rispettivamente l'inizio e la fine dell'elenco) dovere indicare un elemento valido. Pertanto, è possibile verificare se l'elenco è vuoto testando se entrambi quei puntatori non indicano un elemento valido (cioè lo sono null). Questo è ciò che l'espressione !head || !tail fa - controlla se uno dei due puntatore lo è null, e, in tal caso, l'elenco è vuoto.

Il operator bool() Il fatto è un operatore di conversione. In pratica significa, ogni volta che l'elenco viene lanciato bool, quella funzione è chiamata e il risultato usato come valore del bool. La funzione restituisce se l'elenco non è vuoto, quindi un'espressione simile bool result = myList; farà result essere true Se l'elenco non è vuoto.

Questo è un predicato che ci dice se è vuoto o no, sta verificando se i puntatori sono 0 (null).

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

Ciò consente all'utente di trattare l'istanziazione del contenitore come un booleano, il che è vero se non è vuoto.

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

Implementato un elenco collegato è un buon esercizio di programmazione, ma se si desidera utilizzare un elenco collegato nel tuo codice effettivo, dovresti davvero usare la lista STD :: in).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top