[C++ / 자료구조] Map과 Unordered Map

오늘 날씨는 야옹·2024년 1월 27일

자료구조

목록 보기
5/11

Map

Balanced tree(균형 트리)로 구현되면, 그중 red-black tree로 구현되어 있다.
중복을 허용하지 않고, key를 기준으로 자동으로 오름차순 정렬된다.

선언 방법

#include <map>

map<string, int> m;

Insert 방법

1) m.insert(pair<string, int>("marin", 40));
2) m.insert(make_pair("scv", 60));
3) m["firebat"] = 50;

보통 3번 방식을 많이 쓴다고 한다.
또한 2와 3을 쓰려면 iostream을 include해야 한다고 한다.
그리고... 기존 키에 값이 존재한다면, 이를 그냥 덮어쓴다!

순회 방법

반복 호출 방법에는 여러 가지가 있다.

map<string, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
{
	cout << it->first << ' ' << it->second << '\n';
}

iterator를 활용한 방법! 화살표 연산을 해 줘야 함.

for(pair<string, int> atom : m)
{
	cout << atom.first << ' ' << atom.second << '\n';
}

이런 방법도 있고...

for (auto& kv : m)
{
	cout << kv.first << ' ' << kv.second << '\n';
}

auto를 쓰는 방법도 있고......

#include <algorithm>

void TempFunction(std::pair<string, int> pair)
{
	cout << pair.first << ' ' << pair.second << '\n';
}

for_each(m.begin(), m.end(), TempFunction);

이게 좀 많이 혁명이었지만
TempFunction처럼, map을 매개변수로 받는 함수만 가능한 듯

원소 참조 방법

find 함수를 통한 방법도 있고, 직접 배열처럼 접근 방법도 있다.

	cout << m.find("a")->first << ' '
    << m.find("a")->second << '\n';

find의 결과는 iterator다. 따라서 화살표 연산 꼭 필요!

cout << "temp" << ' ' << m["temp"] << '\n';

원소 삭제 방법

이것도 두 가지 방법이 있는데

m.erase("a");

보통 이렇게 erase 함수를 이용하여 지우지만

m.erase(m.find("temp"));

가끔 iterator를 사용해야 한다면, 이렇게 지우는 듯.


Unordered Map

map과 사용하는 방법이 동일하다.
다만 map은 red-black tree로 구현되어 있고
unordered_map은 해시 테이블로 구현되어 있다
때문에 성능이 보통 좋지만... 데이터가 많으면 많을수록 hash table의 기능은 리드미컬하게 떨어진다고 한다. (비둘기 집의 원리? 해시 충돌 때문인 듯)

결론적으로, 데이터가 작다면 unordered_map이, 크다면 map이 유리하다고 한다.


참고

0개의 댓글