반응형

  map 컨테이너는 연관 컨테이너 중 자주 사용하는 컨테이너로 원소를 key와 value의 쌍으로 저장합니다. 

 

map은 원소로 key와 value의 쌍(pair객체)을 저장합니다.

원소의 key는 컨테이너에 중복 저장될 수 없으며

중복 key를 저장해야 한다면

multimap을 사용해야 합니다.

 

  map은 힙 상태로 트리를 유지하면서, 각 노드에 값을 저장할 수 있는 구조로 이루어져 있다. vector나 deque는 value 값만 저장하지만, map은 달리 key와 value를 사용한다. 트리의 각 노드를 구분하는데 사용되는 것이 key이며, 노드에 저장되는 값이 value가 된다. 따라서 key와 value에 적절한 데이터형을 설정해주어야 한다.

  map은 키의 중복을 허용하지 않는 일반 map과 키의 중복을 허용하는 multimap을 지원한다. multimap은 중복된 키를 갖기 때문에 유일한 키에 값을 저장하는 기능이 지원되지 않는다. 그러나, map의 경우는 유일한 키에 값을 저장할 수 있는 기능을 지원한다.

map과 set은 매우 비슷하다. 주된 차이는 set은 단순 연관 컨테이너(즉, 값 형식이 키 형식과 같다.) 하지만 map은 쌍 연관 컨테이너(즉 값 형식은 그 키 형식과 그에 관련된 자료가 함께 있는 형태이다.)

map은 <map>을 #include 해야 사용할 수 있다.

일단 값을 새로 삽입하고 값을 변경하는 간단한 코드를 살펴보자.

[ map 실습 예제 1]

#include <stdio.h>
#include <map>
using namespace std;
int main()
{
	map<int, int> a;

	a[9] = 10;
	a[500] = 20;
	a[10000] = 56;
	a[1] = 100;
	a[1] = 200;
	a[1000000] = 999;

	printf("size -> %d\n", a.size());

	std::map<int, int>::iterator pos;
	for(pos=a.begin();pos != a.end();++pos)
         printf("%d %d\n", pos->first, pos->second);

	pos = a.find(1);
	if(pos == a.end())
		printf("Not Found\n");
	else
		printf("%d %d\n", pos->first, pos->second);

	pos = a.find(2);
	if(pos == a.end())
		printf("Not Found\n");
	else
		printf("%d %d\n", pos->first, pos->second);

	pos = a.find(9);
	a.erase(pos);
	for(pos=a.begin();pos != a.end();++pos)
         printf("%d %d\n", pos->first, pos->second);

	printf("size -> %d\n", a.size());
	a.clear();
	return 0;
}

※ map에 무작정 키를 삽입하기 보다 이미 있는 경우 삽입하지 않으려면 find 함수를 사용할 수 있다.

 

[ map 실습 예제 2]

다음과 입력 예제와 같이 문자열을 key값으로 하는 입력 데이터를 map을 이용해서 프로그래밍 해보자.

입력데이터

6 9

Seoul Daejon 200

Daejon Daegu 150

Seoul Daejon 50

Kwangju Seoul 300

Kwnagju Daejon 100

Kangleung Seoul 150

Kangleung Daegu 250

Daegu kwangji 200

Puswan kwangleung 350

 

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

map <string, int> city;
int cnt;

int getcity(string &t)
{
	if(city.find(t) == city.end()) city[t]=cnt++;

	return city[t];
}

int main()
{
	ifstream in("input.txt");
	ofstream out("output.txt");

	int n, m, i, j, k, ia, ib;
	int w[10][10];
	string a, b;

	in >> n >> m;
	for(i=0;i<m;i++)
	{
		in >> a >> b >> k;
		
		ia = getcity(a);
		ib = getcity(b);

		w[ia][ib] = w[ib][ia] = k;
	}

	fcloseall();
	return 0;
}
반응형
Posted by 명문코딩컴퓨터
,