C++/STL

[C++] STL #2 연관 컨테이너 (associate container) [set & multiset, map & multimap]

노랑꼬리 2023. 6. 14. 22:50

목차

※ STL #1 순차 컨테이너

 

1. set & multiset

2. map & multimap

 


가-B. 연관 컨테이너 (associate container)

- key와 같은 특정 정렬 기준(연관)에 따라 원소를 정렬하는 컨테이너

- 정렬 기준에 따라 정렬이 되므로 특정 위치를 지정한 접근 및 참조가 불가능 하다.

- 노드 기반 컨테이너이다.

- 균형 이진트리로 구성되어 있다.

균형 이진 트리 예시

 

- 찾기 연산이 매우 빠르다. (균형 이진트리 때문)

 

1. std::set & std::mulitset

- set은 원소 자체가 key가 되어 분류된 균형 이진 트리이다.

- key는 유일해야 하며 key == 원소 이므로 데이터의 중복이 허용되지 않는다.

ㄴ mulitset에서는 키의 중복을 허용한다. (key의 중복허용을 제외한 다른 요소는 동일)

- 삽입 되며 자동으로 정렬이 된다. (기본 : 오름차순)

 

가. 선언 및 초기화

template<typename T>    //template  자유 자료형

std::set<T>        //T : 배열에 담길 자료형

 

// pred(predicate : 조건자)

- set<int> s1                                                              // 빈 셋 생성

- set<double> s2(pred)                                             // pred를 기준으로 정렬하는 빈 셋 생성

- char sample[] = { 'a', 'b', 'c' };                 

   set<char> s3(begin(sample), end(sample));          // 다른 배열의 값을 사용해 초기화 가능

- string sample2[] = { "one", "two", "three" };               

   set<string> s4(begin(sample2), end(sample2), pred); 

// 다른 배열의 값을 사용해 초기화, 정렬 기준은 pred 조건자를 사용한다. (pred 생략시 오름차순 정렬)

- set<char> s5(s3)                                                     // s3를 복사하여 s5 셋 생성

 

나. 멤버 함수        ( ※ 기준 :  int sample[] = { 1, 2, 3, 4, 5 };       set<int> s(begin(sample), end(sample); ) 

Iterators(반복자)
s.begin() 첫 번째 위치를 가리킨다. (예시 기준 1)
s.end() 마지막 위치의 다음을 가리킨다. (예시 기준 5)
s.rbegin() 역순으로 뒤집고 첫 번째 위치를 가리킨다. (예시 기준 5)
s.rend() 역순으로 뒤집고 마지막 위치의 다음을 가리킨다. (예시 기준 1)
s.cbegin(), s.cend(), s.crbegin(), s.crend()(앞에 c가 붙은 멤버 함수)
   위와 같은 역할을 하지만 const가 적용되어 수정이 불가능 하다.
Capacity(용량
s.empty() set s가 비어있는지 확인하고 bool 값 반환
s.size() set s의 크기를 반환한다.
s.max_size() set s가 담을 수 있는 최대 크기를 반환
(셋 컨테이너가 가질 수 있는 가장 큰 수를 반환한다)
Modifiers(수식어)
s.clear() set s의 모든 요소를 지운다.
s.insert(K) K를 삽입한다, 삽입시 자동으로 정렬된 위치에 삽입된다.
s.emplace(K)
s.emplace_hint(iterator, K)
insert와 같은 역할.   결과는 같으나 생성 과정이 다름.
emplace_hint 는 지정된 위치에 삽입이지만 자동 정렬이 되므로 위치 지정의 의미가 없다.
s.erase
(iterator, iterator)
iterator에서 iterator 전 까지의 원소를 삭제한다.
(ex. auto target = s.begin();  advance(target, 2);
       s.erase(s.begin(), target); )
s.swap(s2) ss2의 인자를 교환한다.
Lookup(조회)
s.count(K) key 값이 K인 요소의 수 반환.
s.find(K) key 값이 K인 요소의 iterator 반환, 없을 시 s.end()를 반환한다.
Lookup - find 예시 참조
s.equal_range(K) key 값이 K인 요소의 iterator 범위 반환. ( first로 시작 범위, second로 마지막 범위 다음 위치)
Lookup - equal_range 예시 참조
s.lower_bound(K) 주어진 key 값 보다 작지 않은 첫번째 요소의 iterator 반환
s.upper_bound(K) 주어진 key 값 보다 큰 첫번째 요소의 iterator 반환
 

Lookup - find 예시
Lookup - equal_range 예시

2. std::map & multimap

- 각 노드가 key와 value 쌍으로 이루어진 균형 이진 트리이다.

- first, second 두 요소로 구성된 pair 객체로 first = key, sencond = value 이다.

- key는 중복이 허용되지 않지만 value는 중복이 허용된다.

ㄴ multimap 에서는 중복 key를 허용한다. (key의 중복허용을 제외한 다른 요소는 동일)

- 삽입 되며 자동으로 정렬이 된다. (기본 : 오름차순)

map<int, string> 예시

가. 선언 및 초기화

template<typename T>

std::map<T(key), T(value)>

 

pred(predicate : 조건자)

- map<int, string> m1;                      // 빈 맵 생성

- map<int, double, pred> m2            // pred을 기준으로 정렬하는 맵 생성

- map<int, char> m3 = {                    // 생성과 동시에 초기화

{ 1, 'a' },

{ 5, 'b' },

{ 3, 'c' },

{ 8, 'd' },

};

- map<int, char> m4(m3.begin(), m3.end());         // m3를 복사하여 m4 맵 생성

 

나. 멤버 함수        ( ※ 기준 :  map<int, string> m = { { 1,"Arial" },  { 3, "Angella" }, { 4, "Peter" }, { 2, "Beatrice" }, }; )

Element access(요소 접근)
m.at(K) K를 key 값으로 지닌 value를 반환한다.
m[K] K를 key 값으로 지닌 value를 반환한다.
Iterators(반복자)
m.begin() 첫 번째 위치를 가리킨다. (예시 기준 { 1,"Arial" })
m.end() 마지막 위치의 다음을 가리킨다. (예시 기준 { 4, "Peter" })
m.rbegin() 역순으로 뒤집고 첫 번째 위치를 가리킨다. (예시 기준 { 4, "Peter" })
m.rend() 역순으로 뒤집고 마지막 위치의 다음을 가리킨다. (예시 기준 { 1,"Arial" })
m.cbegin(), m.cend(), m.crbegin(), m.crend() (앞에 c가 붙은 멤버 함수)
   위와 같은 역할을 하지만 const가 적용되어 수정이 불가능 하다.
Capacity(용량
m.empty() map m이 비어있는지 확인하고 bool 값 반환
m.size() map m의 크기를 반환한다.
m.max_size() map m가 담을 수 있는 최대 크기를 반환
(맵 컨테이너가 가질 수 있는 가장 큰 수를 반환한다)
Modifiers(수식어)
m.clear() map m의 모든 요소를 지운다.
m.insert( {K, V} ) key-value 쌍을 가진  {K,V}를 삽입한다, 삽입시 자동으로 정렬된 위치에 삽입된다.
modifiers - insert, emplace, emplace_hint 예시 참조
m.emplace({K, V})
m.emplace_hint(iterator, {K, V})
insert와 같은 역할.   결과는 같으나 생성 과정이 다름.
emplace_hint 는 지정된 위치에 삽입이지만 자동 정렬이 되므로 위치 지정의 의미가 없다.
m.erase
(iterator, iterator)
iterator에서 iterator 전 까지의 원소를 삭제한다.
(ex. auto target = m.begin();  advance(target, 2);
       m.erase(m.begin(), target); )                   => m = { { 3, "Angella" }, { 4, "Peter" } }; 
m.swap(m2) m m2의 인자를 교환한다.
Lookup(조회)
s.count(K) key 값이 K인 요소의 수 반환.
s.find(K) key 값이 K인 요소의 iterator 반환, 없을 시 s.end()를 반환한다.
s.equal_range(K) key 값이 K인 요소의 iterator 범위 반환. ( first로 시작 범위, second로 마지막 범위 다음 위치)
s.lower_bound(K) 주어진 key 값 보다 작지 않은 첫번째 요소의 iterator 반환
s.upper_bound(K) 주어진 key 값 보다 큰 첫번째 요소의 iterator 반환
 

modifiers - insert, emplace, emplace_hint 예시

 

※ 참조

c++ reference : https://en.cppreference.com/