본문 바로가기
프로그래밍 언어/C++

STL 컨테이너 - set, multiset, map, multimap

by Nighthom 2023. 2. 14.

1. Set 선언법

set은 순서 있는 집합을 나타낸다. 기본적으로 다음과 같이 선언한다.

std::set<type> s;

set에는 각종 정보가 BST의 형태로 인덱싱되어서 들어간다. 인덱싱을 할 때 비교연산을 수행하므로 operator<를 정의해 주어야 사용할 수 있다. 

2. Set에 정보 삽입/삭제

set.insert 메서드는 삽입에 성공하면 set.first에 삽입한 데이터의 이터레이터를, set.second에는 삽입 성공 여부를 리턴한다. 만약 중복 원소를 삽입하려고 시도할 경우 삽입에 실패하고 set.second에 false가 반환되게 된다. 

s.insert(data);		// set에 데이터 삽입
s.insert(iter, k);	// 해당 이터레이터의 위치에서부터 k의 위치를 탐색해서 삽입
s.erase(iter);		// set에서 해당 이터레이터에 해당하는 데이터 삭제
s.erase(start, end)	// start 이터레이터부터 end 이터레이터까지 모두 삭제
s.clear();		// set에 있는 모든 정보 삭제

3. Set 이터레이터

Set은 기본적으로 set.begin(), set.end() 이터레이터를 제공한다. set은 인덱스기반으로 접근하는 것(at메서드나 []연산자 사용)은 불가능하고 해당 이터레이터를 활용해서만 데이터에 접근할 수 있다.

s.begin();
s.end();

s.rbegin();
s.rend();

4. Set에서 정보 검색

Set에 있는 정보는 find를 통해서 검색할 수 있다. 해당 메서드는 검색한 정보를 발견하면 해당 정보의 이터레이터를 리턴하고, 발견하지 못하면 set.end()를 리턴한다.

s.find(data);

5. Set의 Count 반환

set.count 메서드를 활용해서 해당 데이터의 count를 반환받을 수 있다. set은 중복 원소를 허용하지 않기에 0, 1만 반환된다.

6. multiset

multiset의 경우에도 사용 방법은 크게 다르지 않다. 단지, multiset은 원소의 중복을 허용한다.

7. unordered_set, unordered_multiset

unordered_set과 multiset은 hash map을 활용해서 set을 구현했다고 보면 된다. 

8. map, unordered_map

map은 set과 거의 동일하지만 key와 함께 value를 보관한다. 파이썬에서의 딕셔너리 같은 자료구조라고 생각하면 편하다. 

 

1) 값 삽입

예를 들어, 다음과 같이 값을 삽입할 수 있다.

std::map<string, int> m;
m.insert(std::pair<string, int>("one", 1);
m["two"] = 2;

2) 값 읽기

읽을 때도 다음과 같이 읽을 수 있다.

m.at("one");
m["one"];

3) 값 삭제

삭제는 key값을 기준으로 할 수도 있고, Iterator 기반으로 범위 삭제를 진행할 수도 있다. clear메서드도 존재한다.

m.erase("key");
m.erase(m.begin(), m.end());
m.clear();

4) 이터레이터를 활용한 값 접근

이터레이터를 활용해서 정보를 조회할때는 first, second를 활용해서 접근할 수 있다. first가 key, second는 value이다. 

m.begin()->first;
m.begin()->second;

 

댓글