안녕하세요. BlockDMask 입니다.
오늘은 연관 컨테이너 set, multiset, map, multimap 중.
key와 value가 쌍으로 저장되는 map에 대해서 알아보도록 하겠습니다.
std::map은 std::vector 처럼 정말 많이 쓰이는 컨테이너 중에 하나 입니다.
연관 컨테이너들은 99% 멤버 변수가 동일합니다.
> 관련 포스팅
: map, set의 키를 클래스나 구조체로 설정하는 방법 [바로가기]
1) map container
- Associative - 연관 컨테이너 (associative container) 중 하나입니다.
- 노드 기반으로 이루어져있고 균형 이진 트리 구조입니다.
- Map - map은 key와 value로 이루어져있으며 이는 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<string, int> 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<int, string> m; m.insert(pair<int, string>(40, "me")); m.insert(pair<int, string>(35, "Show")); m.insert(pair<int, string>(10, "Dok2")); m.insert(pair<int, string>(90, "6")); m.insert(pair<int, string>(65, "money")); m.insert(pair<int, string>(20, "ZICO")); m.insert(pair<int, string>(50, "the")); map<int, string>::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<int, int> 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<int, int >::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/
한번의 하트 클릭이
저에게는 큰 힘이 됩니다.
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] priority_queue container 정리 및 사용법 (4) | 2017.08.04 |
---|---|
[C++] queue container 정리 및 사용법 (2) | 2017.08.03 |
[C++] stack container 정리 및 사용법 (0) | 2017.08.02 |
[C++] multimap container 정리 및 사용법 (2) | 2017.07.29 |
[C++] multiset container 정리 및 사용법 (0) | 2017.07.27 |
[C++] set container 정리 및 사용법 (8) | 2017.07.26 |
[C++] list container 정리 및 사용법 (4) | 2017.07.25 |
[C++] deque container 정리 및 사용법 (2) | 2017.07.23 |