반응형

얼마 전 코딩 테스트에서 정렬 문제를 시간이 부족해 아쉽게 못 푼 가슴아픈 기억때문에 정렬 문제 위주로 요즘 풀고 있다. 금방 풀었던 어떤 문제의 코드를 개선할 방법을 고민하다가 unique의 레퍼런스를 제대로 읽지 않고 대충 써서 조금 헤맸기에 레퍼런스를 보고 간략히 정리해본다.

*std::list를 사용한다면 멤버 함수 unique를 사용하면 된다.

헤더

#include <algorithm>

기능

범위 내 중복된 원소 제거.

중복된 원소 중 첫 번째를 제외한 나머지 원소를 제거함.

반환값

지워지지 않은 마지막 원소의 iterator(반복자).

주의점

unique를 써서 vector의 중복된 원소를 제거해도 vector의 크기(size)는 줄어들지 않음. resize를 이용해서 줄여줘야 한다.

it = std::unique (myvector.begin(), myvector.end());
myvector.resize( std::distance(myvector.begin(),it) );
//resize를 해줘야 vector에 남아있던 명시되지 않은 상태의 원소가 모두 사라진다.
//아니면 std::unique_copy로 다른 곳에 복사하는 것도 깔끔할 것 같다.

unique를 사용해 제거한 중복된 원소는 unspecified state, 즉 명시되지 않은 상태로 남는다. 예컨대 string이 들어있는 vector를 순회하면서 empty()로 상태를 검사하는 경우 생각대로 동작할 수도, 동작하지 않을 수도 있다.

내 경우 중복된 문자열을 unique를 이용하여 제거한 후 이 문자열이 제거되었는지를 string의 empty()를 이용해서 체크했는데, MSVC 환경에서는 생각대로 동작했으나 다른 환경에서는 다르게 동작하는 것으로 보인다.

참조

http://www.cplusplus.com/reference/algorithm/unique/

반응형

+ Recent posts