[C , C++]
C++ vector 중복 원소 삭제
말하는펭귄
2021. 1. 21. 14:09
728x90
반응형
1. unique 함수
unique 함수는 vector에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수 (algorithm 헤더에 정의)
자신이 바꾼 vector의 end()를 반환 (중복 원소들(쓰레기 값들)의 첫 번째 위치 리턴)
unique 함수는 앞과 뒤의 원소들을 비교하기 때문에 반드시 정렬을 한 뒤 실행
unique 함수는 erase 함수에 중첩하여 사용 가능
사용 순서
1. sort
벡터를 정렬한다.
2. unique
중복 원소는 벡터의 제일 뒷부분(쓰레기 값)으로 보낸다.
3. erase
중복된 원소들이 있는 뒷 부분을 삭제한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(2);
v.push_back(1);
v.push_back(5);
cout << "Original Vector: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << "\n\n";
sort(v.begin(), v.end());
cout << "Sorted Vector: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << "\n\n";
v.erase(unique(v.begin(), v.end()), v.end());
cout << "unique + erase: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << "\n\n";
}
2. set + assign 함수
set은 중복 원소를 허용하지 않는 컨테이너이다.
원소를 set에 삽입한 후 set의 원소들을 vector에 assign한다.
vector<vector<T>> 등 복잡한 벡터의 중복 원소 제거에 사용 가능
사용 순서
1. set에 원소 삽입
2. vector에 assign
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
set<int> s = { 1,1,2,3,2,4,5,1 };
cout << "Set: ";
set<int>::iterator iter;
for (iter = s.begin(); iter != s.end(); iter++) {
cout << *iter << " ";
}
cout << "\n\n";
vector<int> v;
v.assign(s.begin(), s.end());
cout << "Vector: ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << "\n\n";
}
응용
벡터를 담은 벡터에서 중복되지 않는 벡터 개수 구하기 (백준 13915)
vector<vector<int>> v;
set<vector<int>> s;
for (int i = 0; i < N; i++) {
s.insert(v[i]);
}
cout << s.size() << endl;
728x90
반응형