使用XCode 4.6在Mac OS X上進行測試。爲什麼刪除列表的_first_元素使`.rend()`無效?
此示例代碼示出了去除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
}
我的理解是,反向迭代器沒有指向它看似指向的東西。 「一開始就有一個」逆向迭代器包裝一個指向開始的正常interator。當包裝迭代器失效時,反向迭代器也是如此。但我沒有從標準中引用來支持它。 – hvd
我想另外一個問題是:*「是在第一個例子中類似無效的'rbegin'」* – user7116