C++ - 중복제거

2020. 6. 23. 17:11·Language/C++

벡터에서 중복 원소제거가 필요할 때가 있습니다. 그럴때 sort,unique,erase 의 기능을 적절히 활용하여 중복원소를 제거 할 수 있습니다.

먼저 백터하나를 만든뒤 데이터를 막넣습니다. (단 algorithm을 include 해주어야합니다 sort와 unique 사용을위해)

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
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);
	
	printf("막넣은 백터s\n");
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
}
막넣은 백터s
1       2       1       3       2       1       2

그리고 바로 unique 를 해봅니다.

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
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);
	
	printf("바로 unique(s.begin(),s.end());\n");
	unique(s.begin(),s.end());	
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
}
바로 unique(s.begin(),s.end());
1       2       1       3       2       1       2

바로 unique를 하게되면 아무런 변화가 없습니다. 이유는 unique는 연속된 중복 원소를 vector의 제일 뒷부분으로 쓰레기값으로 보내버립니다. 이를 확인하기위해 sort를 이용하여 vector를 정렬한뒤 unique를 해보겠습니다.

	printf("정렬 sort(s.begin(), s.end());\n");
	sort(s.begin(), s.end());
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
정렬 sort(s.begin(), s.end());
1       1       1       2       2       2       3
	printf("정렬후 unique(s.begin(),s.end());\n");
	unique(s.begin(),s.end());	
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
정렬후 unique(s.begin(),s.end());
1       2       3       2       2       2       3

C++ unique reference

  int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
  std::vector<int> myvector (myints,myints 9);

  // using default comparison:
  std::vector<int>::iterator it;
  it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?

다음은 erase 로 뒤에붙은 쓰레기값을 제거해주면 백터의 중복원소를 제거하는데 성공합니다.

unique가 끝났으면 반환되는값은 vector의 쓰레기값의 첫번째 위치가 되는데요, 이때문에 바로 unique후 erase가 가능합니다.

	printf("백터.erase(unique(s.begin(),s.end()),s.end())\n");
	s.erase(unique(s.begin(),s.end()),s.end());
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
백터.erase(unique(s.begin(),s.end()),s.end())
1       2       3

이렇게 vector의 중복원소를 제거하는 방법에대해 알아보았습니다.

int형이아닌 문자도 중복제거가 가능합니다.

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

vector<string> s;

int main()
{
	s.push_back("a");
	s.push_back("b");
	s.push_back("a");
	s.push_back("c");
	s.push_back("b");
	s.push_back("a");
	s.push_back("b");
	
	printf("막넣은 백터s\n");
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
	
	printf("정렬 sort(s.begin(), s.end());\n");
	sort(s.begin(), s.end());
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");

	printf("백터.erase(unique(s.begin(),s.end()),s.end())\n");
	s.erase(unique(s.begin(),s.end()),s.end());
	for(int i=0;i<s.size();i  )
		cout<<s[i]<<"\t";
	printf("\n\n");
}
막넣은 백터s
a       b       a       c       b       a       b
정렬 sort(s.begin(), s.end());
a       a       a       b       b       b       c
백터.erase(unique(s.begin(),s.end()),s.end())
a       b       c

출처: dpdpwl.tistory.com/39

 

 

저작자표시 (새창열림)

'Language > C++' 카테고리의 다른 글

C++ - Stack, Queue  (1) 2020.06.23
C++ - Quick Sort (feat Algorithm qsort())  (0) 2020.06.23
C++ - 조합 및 순열  (0) 2020.06.23
C++ - String 클래스, 문자열 총정리  (0) 2020.06.19
C++ - 1차원 배열에서의 시계방향, 반시계 방향 (feat: rotate)  (0) 2020.05.01
'Language/C++' 카테고리의 다른 글
  • C++ - Stack, Queue
  • C++ - Quick Sort (feat Algorithm qsort())
  • C++ - 조합 및 순열
  • C++ - String 클래스, 문자열 총정리
dev.wookii
dev.wookii
Effort Maketh Happiness
  • dev.wookii
    습관처럼
    dev.wookii
  • 전체
    오늘
    어제
    • 분류 전체보기 (295)
      • Language (35)
        • python (13)
        • C++ (22)
      • Kaggle (4)
      • Algorithms (112)
        • BOJ (58)
        • programmers (43)
        • SWExpertAcademy (2)
      • Certification (38)
        • Adsp (0)
        • Sqld (28)
        • 정처기 (9)
        • 빅데이터 분석기사 (0)
      • Data Analysis & ML (6)
      • 금융 & 디지털 (65)
      • CS (32)
        • DB (2)
        • SE (3)
        • Web&JSP (1)
        • Network (11)
        • OS (2)
        • Linux&Unix (6)
        • Server (1)
        • UX,UI (1)
        • 보안 (5)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Ebay korea #coding test
    시뮬레이션
    2020 KAKAO
    funny algorithms
    programmers
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev.wookii
C++ - 중복제거
상단으로

티스토리툴바