[STL] map 정리 및 예제

2019. 7. 30. 00:35 기타/C++ STL

[STL] map 정리 및 예제


map 컨테이너는 연관 컨테이너 중 자주 사용하는 컨테이너로 원소를 key 와 value의 쌍으로 저장한다.

set은 원소로 key 하나만을 저장하지만, map 은 원소로 key와 value의 쌍(pair 객체)를 저장한다.

set처럼 원소의 key는 컨테이너에 중복 저장될 수 없으며 중복 key를 저장해야 한다면 mulitmap을 사용해야 한다.


[기타/C++ STL] - [STL] set 정리 및 예제



map도 연관 컨테이너이므로 set과 같은 인터페이스 멤버 함수를 제공하며 템플릿 형식과 내장 멤버 형식만이 약간의 차이를 보인다.

특히, map은 [] 연산자를 제공하여 key에 해당하는 원소의 value에 쉽게 접근하거나 변경할 수 있다.


연관 컨테이너의 핵심은 빠른 원소 찾기(검색)이며 균형 이진 트리를 이용한 로그 시간 검색 복잡도를 보장한다.

[] 연산자를 사용하여 원소를 추가할 수도 있지만, insert() 멘버 함수로 원소를 추가할 수 있다.



템플릿 형식 

 template<typename Key,

typename Value,

typename Pred=less<Key>,

typename Allocator=allocator<pair <const key, value>>>

class map

 Key와 Value는 map 컨테이너 원소의 key와 value의 형식이다. Pred는 map의 정렬 기준인 조건자다. 기본 조건자는 less 이다.



연산자 

 m[k] = v

 m 컨테이너에 원소 (k,v)를 추가하거나 key에 해당하는 원소의 value를 v로 갱신한다. 



멤버 형식 

 allocator_type

메모리 관리자 형식 

 const_iterator

const 반복자 형식 

 const_pointer

 const value_type* 형식 

 const_reference

const value_type& 형식 

 const_reverse_iterator

const 역 반복자 형식 

 difference_type

두 반복자 차이의 형식 

 iterator

반복자 형식 

 key_compare

키(Key) 조건자(비교) 형식 

 key_type

키(Key)의 형식 

 mapped_type

값(value)의 형식 

 pointervalue_type* 형식 

 reference

value_type& 형식 

 reverse_iterator

역 반복자 형식 
 size_type

첨자(index)나 원소의 개수 등의 형식 

 value_type원소의 형식 


map은 set처럼 컨테이너에 원소 (key, value의 쌍)를 삽입하는 유일한 멤버 함수 insert()를 제공한다.

기본 정렬 기준은 less이며 컨테이너의 모든 key는 유일하다.


map의 원소는 pair 객체로 저장되며 pair 객체의 first 멤버 변수는 key로 second 멤버 변수는 value이다.

원소를 저장하는 insert() 멤버 함수는 pair 객체를 인자로 받아 map의 원소인 key와 value의 쌍을 저장한다.


#include <iostream>
#include <map>
using namespace std;

int main(){

    map<int, int> m;

    m.insert(pair<int, int>(5, 100));    // 임의 pair insert()
    m.insert(pair<int, int>(3, 100));

    pair<int, int> p(9, 50);        
    m.insert(p);                // pair 객체 생성 insert()

    m[11] = 200;            // key/value 삽입
    m[12] = 200;
    m[13] = 40;

    map<int, int>::iterator iter;
    for (iter = m.begin(); iter != m.end(); ++iter)
        cout << "(" << (*iter).first << "," << (*iter).second << ")" << " ";
    cout << endl;


    m[13] = 140;        // key/value 갱신

    // -> 연산자 호출
    for (iter = m.begin(); iter != m.end(); ++iter)
        cout << "(" << iter->first << "," << iter->second << ")" << " ";
    cout << endl;



    pair<map<int, int>::iterator, bool > pr;

    // insert 결과 성공
    pr = m.insert(pair<int, int>(10, 30));
    if (true == pr.second)
        cout << "key : " << pr.first->first << ", value : " << pr.first->second << " 저장 완료!" << endl;
    else
        cout << "key 10가 이미 m에 있습니다." << endl;

    for (iter = m.begin(); iter != m.end(); ++iter)
        cout << "(" << iter->first << "," << iter->second << ")" << " ";
    cout << endl;

    // insert 결과 실패 (중복 key 삽입)
    pr = m.insert(pair<int, int>(10, 40));
    if (true == pr.second)
        cout << "key : " << pr.first->first << ", value : " << pr.first->second << " 저장 완료!" << endl;
    else
        cout << "key 10가 이미 m에 있습니다." << endl;


    return 0;
}



 결과 :

<3,100> <5,100> <9,50> <11,200> <12,200> <13,40>

<3,100> <5,100> <9,50> <11,200> <12,200> <13,140>

key : 10, value : 30 저장 완료!

<3,100> <5,100> <9,50> <10,30> <11,200> <12,200> <13,140>

key 10가 이미 m에 있습니다.


[] 연산자는 key에 대한 value를 저장 또는 갱신할 수 있다.

해당 key가 없다면 insert가 되고, 있다면 value 값을 수정한다.


#include <iostream>
#include <map>
#include <functional>
#include <string>
using namespace std;

int main(){

    // greater 정렬 기준의 key:int, value:string 타입의 map 생성
    map<int, string, greater<int>> m;

    m[5] = "five";
    m[3] = "three";
    m[8] = "eight";
    m[4] = "four";
    m[1] = "one";
    m[7] = "seven";
    m[9] = "nine";

    map<int, string, greater<int>>::iterator iter;
    for (iter = m.begin(); iter != m.end(); ++iter)
        cout << "(" << iter->first << ',' << iter->second << ") ";
    cout << endl;

    // key가 5인 요소 찾기
    iter = m.find(5);
    if (iter != m.end())
        cout << "key 5에 매핑된 value : " << iter->second << endl;

    // key가 5인 요소의 첫번째 요소 / 마지막의 다음 요소 찾기
    map<int, string>::iterator lower_iter;
    map<int, string>::iterator upper_iter;
    lower_iter = m.lower_bound(5);
    upper_iter = m.upper_bound(5);

    cout << "lower_iter : " << lower_iter->second << endl;
    cout << "upper_iter : " << upper_iter->second << endl;

    // key가 5인 요소의 범위  찾기
    pair<map<int, string>::iterator, map<int, string>::iterator> iter_pair;
    iter_pair = m.equal_range(5);

    for (iter = iter_pair.first; iter != iter_pair.second; ++iter)
        cout << "(" << iter->first << ',' << iter->second << ") ";
    cout << endl;

    return 0;
}



결과 :

<9,nine> <8,eight> <7,seven> <5,five> <4,four> <3,three> <1,one>

key 5에 매핑된 value : five

lower_iter : five

upper_iter : four

<5,five>


정렬 순서는 기본이 less 이다. map을 선언할 때 정렬기준을 지정할 수 있다.


find() 함수로 해당 key의 위치를 찾을 수 있다. 해당 key가 없다면 end()를 가리킨다.


lower_bound()와 upper_bound(), equal_range() 로 key에 대한 범위를 찾을 수 있다.



출처: https://hyeonstorage.tistory.com/329?category=614599 [개발이 하고 싶어요]

'기타 > C++ STL' 카테고리의 다른 글

[STL] multimap 정리 및 예제  (0) 2019.07.30
[STL] multiset 정리 및 예제  (0) 2019.07.30
[STL] set 정리 및 예제  (0) 2019.07.30
[STL] list 정리 및 예제  (0) 2019.07.30
[STL] deque 정리 및 예제  (0) 2019.07.30
[STL] vector 벡터 정리 및 예제  (0) 2019.07.30
[STL] not2 함수  (0) 2019.07.30
[STL] 역방향 반복자 (reverse_iterator)  (1) 2019.07.30