Un paio di cose in modello di elenco doppiamente collegato
-
13-11-2019 - |
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;
}
}
};
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).