Протестировано в Mac OS X с помощью XCode 4.6.
В этом примере кода показано удаление последнего элемента std::list
, как я ожидал: ссылка итератора на list::end()
по-прежнему "1 за концом" и по-прежнему действительна, даже путем удаления последней элемент.
Но второй пример отражает мою интуицию. Удаление первого элемента списка изменяет list::rend()
, который, как я думал, был "1 за начало".
Было ли мое ожидание неправильным? Почему это было неправильно? Почему ваша ссылка на "1 за конец" путем удаления последнего элемента остается действительной (если это не так?), Но ссылка на "1 перед началом" (.rend()
) становится недействительной после удаления переднего элемента
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
}