안녕하세요! 코딩하는 경제학도 쏘코입니다.
지난 게시물에서 Map에 대해 다룬 적이 있었죠?
이번 Set은 Map과 굉장히 유사한 친구입니다. 오히려 Map보다 더 단순화된 형태이죠.
(Set을 이해하면 Map을 이해하는 데 도움이 될 수 있습니다.
Map에 대해 먼저 포스팅을 올린 나는 특이케이스
혹시나 Set을 알아보려고 왔다가 Map이 궁금해지셨다면 아래 포스팅에서 추가로 확인하실 수 있습니다.
목차
0. Set의 기본 개념
Set은 Key라고 불리는 원소들의 집합으로 이루어진 컨테이너입니다.
그리고 이 Key값들은 중복될 수 없죠.
또한 Set은 Key값의 순서대로 정렬이 됩니다. 그리고 완전정렬입니다. 이 말은 원소의 삽입 순서에 영향을 받지 않는다는 이야기입니다. (파이썬의 set은 순서가 없습니다! 주의하세요!)
(만약 정렬이 되지 않는 set을 원한다면 C++11부터 지원하는 unordered_set을 사용하시면 됩니다.)
Set은 Map과 동일하게 이진균형트리구조를 이룹니다. 따라서 검색, 삽입, 삭제에는 평균 O(logN) 시간이 들게 됩니다. (균형이 붙었기 때문에 삽입이나 삭제 시 추가적인 시간이 소요될 수 있습니다)
※ Set의 특징 정리
- key값은 중복될 수 없습니다. (복수의 key값을 사용기 위해서는 multiset을 사용해야합니다)
- 자동으로 오름차순으로 정렬됩니다. (unordered_set의 경우 정렬이 되지 않습니다)
- 동적할당합니다. (필요에 따라 메모리를 사용합니다)
1. Set의 사용법
사용을 위해서는 당연히 #include <set>헤더 파일을 적어야 합니다.
map과 동일하게 using namespace std;를 통해 편하게 사용하실 수 있습니다.
include 후에는 set<key속성> 변수이름; 형태로 사용하실 수 있습니다.
key값에는 원하는 속성을 담으시면 됩니다.
set<int> set1;
set<char> set2;
set<string> set3;
만약 기본 오름차순 정렬을 원하지 않는다면 key 속성 뒤에 greater<key 속성>을 넣어주면 내림차순으로 정렬됩니다.
물론 원하는 기준을 따로 만들어서 사용하셔도 무방합니다.
크기가 작으면 앞에 오도록, 같으면 사전순으로 정렬되도록 만들었습니다.
set<int, greater<int>> set4;
bool lengthcomp(const string& left, const string& right){
if(left.size() != right.size())
return left.size() < right.size();
else
return left < right;
};
int main(){
set<string, lengthcomp> set5;
return 0;
}
추가로 cplusplus에서 확인할 수 있는 set의 기본 형식은 다음과 같습니다. 위의 Alloc는 allocator의 줄임말로, 동적할당을 도와주는 요소입니다. 입력하지 않으면 기본으로 사용되는 allocator는 알게 모르게 메모리 관리를 할 때 유용하게 사용되고 있습니다.
2. Set의 멤버함수
iter, start, end 세 개의 반복자를 선언하며, k와 l은 일반 원소입니다!
멤버 |
설명 |
begin() |
첫 번째 원소의 랜덤 접근 반복자를 반환 |
end() |
마지막 원소 다음의 반복자를 반환 |
empty() |
저장 하고 있는 요소가 없으면(비어있으면) True 반환 |
clear() |
저장하고 있는 모든 원소를 삭제 |
erase(iter), erase(start,end), erase(key) |
특정 위치의 원소나 지정 범위의 원소들을 삭제 후 다음 원소를 가리키는 반복자를 반환, 지정한 key와 같은 요소를 지우고 삭제된 개수 반환 (multiset이 아닌 set이라면 1 반환) |
find(k) |
key와 연관된 원소의 반복자 반환 (없으면 end()와 같은 반복자 반환) |
insert(k), insert(iter,k), insert (first, last) |
key 추가, iter 위치에 k라는 원소 추가, first부터 last까지 추가 |
upper_bound(k) |
지정한 key 요소를 가지고 있다면 해당 위치의 다음 위치의 반복자를 반환 |
lower_bound(k) |
지정한 key의 요소를 가지고 있다면 해당 위치의 반복자를 반환 |
rbegin() |
역방향으로 첫 번째 원소의 반복자를 반환 |
rend() |
역방향으로 마지막 원소 다음의 반복자를 반환 |
size() |
원소의 개수를 반환 |
map과의 차이점이 있다면 set에서는 operator[]를 사용할 수 없습니다.
이 말은 map에서 사용하던 방식인 map1[1] = 10;과 같은 방식으로 요소를 삽입하거나
cout << map1[1]; 과 같은 방식으로 요소를 출력할 수 없다는 이야기입니다.
set은 key만으로 구성되어 있기 때문에, 따로 출력을 위해서는 for문 안에 iterator를 불러와서 출력해야겠네요.
▼ 아래는 set을 출력하는 예제입니다.
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> set1;
set1.insert(1);
set1.insert(3);
set1.insert(2);
for (auto it = set1.begin(); it != set1.end(); ++it)
cout << *it << " ";
return 0;
}
3. 참고자료
www.cplusplus.com/reference/set/set/
en.cppreference.com/w/cpp/container/set
www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS6470125680
최근댓글