블로그 옮겼습니다

STL 에서 vector 에 중복 원소 없애기 본문

Algorithm/Memo &Tips

STL 에서 vector 에 중복 원소 없애기

sgc109 2017. 4. 30. 21:56

전까지는 unordered_map<int> 를 선언하고 이 안에 없으면 새로 추가하고 있으면 지나가는 식으로 했는데 코드 줄도 길어지고

뭔가 지저분해졌지만 어쩔수 없이 썼었는데 이럴 필요가 없었다.. 보다 깔끔한 방법 두가지가 있다.


첫번째는 unique 라는 함수를 사용하는 것이다.

정렬되어있는 벡터의 시작과 끝 iterator 를 인자로 주면 모든 수들을 한번씩만 써서 정렬한 sequence 를 맨앞에 오도록

순서를 재배치 하고 그 끝 iterator 를 반환 한다고 한다. 그래서 이렇게한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    vector<int> v({1,1,1,1,2,2,2,3,3,4,4,5,6,7,7,7,7,8,8,9,9,9});
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for(int i = 0 ; i < v.size(); i++printf("%d ",v[i]);
 
    return 0;
}
 
cs

이미 벡터에 원소가 들어가 있다면 이 방법이 가장 편해 보인다.


두번째는 set과 assign 을 사용하는 것이다.

벡터의 assign 은 인자로 시작 iterator 와 끝 iterator 를 받아서 이 사이에 있는 값들로 벡터를 만들어 주는 것 같다.

이미 알려져 있듯 set은 중복된 원소를 여러개 갖지않는다 (중복으로 여러개 가질수있는건 multiset)

우리학교 교수님께 중복된 원소를 못갖는 점에서 수학에서의 집합(set)과 비슷한 개념이라고 들었다.

이렇게한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    set<int> st({1,1,1,1,2,2,2,3,3,4,4,5,6,7,7,7,7,8,8,9,9,9});
    vector<int> v;
    v.assign(st.begin(), st.end());
    for(int i = 0 ; i < v.size(); i++printf("%d ",v[i]);
 
    return 0;
}
 
cs


Comments