본문 바로가기

STUDY/C++

std::map에 관한 고찰

오늘은 map에 관하여 포스팅을 해 보려고 합니다.

 

std::map은 key와 value가 pair 형태로 저장되며, 주로 key를 사용하여 value를 빠르게 탐색하기 위해 자주 쓰이는 컨테이너입니다.

 

map노드기반 균형이진트리 구조로 삽입시 자동으로 정렬이 됩니다. 

 

map 사용방법은 아래처럼 간단합니다. 

 

 

 

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main(void)
{
	map<int, string> _testMap;

	_testMap.insert(make_pair(1, "data1"));
	_testMap.insert(make_pair(2, "data2"));
	_testMap.insert(make_pair(3, "data3"));
	_testMap.insert(make_pair(4, "data4"));
	_testMap.insert(make_pair(5, "data5"));
	_testMap.insert(make_pair(6, "data6"));


	cout << "-------------data------------" << endl;
	for (map<int, string>::iterator itor = _testMap.begin(); itor != _testMap.end(); ++itor)
	{
		cout << "[  key : " << itor->first << ", data : " << itor->second << "  ]"<< endl;
	}

}

 

< 결과창 >

 

-------------data------------
[  key : 1, data : data1  ]
[  key : 2, data : data2  ]
[  key : 3, data : data3  ]
[  key : 4, data : data4  ]
[  key : 5, data : data5  ]
[  key : 6, data : data6  ]

 

map 은 연산자 operator[]를 사용할 수 있고, 사용법은 

map[ key ] = value 

value = map[ key ]

와 같이 사용할 수 있습니다.

 

아래참조

 

 

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main(void)
{
	map<int, string> _testMap;

	_testMap[0] = "data 0";
	_testMap[1] = "data 1";
	_testMap[2] = "data 2";
	_testMap[3] = "data 3";
	_testMap[4] = "data 4";
	_testMap[5] = "data 5";



	for (int i = 0 ; i < _testMap.size() ; ++i)
	{
		cout << "[  " << _testMap[i] << "  ]" << endl;
	}
}

 

하지만 map의 연산자[]는 배열이나 vector의 연산자[]와는 다르게 아직 생성되지 않은 key의 operator[]에 접근하더라도 예외가 발생하지 않습니다. 

 

아래 코드의 경우 vector로 만들어졌다면, 출력하는 부분에서 생성되지 않은 index에 접근한 것에 대한 exception이 발생할 것입니다.

하지만 map의 경우 아래와 같이 새 key가 생성되는 것에 주의하여야 합니다.

 

 

 

int main(void)
{
	map<int, string> _testMap;

	_testMap[0] = "data 0";
	_testMap[1] = "data 1";
	_testMap[2] = "data 2";


	cout << "[  " << _testMap[7] << "  ]" << endl;
    
}

 

 

map의 사이즈 (아무것도 없는것)

x64에서 24

x86에서 12 

포인터 3개를 가지고 있습니다.

 

vector의 사이즈

x64에서 32

x86에서 16

포인터 4개를 가지고 있습니다.