연관 컨테이너의 end () 요소가 마지막 요소와 동일한 값을 인쇄하는 이유는 무엇입니까? [복제]
아래 코드에서 반복기가 가리키는 값은 마지막 요소와 두 번째 마지막 요소 모두에 대해 동일합니다.
#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이어야합니다. 왜 그렇습니까?
답변
정의되지 않은 동작을 호출했습니다. std :: set :: end
집합의 마지막 요소 다음의 요소에 대한 반복기를 반환합니다. 이 요소는 자리 표시 자 역할을합니다. 액세스를 시도하면 정의되지 않은 동작이 발생합니다.
정의되지 않은 동작 은 전체 프로그램을 무의미하게 만듭니다.
내 이해에서 end 요소가 가리키는 값은 null이어야합니다. 왜 그렇습니까?
당신의 이해가 잘못된 이유는 말할 수 없습니다.). 은밀함은 제쳐두고 : 아니요. "최종 요소"는 없습니다. end
마지막 요소 지난 1에 반복자를 가리 킵니다. 역 참조 할 수 없습니다. 그렇게하면 정의되지 않은 동작을 호출합니다.
컨테이너의 마지막 요소는 일반적으로 "뒤로"라고하며 많은 컨테이너 back()
에 액세스 하는 방법이 있습니다.
내 이해에서 end 요소가 가리키는 값은 null이어야합니다. 왜 그렇습니까?
그렇지 않습니다.
과거의 일회성 이터레이터는 아무것도 "가리 키지"않습니다. 참조 할 수 없습니다.
C- 문자열은 처음에는이 규칙에 대한 예외로 보일 수 있지만 그렇지 않습니다. NULL
확인할 수 있는 문자 로 논리적으로 종료 되지만 NULL
여전히 char
객체 배열의 일부이며 a를 역 참조 할 수 없습니다. char*
그것은 그 배열에 대한 한 번의 과거 반복기입니다. C- 문자열의 널 종료자를 "이 페이지는 의도적으로 비워 둔"것으로 생각하십시오. 페이지는 더 이상 이야기를 제공하지 않지만 여전히 페이지입니다.
연관 컨테이너의 end () 요소가 마지막 요소와 동일한 값을 인쇄하는 이유는 무엇입니까?
그것은 정의되지 않은 동작을 가진 프로그램의 가능한 결과입니다.