2024
11.14

 

msdn : C++ map
https://learn.microsoft.com/ko-kr/cpp/standard-library/map-class?view=msvc-170

 

 

<map> 헤더에 포함된 키-쌍 을 저장하는 연관 컨테이너.

중복된 키를 허용하지 않으며 중복을 허용하는 std::multimap 가 별도로 존재한다.

 

요소가 지정된 비교 함수에 따른 키 값으로 정렬되어 있습니다. 기본은 오름차순 정렬

 

균형이진트리(AVL)로 구현되어 있다.

삽입/삭제/검색이 O(log n) 의 시간 복잡도를 가진다.

 

사용법

#include <iostream>
#include <map>

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

    // 요소 추가
    myMap[1] = "Apple";
    myMap[2] = "Banana";

    // 요소 접근
    std::cout << "Key 1 has value: " << myMap[1] << std::endl;

    // 요소 반복 출력
    for (const auto& pair : myMap) {
        std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
    }

    return 0;
}

 

선언

1. 일반 선언 (키가 int라서 int값에 따른 오름차순 정렬됨)

std::map<int, string> myMap;

 

2. 내림차순 정렬 (키 기준 내림차순으로 정렬됨)

- T3 에 비교 함수를 넣어주면 된다.

// 내림차순 정렬을 위한 사용자 정의 비교 함수
std::map<int, std::string, std::greater<int>> myMap;

 

삽입

1. operator[]

아래의 insert와는 달리 이미 값이 있는 경우 대체된다.

myMap[1] = "Apple";

 

따라서 이미 있는 값을 증가시키고 싶다하면, 아래와 같이 사용할 수 있다.

[] 검색은 값이 없는 경우 만들어 버리니 주의. 아래에 operator []의 검색에 대한 부분도 따로 설명.

myMap[a]++; // 1 증가나 감소
myMap[a] = myMap[a] + n; // n 증가나 감소

 

 

2. insert

insert는 두 번 하면 오류가 나지않고 무시된다.

리턴값이 페어로 두개를 묶어서 주는데, 첫번째는 방금 인서트 성공한 이터레이터고, 두번째는 성공여부이다.

myMap.insert(std::make_pair(4, "Date"));

 

삭제

1. erase(key) / erase(iterator)

리턴값은 삭제된 데이터 갯수이다. 삭제를 못하면 0을 리턴한다.

myMap.erase(2); // 키 2에 해당하는 요소 삭제

 

2. erase(first, end) 범위 삭제

- 키 값을 기준으로 정렬되어있으니 find(key) 를 통해 iterator를 찾아서 넣어주면된다. 

iterator erase( const_iterator First, const_iterator Last);

 

검색 

1. operator[]

std::map::operator[] 는 키를 참조하는 순간 없다면 만들어버린다! 값이 원래있다면 있는것을 리턴한다. 없다면 만들어서 리턴한다!

있는지만 체크하려면 find를 활용해야한다!

 

2. find

C#과 구현이 많이 다르다. iterator를 리턴하며, 못찾으면 end() 를 리턴하는 특징이 있다.

map<int, int>::iterator it = m.find(10000);
if(it != m.end()
{
    // 찾음.
    it->second = 5;
}
else
{
    // 시도했으나 못찾음. C#의 -1과 같은결과.
    m.insert(make_pair(10000, 5);
}

 

3. at

인수 키 값을 찾을 수 없는 경우 함수는 클래스 out_of_range 클래스의 개체를 throw합니다.

operator[] 와 많이 비교된다. 키가 없는 경우 []는 기본객체를 생성해서 반환하고, at은 예외를 던진다. 

myMap.at('a');

 

사이즈 체크

1. size()

요소의 갯수 반환

int size = myMap.size();

 

2. empty()

맵이 비어있는지 확인

bool isEmpty = myMap.empty();

 

기타

1. 이터레이터

맵은 연속 컨테이너가 아니기 때문에 이터레이터에 산술연산 + 는 컴파일 오류가 난다.

이터레이터의 기본 전제인 ++ 연산자는 가능.

 

std::next 함수는 it를 n만큼 증가시킨다.

auto it1 = _map.begin();
auto it2 = ++_map.begin();
auto it3 = std::next(it1, 1); // it2 == it3

 

COMMENT