연관 컨테이너의 end () 요소가 마지막 요소와 동일한 값을 인쇄하는 이유는 무엇입니까? [복제]

Dec 10 2020

아래 코드에서 반복기가 가리키는 값은 마지막 요소와 두 번째 마지막 요소 모두에 대해 동일합니다.

#include <iostream>
#include <set>
using namespace std;


int main() 
{
    set<int> s1 = {4,3,2,5,1};
    set<int>::iterator i;
    
    i = s1.end();
    cout << *i << endl; // 5
    
    i--;
    cout << *i << endl; // 5
    
    
    cout << *s1.end() << endl;  // 5
    cout << *(--s1.end()) << endl;  // 5
    
    return 0;
}

내 이해에서 end 요소가 가리키는 값은 null이어야합니다. 왜 그렇습니까?

답변

6 TonyTannous Dec 10 2020 at 20:53

정의되지 않은 동작을 호출했습니다. std :: set :: end

집합의 마지막 요소 다음의 요소에 대한 반복기를 반환합니다. 이 요소는 자리 표시 자 역할을합니다. 액세스를 시도하면 정의되지 않은 동작이 발생합니다.


정의되지 않은 동작 은 전체 프로그램을 무의미하게 만듭니다.

1 largest_prime_is_463035818 Dec 10 2020 at 20:55

내 이해에서 end 요소가 가리키는 값은 null이어야합니다. 왜 그렇습니까?

당신의 이해가 잘못된 이유는 말할 수 없습니다.). 은밀함은 제쳐두고 : 아니요. "최종 요소"는 없습니다. end마지막 요소 지난 1에 반복자를 가리 킵니다. 역 참조 할 수 없습니다. 그렇게하면 정의되지 않은 동작을 호출합니다.

컨테이너의 마지막 요소는 일반적으로 "뒤로"라고하며 많은 컨테이너 back()에 액세스 하는 방법이 있습니다.

AsteroidsWithWings Dec 10 2020 at 21:01

내 이해에서 end 요소가 가리키는 값은 null이어야합니다. 왜 그렇습니까?

그렇지 않습니다.

과거의 일회성 이터레이터는 아무것도 "가리 키지"않습니다. 참조 할 수 없습니다.

C- 문자열은 처음에는이 규칙에 대한 예외로 보일 수 있지만 그렇지 않습니다. NULL확인할 수 있는 문자 로 논리적으로 종료 되지만 NULL여전히 char객체 배열의 일부이며 a를 역 참조 할 수 없습니다. char*그것은 그 배열에 대한 한 번의 과거 반복기입니다. C- 문자열의 널 종료자를 "이 페이지는 의도적으로 비워 둔"것으로 생각하십시오. 페이지는 더 이상 이야기를 제공하지 않지만 여전히 페이지입니다.

연관 컨테이너의 end () 요소가 마지막 요소와 동일한 값을 인쇄하는 이유는 무엇입니까?

그것은 정의되지 않은 동작을 가진 프로그램의 가능한 결과입니다.