반응형

[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() : 해당 원소를 삭제한다.

 

- insert() 함수

어떤 원소를 추가할 때 사용한다. 함수의 원형은 아래와 같습니다.

pair insert( const value_type& _Val ); 
iterator insert( iterator _Where, const value_type& _Val );
template void insert( InputIterator _First, InputIterator _Last );
  • 1번 방식이 가장 많이 사용됩니다
  • 2번 방식의 경우 반복자를 이용해서 원하는 위치에 삽입 가능합니다.
  • 3번 방식의 경우 잘 모르겠네요.. :)

또한 operator[]를 사용하여 추가할 수 있습니다!

 

2) find() 함수 : 검색 함수 , key와 같은 요소를 찾을 때 사용

함수의 원형은 다음과 같습니다.

iterator find( const Key& _Key );
const_iterator find( const Key& _Key ) const;

두 함수의 차이는 반환으로 주어지는 iterator(반복자)가 const냐 아니냐의 차이입니다

즉 1)번의 경우 주어진 반복자를 이용해서 value를 수정할 수 있습니다

그러나 2)번의 경우 value값을 수정할 수 없습니다.

 

3) erase() 함수

함수의 원형은 다음과 같습니다.

iterator erase( iterator _Where );
iterator erase( iterator _First, iterator _Last );
size_type erase( const key_type& _Key );

1) 의 경우 반복자로 지정해서 지울 수가 있습니다.

2) 의 경우 반복자로 구간을 지정해서 구간의 값들을 지울 수 있습니다.

3) 의 경우 key 값을 지정해서 지우기가 가능합니다.

 

3. 예제 소스 코드

1) 정수형(int)을 key , value로 사용

#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;
}

 

실행결과

key : 1 value : 3
key : 3 value : 13
key : 4 value : 1
key : 5 value : 10


검색 하기!!
key : 5 인 Value : 10

key : 1 value : 3
key : 4 value : 1
key : 5 value : 10

 

2) string을 key 또는 value 로 사용

#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";
}

 

실행결과

value를 string 으로

key : 1 , value : blue
key : 3 , value : red
key : 5 , value : black


String 을 key 값으로 사용

key : black , value : 5
key : blue , value : 1
key : red , value : 3

 

 

참고자료

https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS9990721111

https://twpower.github.io/91-how-to-use-map-in-cpp

반응형