[C++] STL Set 정리
집합(Set)
집합(Set)은 중복을 허용하지 않는 원소들의 컨테이너로 Template를 지원하는 STL이다.
set의 원소들은 자동으로 오름차순 정렬된다.
set은 이진 균형 트리 구조로 이루어져있다.
1. Set 선언
#include <set> // set 라이브러리 추가
set<int> s; // 기본적인 set 선언, set<데이터 타입> 변수명
int arr[6] = {1,2,3,4,5,-1};
set<int> s1(arr, arr+6); // set<int> s1(시작 주소, 끝 주소), 배열의 값들을 받아 올 수 있다.
for (int i : s1){cout << i << " ";} // -1, 1, 2, 3, 4, 5
cout << endl;
vector<int> v = {5,3,-1,6,9,12, -1};
set<int> s2(v.begin(), v.end()); // 벡터 역시 받아 올 수 있다. 전과 같이 주소값으로 받아올 수 있다.
for (int i : s2){cout << i << " ";} // -1 3 5 6 9 12 ,set의 중복 제거 특성상 -1이 하나만 들어간다.
cout << endl;
set<int> s3(s2); // 타 set을 복제할 수 있다.
for (int i : s3){cout << i << " ";} // -1 3 5 6 9 12
cout << endl;
s3.insert(99);
for (int i : s2){cout << i << " ";} // -1 3 5 6 9 12
cout << endl;
for (int i : s3){cout << i << " ";} // -1 3 5 6 9 12 99 ,s2를 복제한 s3는 주소 참조가 아닌 자체 메모리 복사이다.
cout << endl;
삽입 / 삭제
set에 원소를 삽입하거나 삭제하는 메소드는 아래와 같다.
s.insert(key) // set에 값 삽입
s.erase(Key) // set에 저장된 값 삭제
s.swap() // 다른 set과 요소 전체 교환
s.clear() // set의 요소 전체 삭제
s.emplace() // insert()와 기능상 동일
이때 insert와 emplace의 차이는 다른 conteiner 벡터에서 설명하였다.
iterator
set 역시 벡터(vector)처럼 iterator가 존재한다.
s.begin() // set의 첫 원소 주소값 반환
s.end() // set의 마지막 부분 뒤 공백구간 주소값 반환
s.rbegin() // set의 마지막 부분을 시작점으로 지정, 주소 반환
s.rend() // set의 첫 부분을 마지막 지점으로 지정, 주소 반환
s.cbegin() // begin()과 동일한 기능, const로 설정
s.cend() // end()와 동일한 기능, const로 설정
s.crbegin() // rbegin()과 동일, const로 설정
s.crend() // rend()와 동일, const로 설정
코드
set<int> s;
s.insert(16);
s.insert(27);
s.insert(10);
s.insert(30);
set<int>::iterator iter = s.emplace_hint(s.begin(), 101);
s.emplace_hint(iter, 1);
for (int i : s){cout << i << " ";}
cout << endl;
for (auto iter2 = s.begin(); iter2 != s.end(); iter2++){
cout << *iter2 << " ";
}
cout << endl;
for (auto iter2 = s.rbegin(); iter2 != s.rend(); iter2++){
cout << *iter2 << " ";
}
cout << endl;
set<int> s2(s);
s2.clear();
s2.emplace(3);
for(int i : s2){cout << i << " ";}
cout << endl;
s.swap(s2);
cout << "------" << endl;
for(int i : s){cout << i << " ";} cout << endl;
for(int i : s2){cout << i << " ";} cout << endl;
s2.erase(30);
for(int i : s2){cout << i << " ";} cout << endl;
set<int>::iterator iter3 = s2.find(27); // s.find(key) 찾는 Key값이 있으면, 해당 위치의 Iter 반환, 없으면 s.end()
set<int>::iterator iter4 = s2.find(999);
cout << *iter3 << endl;
cout << *iter4 << endl;
cout << *s2.end() << endl; // iter4와 s2.end() 동일
기본적으로 전체적인 메소드는 C++의 conteiner 라이브러리이기에 벡터와 비슷하다.
벡터와 비교해보며, set을 사용하면 이해하기 쉬울 것