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; // 결과 반환
}
'🌍 C++ Study > C++ 기초' 카테고리의 다른 글
C++ std::rotate 벡터 회전하기 (0) | 2025.01.11 |
---|---|
C++ string 공백으로 자르기 split stringstream (0) | 2024.11.25 |
C++ 문자열 소문자, 대문자로 바꾸기 tolower (0) | 2024.11.23 |
C++ 부분 문자열 찾기std::string::find (0) | 2024.11.23 |
C++ std::transform 각 원소에 연산하기, vector 2배하기 (0) | 2024.11.21 |