Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- N과M
- 분할정복
- int
- 문자열
- 최소공배수
- 에라토스테네스의 체
- 그래프
- vector
- 알고리즘
- C++
- Set
- priority_queue
- 유클리드호제법
- 우선순위큐
- DFS
- DP
- 깊이우선탐색
- 배열
- BFS
- 오블완
- stoi
- 백트래킹
- 정렬
- map
- 다이나믹프로그래밍
- 티스토리챌린지
- 프로그래머스
- Sort
- 이분탐색
- 백준
Archives
- Today
- Total
안녕 세상아,
[c++/벡터] 벡터의 중복 제거 (unique, erase) 본문
벡터에서 간단하게 중복을 제거하는 방법이 있다.
sort의 erase와 unique를 사용하면 된다. 이를 사용하기 위해서는 헤더에 algorithm을 추가해주면 된다.
벡터 하나를 만든 후 중복 숫자를 벡터에 삽입한다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> s;
int main()
{
s.push_back(1);
s.push_back(2);
s.push_back(1);
s.push_back(3);
s.push_back(2);
s.push_back(1);
s.push_back(2);
for(int i=0;i<s.size();i++)
cout<<s[i]<<endl;
}
이후 unique를 사용하면 그대로 1 2 1 3 2 1 2 이렇게 나온다.
왜?
이유는 unique는 연속된 중복 원소를 vector의 제일 뒷부분으로 쓰레기값으로 보내버리기 때문이다.
이를 확인하기 위해 sort를 한 후 보면,
unique(s.begin(),s.end());
for(int i=0;i<s.size();i++)
cout<<s[i]<<endl;
1 2 3 2 2 2 3 -> 이렇게 나온다.
unique만 하면 중복 제거가 되지 않는다.
중복 제거까지 하려면 erase를 사용해야한다.
s.erase(unique(s.begin(),s.end()),s.end());
for(int i=0;i<s.size();i++)
cout<<s[i]<<endl;
코드를 실행하면 1 2 3 -> 이렇게 나온다.
int 에서만 적용되는 것은 아니고 char에서도 적용이 된다.
'c++ 개념' 카테고리의 다른 글
[c++/알고리즘] 투포인터 (0) | 2024.09.21 |
---|---|
[c++] 단락 평가 (1) | 2024.08.30 |
[c++] isdigit() (숫자 판별 함수) (1) | 2024.08.05 |
[c++ 개념] 문자열 -> int (stoi) (1) | 2024.07.29 |
[c++/알고리즘] 백트래킹 정의, 예시 (0) | 2024.05.17 |