XCode 4.6을 사용하여 Mac OS X에서 테스트되었습니다. 내가 예상대로목록의 _first_ 요소를 제거하면 왜 .rend()가 무효화됩니까?
이 예제 코드는 std::list
작품의 마지막 요소를 제거 보여줍니다 list::end()
에 반복자 참조가 여전히 "결국 지난 1"여전히 유효, 심지어 마지막 요소의 제거를 통해 .
그러나 두 번째 예는 내 직관에 맞지 않습니다. 목록의 첫 번째 요소를 제거하면 이 변경되고 list::rend()
인데 "처음부터 1 번"이라고 생각합니다.
내 기대가 잘못 되었습니까? 왜 잘못 된거야? 마지막 요소를 삭제하여 "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
}
내가 이해하는 방식으로, 역 반복자는 겉보기로 가리키고있는 것을 가리 키지 않습니다. "처음부터 지나간 것"역방향 반복자는 시작을 나타내는 일반적인 중재자를 래핑합니다. wrapped iterator가 무효화 될 때 reverse iterator도 마찬가지이다. 그러나 나는 이것을 뒷받침 할 기준에서 인용문을 가지고 있지 않다. – hvd
다른 질문이 될 것 같아요 : * "첫 번째 예제에서''rbegin''이 비슷하게 무효화 되었습니까?"* – user7116