XCode 4.6を使用してMac OS Xでテスト済みです。リストの_first_要素を削除すると `.rend()`が無効になるのはなぜですか?
この例のコードは、私が予想通りstd::list
作品の最後の要素を削除する例を示しますlist::end()
へのイテレータの参照は、まだ「終わり過去1」であると、まださえ最後の要素の除去による有効です。
しかし、2番目の例は私の直感とは対照的です。 最初ののリストを削除するlist::rend()
私は「最初の1」と考えていました。
私の期待は間違っていましたか?なぜ間違っていたのですか?最後の要素の削除による「1を過ぎて」という参照は有効なままですが(?ではありません)、最初の要素の先頭にある「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
}
私がそれを理解する方法は、逆の反復子は、それが一見指摘しているものを指摘しません。 「最初のものを1つ」とすると、逆イテレータは、先頭を参照する通常のインターレーターをラップします。ラップされたイテレータが無効になると、逆イテレータも無効になります。しかし、私はこれを裏付ける基準からの引用を持っていません。 – hvd
私は他の質問があると思います:* "最初の例で' 'rbegin''が同様に無効になっていますか?* * – user7116