ProgrammingLang/c++

[C++ 개발자되기] 10. map 사용법

jinkwon.kim 2019. 12. 2. 13:31
728x90
반응형

>>[C++ 관련 모든 글 보기]

1. map 이란?

  Key, Value 쌍인 데이터를 균형 binary tree로 관리하는 자료구조입니다.

* 2진 트리 종류는 Red-Black Tree을 사용

 

2. map은 언제 쓰는가?

  1) 입력하는 자료를 정렬해야 한다.
  2) 많은 자료를 저장하고, 검색이 빨라야 한다
  3) 빈번하게 삽입, 삭제하지 않는다.

    - 삽입, 삭제 시 자동 정렬이 발생하여 속도가 느려집니다.

 

3. map의 핵심 기능

  1) find

    (1) map은 key가 있다면 vector처럼 Random access가 가능합니다.

    (2) iterator를 사용하여 순차적으로 검색이 가능합니다.

  2) Insert

    (1) map은 자료를 삽입 시 내부에서 자동으로 Key 기준으로 오름차순 정렬(기본 정렬)을 하고 삽입이 됩니다.

    (2) std::map의 원소는 std::pair 객체로 저장된다.

    (3) key 중복은 허용하지 않습니다.

    (4) 실행 중에 동적으로 크기가 확장됩니다

  3) erase

    (1) Random access 하여 삭제가 가능합니다. 

 

4. 헤더

  #include <map>

 

5. 기본 사용법

  1) create / insert / find / delete / for loop / erase for loop

#include <map>

int main()
{
    /* 1. create */
    std::map<int, int> map1;
    
    /* 2. insert */
    map1.insert(std::make_pair(1, 10); // insert
    map1.insert(std::make_pair(2, 20); // insert
    map1.insert(std::make_pair(3, 30); // insert
    
    /* 3. find */
    std::cout << "Find Key " << map1.find(1)->first << std::endl;
    std::cout << "Find data " << map1.find(1)->second << std::endl;

    /* 4. erase */
    map1.erase(1); 
    
    /* 5. for loop */
    std::map<int, int>::iterator it;
    for (it = map1.begin(); it != map1.end(); it++) {
      std::cout << "key : " <<  it->first << " Value : " << it->second << std::endl;
    }
    
    /* 6. erase in loop
    *  다음과 같이 짜야 하는이뉴는 erase시 전달되는 인자가 무효화 되기 때문 입니다. 
    *  그래서 it++ 을 통하여 복사 전달한 인자만 무효화 되고 증가 된 값을 it가 참조 하게 해야 합니다.
    *  원본 설명 https://kukuta.tistory.com/81
    */
    for(it = map1.begin(); it != map1.end();) {
        if(it->second == value) {
            map1.erase(it++);
        }
        else {
            ++it;
        }
    }
    return 0;
}

  2). operator [] 연산자 (유용하게 사용)

    loop을 돌리지 않고 바로 바로 값을 찾을수 있어서 좋음

#include <iostream>
#include <map>

int main()
{
  std::map<std::string, int> test;

  test["first"] = 1;
  test["second"] = 2;
  test["third"] = 3;

  std::cout << test["first"] << std::endl;
  std::cout << test["second"] << std::endl;
  std::cout << test["third"] << std::endl;

  return 0;
}

6. 지원하는 함수 정리 

멤버 설명
begin 첫 번째 원소의 랜덤 접근 반복자를 반환
clear 저장하고 있는 모든 원소를 삭제
empty 저장 하고 있는 요소가 없으면 true 반환
end 마지막 원소 다음의(미 사용 영역) 반복자를 반환
erase 특정 위치의 원소나 지정 범위의 원소들을 삭제
find key와 연관된 원소의 반복자 반환
insert 원소 추가
lower_bound 지정한 key의 요소를 가지고 있다면 해당 위치의 반복자를 반환
operator[] 지정한 key 값으로 원소 추가 및 접근
rbegin 역방향으로 첫 번째 원소의 반복자를 반환
rend 역방향으로 마지막 원소 다음의 반복자를 반환
size 원소의 개수를 반환
upper_bound 지정한 key 요소를 가지고 있다면 해당 위치 다음 위치의 반복자 반환

>>[C++ 관련 모든 글 보기]

 

 

참고 자료

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

2. https://shaeod.tistory.com/467 

3. https://kukuta.tistory.com/81

728x90
반응형