XCode4.6を使用してMacOSXでテストされています。
このサンプルコードは、std::list
期待どおりに作品の最後の要素を削除することを示しています。へのイテレータ参照list::end()
は「最後から1つ」であり、最後の要素を削除しても有効です。
しかし、2番目の例は私の直感に反しています。リストの最初の要素を削除すると、「最初から1つ過ぎた」と思った変更が変更されます。list::rend()
私の期待は間違っていましたか?なぜそれが間違っていたのですか?最後の要素を削除して「最後から1つ」への参照が有効なままであるのに(そうではないのですか?)、.rend()
前の要素を削除すると「先頭()の前の1」への参照が無効になるのはなぜですか?
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
}