Se front()
restituisce un riferimento e il contenitore è vuoto cosa ottengo, un riferimento non definito? Significa che devo controllare lo empty()
prima di ogni front()
?Cosa ottengo da front() del contenitore std vuoto?
risposta
Si ottiene un comportamento non definito: è necessario verificare che il contenitore contenga qualcosa che utilizza empty() (che controlla se il contenitore è vuoto) prima di chiamare front().
Si ottiene un comportamento non definito.
Per ottenere il controllo dell'intervallo utilizzare a (0). Se fallisce, ottieni un'eccezione out_of_range
.
indefinito Comportamento
Hai sempre bisogno di essere sicuri che il contenitore non è vuota prima di chiamare anteriore() su questa istanza. Chiamare vuoto() come guardia sicura è buono.
Naturalmente, a seconda della progettazione del programma, avere sempre un contenitore non vuoto potrebbe essere una dichiarazione invariabile che consente di impedire e salvare la chiamata su empty() ogni volta che si chiama front(). (o almeno in qualche parte del tuo codice?)
Ma come detto sopra, se vuoi evitare un comportamento indefinito nel tuo programma, rendilo un invariante forte.
Sì, è possibile utilizzare 'at' come menzionato Graham invece di utilizzare front.
Ma, a (0) è disponibile solo per alcuni contenitori - vettori, deque e non per altri - elenco, coda, pila. In questi casi devi ricorrere alla sicurezza del controllo "vuoto".
È inoltre possibile utilizzare empty(). –
Vorrei che fossero stati più specifici quando hanno progettato e specificato STL. Penso che un gran numero di problemi di porting e bug di C++ siano causati da implementazioni specifiche di piattaforme di questi "comportamenti indefiniti" sfruttati da programmatori non-così-buoni. –
La decisione di creare qualcosa di UB di solito significa che c'era un sovraccarico nell'alternativa - in questo caso lanciare un'eccezione, che C++ cerca sempre di evitare. –