본문 바로가기
C++ STL

[C++ STL] map 사용법

by 방준이 2020. 7. 27.
반응형

[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<intint> ma;
 
    //   원소를 추가 하자!!
    ma.insert(make_pair(13));  // key 값 : 1 , value : 3
    ma.insert(make_pair(313)); // 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<intstring> 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<stringint> 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