본문 바로가기

알고리즘&자료구조/c++ stl 정리

c++ stl map

- map이란?

map[key]=value

key와 value로 구성된 자료구조이다.

 

key값으로 해당 원소를 접근한다.(원소= value)

 

즉 배열은 30이라는 원소에 접근할 때 a[1](첫 번째 원소에 30저장 돼있다)과 같은 방식이라면

map은 a[key] (key라는 이름의 인덱스에 30이 저장 돼있다) 와 같은 방식으로 원소에 접근한다.   

 

key 값의 중복을 허용하지 안는다.

 

map은 <key,value> pair 객체를 노드로 갖는 red black tree(binary search tree의 일종)로 구현 돼있다.

 

binary search tree의 경우  트리 최악의 높이는 n이다 반면

red black tree는 o(logn)을 갖는다.

 

 

-해더 파일

#include<map>

 

-생성

map< key_type, value_type , compare , allocator>

 

1) key_type: key의 type 지정

2) value_type: value의 type 지정

3) compare: map의 정렬 기준 (default= 오름 차순)  생략가능

4) allocator: map의 메모리 할당 취소 되는 개체를 나타내는 형식 (defalut= pair<key,value>) 생략가능

 

사용 예시)

map<string,int> m;

* map<string,int> m = a와 같이 a map을 m에 복사할 수 있다.

 

 

-함수

 

1)begin():

시작 요소(이진트리의 루트)를 가리키는 정방향 iterator 반환

 

2)end():

마지막 요소 다음 위치(맨 마지막 요소 다음)를 가리키는 정방향iterator 반환

 

3)rbegin():

끝 요소를 가리키는 역방향 iterator 반환

 

4)rend():

시작 요소 전 위치를 가리키는 역방향 iterator 반환

*역방향 iterator를 iterator로 받을시 map<key_type,value_type>::reverse_iterator로 iterator 생성

 

<역방향 iterator vs 정방향 iterator>

 

5)empty():

map이 비어있으면 1을 리턴 아니면 0을 리턴

 

6)size():

map에 저장된 요소의 갯수 리턴

 

7)clear():

map에 있는 모든 요소 삭제

 

8)max_size():

    저장 가능한 최대 요소 갯수 리턴

 

9)[]과 at:

   요소에 접근시 사용  O(log n)의 시간복잡도

   ex) m["abc"]-> key를 "abc"로 갖는 요소에 접근 // m.at("abc")

   *[]는 범위를 벗어나면 예외 처리x , at은 범위를 체크해서 예외 처리를 해줌 

    (접근 범위 예측이 어려울 경우 안전하게 at을 사용하자)  ps.그냥 존재하는 원소의 key값을 알고 있다면 []쓰자..

 

10) find:

     iterator find (key) key값의 위치를 가리키는 iterator 반환 O(log n)의 시간복잡도

 

11) insert:

     pair<iterator,bool> insert (pair<Key,value>) 의 형태로 

     반환된 pair의 첫 요소는 insert된 위치를 가리키는 iterator , 두번째 요소는 insert 성공 여부를 나타낸다.

     (key와 value자리에 변수 사용 가능)

 

     * insert vs =

      원소 삽입에 있어 insert와 []방식이 있다.

       insert는 key값에 초기 삽입시 ok , 삽인된 value가 있다면 overwrite 되지 안는다. 

       =는 key값으로 초기 삽입 ok , overwrite도 가능하다. 

       (ex. m[key]=3과 같이 삽입 가능)

       ps. insert시 return값으로 무언가를 확인할 필요가 없다면 훨씬 편하니 =를 사용하자   

       

     * insert의 3가지 유형: 

 

      ->첫번째= 위의 설명한것 pair<iterator,bool> insert (pair<Key,value>)   o(log n)의 시간 복잡도를 갖는다.

          ps.가장 많이 쓰인다 사실 이것만 알아도 됨....

   

       ->두번째= iterator insert (iterator position , key-value)  이며

          position은 value를 삽입시 빠르게 삽입하기 위해 삽입 위치에 대한 힌트를 주는 것이다.  상수 시간(대신 힌트를

          가까운 곳에 줘야 함)

       

       ->세번째= void insert( 다른map의 삽입 할 요소들의 시작 iterator , 다른 map의 삽입 할 요소들의 끝 iterator)

          로 다른 map의 원하는 범위 요소들을 삽입하는 것

          즉 다른 map원하는 요소 범위를 현재 map에 복사하는것   요소갯수*o(logn)의 시간 복잡도를 갖는다.

       

 

12)erase:

 

  *3가지 유형

    ->첫번째= void erase(iterator)    iterator가 가리키는 위치 원속 삭제 상수시간 시간복잡도

    ->두번째= void erase(iterator first , iterator last)   first~last직전원속들 삭제 상수시간*원소수 시간복잡도

    ->세번째= size_type erase (key)  key값에 해당하는 원소 삭제 O(log n)의 시간복잡도

 

 

13)lower_bound & upper_bound:  

    iterator lower_bound(key) , iterator upper_bound(key) 

    O(log n)의 시간 복잡도

     

 

    m['a']=value;

    m['b']=value;

    m['c']=value;

    m['d']=value;

    m['e']=value;

 

    m.lower_bound('c')는 m['c']에 해당하는 iterator 반환 (만일 m['c']라는 곳에 원소가 없다면 m['b'])

    m.upper_bound('c')는 m['d']에 해당하는 iterator 반화

 

    즉 lower_bound는 key보다 가장 가깝게 작거나 같은 key에 해당하는 iterator 반환

    upper_bound는 key보다 큰 key에 해당하는 iterator 반환 

 

14) equal_range

pair<iterator,iterator> equal_range (key)

O(log n)의 시간 복잡도

 

pair의 첫번째 요소는 lower_bound 결과의 iterator

두번째 요소는 upper_bound 결과의 iterator 이다.

 

15) count

int count (value)

O(log n)의 시간 복잡도

 

map에 value 값을 갖는 요소를 찾는 함수로 없다면 0 있다면 1을 return한다.

'알고리즘&자료구조 > c++ stl 정리' 카테고리의 다른 글

c++ list (stl)  (2) 2021.09.10
c++ vector  (0) 2021.09.10
c++ pair  (0) 2021.09.09
c++ set & multiset  (0) 2021.09.09
c++ stl multimap  (0) 2021.09.07