hopesong   2년 전

안녕하세요. 1764번 듣보잡문제를 다른방법으로 풀어보려고 unique를 사용했는데 틀렸다고 나오네요. 봐도 이유를 모르겠습니다. 혹시라도 아시는분은 답변 남겨주시면 감사하겠습니다. 

f52985   2년 전

unique 함수는, duplicated elements를 뒤로 보내는 역할은 수행하지 않습니다.

unique된 후 뒤에 있는 원소들은 unspecified value를 가집니다.

"Iterators pointing to an element between the new logical end and the physical end of the range are still dereferenceable, but the elements themselves have unspecified values."

(https://en.cppreference.com/w/...)

hopesong   2년 전

f52985님 답변해주셔서 감사합니다. 첨부해주신 링크를 읽어 보고 다른 글들을 읽어본 이후 제가 이해한 바로는 unique 함수는 만약 연속적으로 같은 값이 있을 때 그 값을 옆에 있는 다른 값으로 바꾸고 바뀐 값은 맨 뒤로 unspecified value를 가진다고 이해했습니다. 여기서 unspecified value는 역참조할 수 있어서 만약 이 값들을 *itr처럼 출력을 해보면 가능한데 unspecified 이기 때문에 컴파일되는 소프트웨어에 따라서 값이 달라질 수 있어서 에러가 뜨는 건가요? 

f52985   2년 전

"바뀐 값은 맨 뒤로 unspecified value를 가진다고" 라는 말이 무슨 뜻인지는 이해가 되지 않지만,

전반적으로 맞는 말입니다.

unspecified value라는 말은 말 그래도 그 자리에 어떤 값이 오더라도 그것은 올바른 unique함수의 동작이다 라는 뜻입니다.

중복된 원소를 맨 뒤로 보내주더라도 올바른 unique이고,

원래 그 위치에 있던 값들을 그대로 두더라도 올바른 unique이고,

심지어는 뒤의 모든 값을 42로 바꾸어 버려도 올바른 unique입니다. (근데 이런식으로 작성된 라이브러리는 존재하진 않겠죠)

따라서 라이브러리가 실제로 어떻게 구현되어있는지와 컴파일러가 어떻게 동작하는지 등에 따라 뒤에 원소는 어떤 값이라도 가질 수 있으며,

다만 그 값에 대한 어떠한 보장도 할 수 없게 되는 것입니다.

hopesong   2년 전

아 unspecified value 라는 말의 의미가 이해가 잘 안됐었는데 이제야 이해가 가네요. 설명 감사합니다.  

댓글을 작성하려면 로그인해야 합니다.