Testato su Mac OS X utilizzando XCode 4.6.Perché la rimozione dell'elemento _primo_ di un elenco invalida `.rend()`?
codice Questo esempio mostra rimozione dell'ultimo elemento di un std::list
lavori come mi aspettavo: un riferimento iteratore list::end()
è ancora "1 dopo la fine" ed è ancora valido, anche attraverso la rimozione dell'ultimo elemento.
Ma il secondo esempio contrasta la mia intuizione. Rimozione del prima elemento della lista modifiche list::rend()
, che ho pensato fosse "1 dopo l'inizio".
La mia aspettativa era sbagliata? Perché era sbagliato? Perché il tuo riferimento a "1 alla fine" attraverso la cancellazione dell'ultimo elemento rimane valido (non dovrebbe?), Ma un riferimento a "1 davanti all'inizio (.rend()
) non è più valido dopo la rimozione dell'elemento frontale?
void printList(list<int>& os)
{
for(int& i : os)
printf("%d ", i) ;
puts("");
}
void testList()
{
list<int> os ;
os.push_back(1) ;
os.push_back(2) ;
os.push_back(3) ;
os.push_back(4) ;
os.push_back(5) ;
// Forward iterators: reference to .end() not invalidated when remove last elt.
list<int>::iterator fwdEnd = os.end() ;
printList(os) ;
os.erase(--os.end()) ; // remove the 5 (last elt)
printList(os) ;
if(fwdEnd == os.end()) puts("YES, fwdEnd==os.end() still, iterators not invalidated") ; // I get __this__ result
else puts("NO: fwdEnd INVALIDATED") ;
list<int>::reverse_iterator revEnd = os.rend() ;
// remove the front element
printList(os) ;
os.erase(os.begin()) ; // removes the 1
printList(os) ;
if(revEnd == os.rend()) puts("YES revEnd is still valid") ;
else puts("NO: revEnd NOT valid") ; // I get __this__ result
}
Nel modo in cui lo capisco, un iteratore inverso non punta a ciò che sembra indicare. Un iteratore inverso "uno dopo l'inizio" avvolge un normale interatore che si riferisce all'inizio. Quando l'iteratore incapsulato viene invalidato, lo stesso è l'iteratore inverso. Ma non ho una citazione dallo standard per sostenere questo. – hvd
Credo che l'altra domanda sarebbe: * "è' rbegin' invalidato in modo simile nel primo esempio? "* – user7116