<개인공부>/[C++]

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

BlockDMask 2017. 7. 28. 11:12
반응형

안녕하세요. BlockDMask 입니다.


오늘은 연관 컨테이너 set, multiset, map, multimap 중.


keyvalue가 쌍으로 저장되는 map에 대해서 알아보도록 하겠습니다.


std::map은 std::vector 처럼 정말 많이 쓰이는 컨테이너 중에 하나 입니다.


연관 컨테이너들은 99% 멤버 변수가 동일합니다.


> 관련 포스팅

: map, set의 키를 클래스나 구조체로 설정하는 방법 [바로가기]


1) map container

  • Associative - 연관 컨테이너 (associative container) 중 하나입니다.

  • 노드 기반으로 이루어져있고 균형 이진 트리 구조니다.

  • Map - map은 keyvalue로 이루어져있으며 이는 pair 객체 형태로 저장됩니다.

  • Unique Key - key는 고유한 값이므로 중복이 불가능 합니다. (중복 key는 multimap 에서 가능합니다.)

  • Ordered - map도 set과 마찬가지로 삽입이 되면서 자동으로 정렬이 됩니다. (default는 less/오름차순 입니다.)

  • Allocator-aware - map container는 저장공간의 필요에 따라서 allocator 객체를 사용합니다. (동적할당 합니다.)

  • 그림으로 대략적인 모습을 보겠습니다.


2) map 사용법

  • <map> 헤더파일에 포함됩니다.

  • using namespace std; 를 사용하면 편리합니다.

  • 기본 생성 방법은 : map< [Data type1], [Data type2] > [변수이름];
    ex) map<int, int> m1;
    ex) map<stringint> m2;

    - map 에 삽입을 하기 위한 insert는 pair 객체를 인자로 받아야합니다. (key 값과 value는 쌍을 이루기 때문)

    ex) m1.insert(pair<int, int>(10, 20));
    ex) m2.insert(pair<string, int>("BlockDMask", 27));

3) map의 생성자와 연산자

  • map<int, int> m;
    - 기본 선언 방법

  • map<int> m(pred);
    - pred를 통해 정렬기준(오름,내림)을 세웁니다.

  • map<int> m2(m1);
    - m1을 복사한 m2 를 생성합니다.

  • 연산자 ("==", "!=", "<", ">", "<=", ">=") 사용가능합니다.

  • 연산자 m[key] = val; 을 통해서 원소( key, value ) 를 추가 또는 수정이 가능합니다. (operator [] )


4) map의 멤버 함수


- set의 멤버 함수와 동작이 동일하기 때문에, 종류만 나열하겠습니다.

- 멤버함수의 자세한 설명은 여기 있습니다. [바로가기]


- m.begin();

- m.end();

- m.rbegin();

- m.rend();

- m.clear();

- m.count(k);

- m.empty();

- m.insert(k);     //k는 pair 객체입니다.

- m.insert(iter, k);

- m.erase(start, end);

- m.find(k);

- m2.swap(m1);

- m.upper_bound(k);

- m.lower_bound(k);

- m.equal_range(k);    

- m.value_comp();

- m.key_comp();

- m.size();

- m.max_size();



5) 조금 다양해 진듯 한 예제


<Test 1> 기본 insert, 순회 접근방법.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<map>
#include<string>
using namespace std;
 
int main(void){
    
    map<intstring> m;
    
    m.insert(pair<intstring>(40"me"));
    m.insert(pair<intstring>(35"Show"));
    m.insert(pair<intstring>(10"Dok2"));
    m.insert(pair<intstring>(90"6"));
    m.insert(pair<intstring>(65"money"));
    m.insert(pair<intstring>(20"ZICO"));
    m.insert(pair<intstring>(50"the"));
 
    
    map<intstring>::iterator iter;
    
    //접근방법 1 
    for(iter = m.begin(); iter != m.end(); iter++){
        cout << "[" << iter->first << ", " << iter->second << "]" << " " ;
    }
    cout << endl;
    
    //접근방법 2 
    for(iter = m.begin(); iter != m.end(); iter++){
        cout << "[" << (*iter).first << ", " << (*iter).second << "]" << " " ;
    }
    
    
    return 0;    
}
cs


> Test 1 결과



<Test 2> operator [] 연산자 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<map>
using namespace std;
 
int main(void){
    
    map<intint> m;
 
    m[9= 109;        
    m[3= 103;
    m[13= 113;
    m[15= 115;
    m[1= 101;
    m[7= 107
    m[5= 105;
    m[11= 111;
 
    
    map<intint >::iterator iter;
    
    for(iter = m.begin(); iter != m.end() ; iter++){
        cout << "[" << iter->first << ", " << iter->second << "]" << " ";
    }
    cout << endl;
    
    
    m[11= 999;
    m[1= 999;
    //변경 후 순회 
    for(iter = m.begin(); iter != m.end() ; iter++){
        cout << "[" << iter->first << ", " << iter->second << "]" << " ";
    }    
    cout << endl;
    
    //사이즈 출력 
    cout << "size : " << m.size() << endl;
        
    return 0;    
}
cs


> Test 2 결과




--> equal_range, upper_bound, lower_bound 멤버 함수는 multimap 에서 예제를 사용하여 보여드리겠습니다.

감사합니다.


참고 : http://www.cplusplus.com/reference/map/map/

한번의 하트 클릭이 

저에게는 큰 힘이 됩니다.

반응형