반응형

이 게시물은 다음 링크를 참조하여 학습했습니다.

 

[C++] set container 정리 및 사용법

안녕하세요. BlockDMask 입니다 ! 오늘은 연관 컨테이너 set, multiset, map, multimap 중 set에 대해 학습해보겠습니다. 순서는 set container -> set의 사용법 -> set의 생성자와 연산자 -> set의 멤버 함수 -..

blockdmask.tistory.com

 

C++ set 사용법과 설명...

set에 대해 설명하고자 합니다. 사용법도요. 아마 set을 사용하려고 검색하셔서 오시게 된 분이시라면, set의 특징을 잘 아시는 분일겁니다. 네, set의 특징은 다음과 같습니다. 1. 숫자든 문자든 중

hwan-shell.tistory.com

 

[C++] map vs hash_map(unordered_map)

개요 hash_map은 비표준 Container인데 반해(stdext namespace에 포함) unordered_map은 C++11에서 STL 표준 Container로 추가되었으며, (사실 TR1부터 추가되었지만 C++11에서 좀 더 최적화가 이루어졌다고 합..

gracefulprograming.tistory.com

 

1. set

1-1. set

set은 쉽게 생각하면 수학의 "집합"을 생각하면 된다.

원소들을 저장할 때 중복을 허용하지 않는다.

또한, 항상 순서가 정렬되서 저장되는 특징을 갖는다.

내부적으로는 이진트리의 일종인 Red-Black Tree로 설계되어있다.

즉, 중복을 허용하지 않고, 저장된 자료들 중 특정 자료를 찾아야 할 때 용이하다.

set은 아래처럼 사용하면 된다!

1
2
3
4
5
6
#include <set>
 
set<int> S;    // 기본( 큰 값 기준 정렬)
 
set<int, less<int> > S;        // 큰 값 기준 정렬
set<int, greater<int> > S;    // 작은 값 기준 정렬
cs

 

1-2. unordered_set

unorederd의 사전적인 의미는 "무질서한"이다.

set은 set인데 정렬되지 않는 set이다.

unorderd_set의 가장 큰 특징은 Hash함수를 사용한다는 점이다.

다른 언어에서의 Hashset을 C++에서는 unordered_set으로 사용한다!

객체를 생성해서 set에서 사용할 경우 해시함수를 구현해야 하지만, 기본적인 자료형에 대해서는 해시함수를 제공한다고 한다!

다른분이 unordered_set vs set 성능비교를 한 게시물을 봤는데, 

1. 일반적으로 데이터가 많은 경우 unordered_set이 set보다 성능면에서 유리하고

2. 문자열을 사용하는 경우 문자열이 길어질수록 unorderd_set이 set보다 성능이 떨어질 수 있고

3. 유사도가 높은 문자열이 많을 때 set의 성능이 떨어질 수 있다고 한다.

정렬된 데이터를 얻고자 하는 경우를 제외하고, 대량의 데이터일때는 unordered_set을 사용하는걸 추천한다고 한다!

unordered_set은 아래처럼 사용한다.

1
2
3
#include <set>
 
unordered_set<int> US;    
cs

 

 

2. 멤버함수

set의 멤버함수에 대해서는 아래 링크에서 자세히 확인할 수 있는데, 일단은 자주 사용할 멤버함수만 정리했따.

 

std::set - cppreference.com

template<     class Key,     class Compare = std::less ,     class Allocator = std::allocator > class set; (1) (2) (since C++17) std::set is an associative container that contains a sorted set of unique objects of type Key. Sorting is done using the

en.cppreference.com

함수 설명
iterator begin(); set이 시작 위치 주소 값 반환
iterator end(); set이 끝나는 위치 주소 + 1값 반환
int size(); set의 사이즈를 반환
bool empty(); set이 비어있는지 확인
pair<iterator, bool> insert(value); set에 value를 삽입.
반환값으로 pair의 iterator에는 저장 위치, bool 에는 저장 성공실패 여부를 반환한다.
void erase(iterator position); set의 position에 해당하는 값 삭제
void clear(); set의 모든 원소 제거
iterator find(value); set에 value가 있는지 확인.
반환값으로 iterator, 즉, value의 위치를 반환한다.
int count(value); set에 value가 있는지 확인.
반환값으로 int를 반환하는데, set은 중복을 허용하지 않으므로 0 또는 1 반환.
iterator lower_bound(value); set에 value가 처음 등장하는 위치 반환.
중복 허용X 이므로 원소의 위치!
iterator upper_bound(value); set에 value가 마지막 등장하는 위치 + 1 반환.
중복 허용X 이므로 원소의 위치 다음 위치!

 

3. set에서의 반복문

set에서 저장된 모든 데이터를 사용해야 할 때, 반복문을 사용하는데 아래처럼 사용하면 된다.

1
2
3
for(int num : S){
    cout << num << endl;
}
cs
반응형

'Legacy' 카테고리의 다른 글

[Java#1] 입출력  (0) 2022.04.29
[C++#5-5] map  (2) 2022.04.18
[C++#5-3] queue  (0) 2022.04.18
[C++#5-2] stack  (0) 2022.04.18
[C++#5-1] vector  (0) 2022.04.18

+ Recent posts