E 'quasi sicuro se si è consapevoli di alcuni casi eccezionali:
A.end()
ti dà un iteratore che indica la posizione appena al di là della fine del std::vector
. Si dovrebbe non tentare di dereferenziarlo.
Se il vettore ha zero elementi, allora A.end() - 1
è non ben definito. In tutti gli altri casi lo è e puoi effettivamente eseguire l'aritmetica del puntatore finché sei nei limiti del contenitore. Si noti che lo standard garantisce che i dati std::vector
sono contigui e impacchettati esattamente nello stesso modo di un array C++ del tipo contiene. L'unica eccezione è std::vector<bool>
che si comporta in modo diverso a causa di una specializzazione di imballaggio stretto specificata dagli standard. (Nota bene che sizeof(bool)
è non garantito per avere un valore particolare dallo standard).
Se fossi in te, utilizzerei A.rbegin()
per accedere all'elemento più a destra e controllare il valore restituito prima di procedere e attenermi alla formulazione dell'iteratore. È fin troppo facile dimenticare la specializzazione std::vector<bool>
.
Questo va bene e puoi anche usare 'A.rbegin()'. – perreal
È * iteratore * aritmetico. e dovrebbe essere OK per l'iteratore bidirezionale (come 'std :: vector :: iterator'). – Jarod42