(C++) Map 함수 사용방법
25 Oct 2019 | C++ map(C++) Map 함수 사용방법
-
출처: https://kamang-it.tistory.com/entry/mapunorderedmapC%EC%97%90%EC%84%9C-map%EB%94%95%EC%85%94%EB%84%88%EB%A6%ACdictionary-%EC%97%B0%EA%B4%80%EB%B0%B0%EC%97%B4associate-array%ED%95%B4%EC%8B%9C%EB%A7%B5hash-map%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0map%EA%B3%BC-unorderedmap-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%B0%A8%EC%9D%B4%EC%A0%90
- Python 언어에서 편리하게 사용하는 dictionary 데이터 타입의 c++ 버전 사용방법
map
또는unordered_map
을 사용- 여러 종류의 맵 중 가장 많이 사용되는 타입
- 각각 구현되어있는 방법이 다름
map
은 balanced tree 중 red-black 트리로 구현unordered_map
은 hash table로 구현(해시 맵)
Map 을 이용한 구현
#pragma warning(disable:4996)
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> m;
//입력하기
cout << "insert\n";
m.insert(pair<string, int>("marin", 40)); //입력형식 1
m.insert(make_pair("scv", 60)); //입력형식 2
m["firebat"] = 50; //입력형식 3 -> (요즘 방식)
// insert 시 기존의 값이 존재하면 덮어쓰게 된다.
//출력하기
cout << "iterate\n";
//출력방식 1 (옛날 방식)
map<string, int>::iterator iters; // iterator 정의하기
for (iters = m.begin(); iters != m.end(); iters++)
{//iterator가 시작부터 끝까지
cout << iters->first << " " << iters->second << endl;
}
//출력방식 2 (요즘 방식)
for (pair<string, int> atom : m)
{
cout << atom.first << " " << atom.second << endl;
}
//참조하기
cout << "find\n";
cout << m.find("scv")->first << " " << m.find("scv")->second << endl;
cout << "scv" << " " << m["scv"] << endl; // 요즘 방식
//지우기
cout << "erase\n";
m.erase("scv"); //지우기 1 (요즘 방식)
m.erase(m.find("marin")); //지우기 2
for (pair<string, int>atom : m)
{
cout << atom.first << " " << atom.second << endl;
}
//크기
cout << "size\n";
cout << m.size() << endl;
//비었는지
cout << "empty\n";
cout << m.empty() << endl;
std::system("pause");
return 0;
}
Unordered_map
- 위의 방식과 모두 동일하며,
map
을unordered_map
으로 대체하면 된다. - 사용 방법은 map과 완벽히 동일함
Map과 unordered_map의 차이점
- 사용방식은 완벽히 동일하므로 아무거나 사용하면 된다.
- 특히 데이터 량이 적은 경우 더 차이가 나지 않는다.
- 단, unordered_map은 해시 테이블로 구현되어 있기 때문에 데이터가 적은 일반적인 경우 더 좋은 성능을 낸다.
- 하지만 데이터 량이 많아질 경우 해시 테이블의 성능은 급격하게 떨어진다.
- Balanced tree를 사용하는
map
은 균형을 맞춰야 하지만 - 해시 테이블은 값이 많아지면 필연적으로 발생하는 해쉬충돌로 인해 성능이 떨어짐
- Balanced tree를 사용하는
- 따라서 데이터 량에 따라 많다면
map
을, 적다면unordered_map
을 사용하는것이 유리