(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

  • 위의 방식과 모두 동일하며, mapunordered_map으로 대체하면 된다.
  • 사용 방법은 map과 완벽히 동일함

Map과 unordered_map의 차이점

  • 사용방식은 완벽히 동일하므로 아무거나 사용하면 된다.
  • 특히 데이터 량이 적은 경우 더 차이가 나지 않는다.
  • 단, unordered_map은 해시 테이블로 구현되어 있기 때문에 데이터가 적은 일반적인 경우 더 좋은 성능을 낸다.
  • 하지만 데이터 량이 많아질 경우 해시 테이블의 성능은 급격하게 떨어진다.
    • Balanced tree를 사용하는 map은 균형을 맞춰야 하지만
    • 해시 테이블은 값이 많아지면 필연적으로 발생하는 해쉬충돌로 인해 성능이 떨어짐
  • 따라서 데이터 량에 따라 많다면 map을, 적다면 unordered_map을 사용하는것이 유리