[C++ STL] map 기본적인 사용법
[C++ STL]에서 연관 컨테이너 중 하나인 map에 대해서 기본적인 사용법을 알아보도록 하겠습니다. map의 자료구조는 트리로 구성되어 있습니다. 정확히 말하면 레드 블랙 트리입니다. 레드 블랙 트리는 자가 균형 이진 탐색 트리로써 삽입과 삭제가 일어나는 경우에 자동으로 그 높이를 작게 유지하는 이진 탐색 트리입니다. 높이를 작게 유지하는 이유는 연산 과정에서 트리의 높이가 한쪽으로 치우치는 것을 막기 위함입니다. 이는 시간복잡도와 관련이 있습니다. 트리에 n개의 원소가 있을 때 O(log n)의 시간 복잡도로 삽입, 삭제, 검색을 할 수 있다.
*(문자열의 경우는 예외 문자열의 길이를 고려해줘야 함)
1. 기본적인 형태 : map<key, value>
map의 기본적인 형태는 위와 같습니다
key, value 값이 쌍으로 저장되는 형태를 띠며 key값을 이용해서 value를 찾을 수 있는 것입니다.
2. 기본적인 메소드
begin() : 첫 번째 원소의 iterator (반복자)를 반환한다 (즉 map의 원소를 반복자를 이용해서 접근할 수 있다.)
end() : 마지막 원소 다음의 반복자를 반환
clear() : 저장하고 있는 모든 원소를 삭제한다.
insert() : 원소를 추가한다.
find() : key와 관련된 원소의 반복자를 반환한다. (단 찾지 못한 경우 end() 반복자를 반환한다)
size() : 원소의 개수를 반환한다.
erase() : 해당 원소를 삭제한다.
+) 추가 정보
1 ) insert() 함수 : 어떠한 원소를 추가할 때 사용
함수의 원형은 다음과 같습니다
1
2
3
|
pair insert( const value_type& _Val );
iterator insert( iterator _Where, const value_type& _Val );
template void insert( InputIterator _First, InputIterator _Last );
|
cs |
1)번 방식이 가장 많이 사용됩니다
2)번 방식의 경우 반복자를 이용해서 원하는 위치에 삽입 가능합니다.
3)번 방식의 경우 잘 모르겠네요 :)
또한 operator[]를 사용하여 추가할 수 있습니다!
2) find() 함수 : 검색 함수 , key와 같은 요소를 찾을 때 사용
함수의 원형은 다음과 같습니다
1
2
|
iterator find( const Key& _Key );
const_iterator find( const Key& _Key ) const;
|
cs |
두 함수의 차이는 반환으로 주어지는 iterator(반복자)가 const냐 아니냐의 차이입니다
즉 1)번의 경우 주어진 반복자를 이용해서 value를 수정할 수 있습니다
그러나 2)번의 경우 value값을 수정할 수 없습니다.
3) erase() 함수
함수의 원형은 다음과 같습니다
1
2
3
|
iterator erase( iterator _Where );
iterator erase( iterator _First, iterator _Last );
size_type erase( const key_type& _Key );
|
cs |
1) 의 경우 반복자로 지정해서 지울 수가 있습니다.
2) 의 경우 반복자로 구간을 지정해서 구간의 값들을 지울 수 있습니다.
3) 의 경우 key 값을 지정해서 지우기가 가능합니다.
3. 예제 소스 코드
1) 정수형(int)을 key , value로 사용
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
|
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, int> ma;
// 원소를 추가 하자!!
ma.insert(make_pair(1, 3)); // key 값 : 1 , value : 3
ma.insert(make_pair(3, 13)); // key 값 : 3, value : 13
//operator [] 를 사용하여 원소를 추가 시킴!
ma[5] = 10;
ma[4]++; // 특이하지만 이런 방법도 가능하다. key : 4인 원소가 없으므로 생성한뒤 기본값 : 0 에서 1을 더해준다.
// make_pair 형식으로 저장 했으므로
// key 값은 fisrt 로 접근 value 값은 second 로 접근한다.
for (auto iter = ma.begin(); iter != ma.end(); ++iter) {
cout << "key : " << iter->first << " value : " << iter->second << '\n';
}
cout << "\n" << "\n";
cout << "검색 하기!!" << '\n';
cout << "key : 5 인 Value : ";
cout << ma.find(5)->second << '\n' << '\n';
// key : 3인 원소를 지워보자
ma.erase(3);
for (auto iter = ma.begin(); iter != ma.end(); ++iter) {
cout << "key : " << iter->first << " value : " << iter->second << '\n';
}
cout << "\n" << "\n";
return 0;
}
|
cs |
2) string을 key 또는 value 로 사용
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 <string>
#include <map>
using namespace std;
int main() {
map<int, string> ma;
cout << "value를 string 으로" << '\n' << '\n';
// insert
ma.insert(make_pair(3, "red"));
ma.insert(make_pair(1, "blue"));
// operator [] 를 활용한 insert
ma[5] = "black";
for (auto iter = ma.begin(); iter != ma.end(); ++iter) {
cout << "key : " << iter->first << " , value : " << iter->second << '\n';
}
cout << "\n" << "\n";
cout << "String 을 key 값으로 사용" << '\n' << '\n';
map<string, int> m;
m.insert(make_pair("red", 3));
m.insert(make_pair("blue", 1));
// operator [] 를 활용한 insert
m["black"] = 5;
for (auto iter = m.begin(); iter != m.end(); ++iter) {
cout << "key : " << iter->first << " , value : " << iter->second << '\n';
}
cout << "\n" << "\n";
}
|
cs |
- 결과
참고자료
https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS9990721111
https://twpower.github.io/91-how-to-use-map-in-cpp
'C++ STL' 카테고리의 다른 글
[C++ STL] Priority_queue 사용법 (0) | 2020.06.05 |
---|