🌍 C++ Study/C++ 기초
C++ std::unique 중복 요소 제거
맨텀
2024. 11. 26. 13:44
C++에서 중복 요소 제거하는 방법은 크게 두 가지가 있다.
1. set 자료구조를 활용
set에 모든 요소를 넣은 후,
for문을 돌리면서 하나씩 vector에 넣는 방법.
#include <set>
#include <vector>
vector<int> main() {
vector<int> vec = {4, 1, 2, 2, 3, 1, 4, 3};
// std::set을 사용하여 중복 제거
set<int> mySet(vec.begin(), vec.end());
// 중복 제거된 결과를 벡터에 저장
vector<int> mySet(mySet.begin(), mySet.end());
return result;
}
2. std::unique를 활용
<algorithm> 헤더에 있는 STL을 활용하는 방법이다.
std::unique는 주의해야 하는 중요한 특징이 두 가지 있다.
1. 연속된 중복 요소만 처리한다.
- { 1, 3, 1, 3 } 의 경우 연속되지 않기 때문에 별다른 처리가 없다.
- { 1, 1, 3, 3 } 의 경우 중복요소들에 대해 처리한다.
따라서 모든 중복요소를 처리하고 싶다면 sort를 실행한 다음에 std::unique를 사용하자.
2. 중복된 요소를 삭제하는게 아니라, 정렬만 해준다는 특징이 있다.
- { 1, 1, 3, 3 } 의 경우 { 1, 3, 3, 3 } 이 반환된다.
따라서 처리한 후에는 뒤쪽 값을 삭제하도록 하자
template< class ForwardIt >
ForwardIt unique( ForwardIt first, ForwardIt last );
vector에 대해 사용하면 중복을 제거한 요소들을 앞쪽에 배치하고,
반환값으로는 새로운 끝 위치 (=쓰레기 값의 첫 위치) 를 반환한다.
중복 요소를 제거한 다음에는 vector의 erase 멤버함수를 사용해서 지우도록 하자
#include <vector>
#include <algorithm>
vector<int> main() {
std::vector<int> vec = {1, 2, 2, 3, 4, 4, 4, 5};
// unique는 중복을 제거한 뒤의 새로운 끝 위치를 반환
auto new_end = std::unique(vec.begin(), vec.end());
// 컨테이너를 크기 조정
vec.erase(new_end, vec.end());
return vec; // 결과 반환
}