반응형

저번 시간은 set 컨테이너에 대해 알아보았다.

set은 key만을 관리하는데 key와 value를 함께 관리할 수 있는 연관 컨테이너가 있다.

바로 map 컨테이너이다. 오늘은 map 컨테이너에 대해 알아보자.


1. map이란?

map은 set과 같은 연관 컨테이너로 노드 기반 컨테이너이다.

map 역시 균형 이진트리(중위순회)로 이루어져 있으며, key와 value의 쌍(pair)인 원소들의 집합으로 이루어져 있다.

여기서 key는 중복이 허용되지 않으며 중복을 허용하기 위해선 multimap을 사용하여야 한다.

 

원소 삽입시(insert) 자동 정렬되며, default 기준 오름차순정렬이다.

 

map을 사용하기 위해선 <map> 헤더파일을 include 해주어야하며,

std::map<[key 데이터타입], [value 데이터타입], [정렬 기준 조건자]> [변수이름]; 형식으로 선언해 사용할 수 있다.

정렬 기준 조건자는 greater<key 데이터타입> 형태로 선언하여 내림차순으로 변경가능하며, 생략 역시 가능하다.

(using namespace std;로 std 생략하여 편하게 작성가능)

 

 

2. map - 생성자

map 생성자는 다음과 같이 사용 가능하다. 아래부터 key는 int, value는 char형이라 가정하고 작성하겠다.

  • map<int, char> m;
    • 빈 map 컨테이너 m을 생성
  • map<int, char, greater<int>> m;
    • key를 내림차순으로 정렬하는 빈 map 컨테이너 m을 생성
  • map<int, char> m2(m);
    • m를 복사한 m2 컨테이너 생성


3. map - 멤버 함수 및 접근 방식

다음은 map 멤버 함수와 접근 방식이다. (map<int, char> m 선언 기준)

 

- 멤버 함수

  • m.begin();
    • m의 맨 처음 원소를 가리키는 반복자 리턴
    • iterator = m.begin();
  • m.end();
    • m의 마지막 원소를 가리키는 반복자 리턴
    • iterator = m.end();
  • m.clear();
    • m의 모든 원소를 제거
  • m.size(), m.max_size();
    • m의 원소 갯수를 반환
    • m의 최대 사이즈 반환
  • m.empty();
    • m이 비어있는지 확인
  • m.count(k);
    • m에서 k(key) 원소의 갯수 반환(중복안되므로 0 or 1)
  • m[k] = v;
    • m에 k(key)에 v(value)값 삽입
    • key 값 존재하는 경우 value 값 갱신, key 없는 경우엔 추가
  • m.insert(p), m.emplace(p);
    • m에 p(pair)라는 객체 추가
    • insert 성공시 true 반환, key 이미 존재하여 실패한 경우는 false 반환
    • emplace로도 추가 가능
  • m.insert(pair(k, v)), m.emplace(pair(k, v));
    • m에 k(key), v(value) 값 삽입
    • insert 성공시 true 반환, key 이미 존재하여 실패한 경우는 false 반환
    • emplace로도 추가 가능
  • m.insert(iterator, k);
    • m에서 iterator가 가리키는 위치부터 k(key)를 삽입할 위치 탐색하여 삽입(균형 이진트리)
  • m.erase(k);
    • m에서 k(key) 값 해당 요소를 찾아 제거
  • m.erase(start, end);
    • m에서 start부터 end 범위 원소 모두 제거
  • m.find(k);
    • m에서 k(key) 값을 찾아 반복자 형태로 반환
    • 못찾은경우 반복자 end 리턴
  • m2.swap(m);
    • m과 m2의 데이터를 바꿈
  • m.upper_bound(k1), m.lower_bound(k2);
    • k1(key)란 원소가 끝나는 구간 반복자
    • k2(key)란 원소가 시작하는 구간 반복자
  • m.equal_range(k);
    • k(key)이란 원소가 시작하는 구간과 끝나느 구간 반복자 pair 객체 반환
  • m.key_comp(), m.value_comp();
    • 정렬 기준 조건자 반환(key기준, value 기준 선택)

- 접근 방식

  • iterator를 통한 접근
    • map<int, char>::iterator mit;
    • mit->first(key), mit->second(value) 형식으로 접근가능
  • index 요소를 통한 접근
    • m[k](value) 형식 접근가능


4. map - 연산자

map의 연산자이다.

  • ==, != 
    • == : 두 map 컨테이너의 모든 원소가 같으면 참, 아니면 거짓
    • != : 두 map 컨테이너에서 하나라도 원소가 다르면 참, 아니면 거짓
  • <, >, <=, >=
    • map 컨테이너간 크기 비교


5. map 구조 및 실습

위에서 설명한 map의 구조는 균형 이진트리로 다음 그림과 같다.



map 컨테이너를 이용하여 실습을 진행해보았다.

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

int main(void) {
	map<int, char> m;
	map<int, char>::iterator mit;
	m.insert(make_pair(3,'k')); //m에 3이란 key와, 'k'란 value 삽입
	m.insert(make_pair(1,'c')); //m에 1이란 key와, 'c'란 value 삽입
	m.insert(make_pair(2,'y')); //m에 2이란 key와, 'y'란 value 삽입

	cout << m[1] << endl; //첫번째 접근 방법

	mit = m.begin();
	cout << mit->first << ":" << mit->second << "\n" << endl; //두번째 접근 방법

	for (mit = m.begin(); mit != m.end(); mit++) {
		cout << mit->first << ":" << mit->second << endl; //모든 원소 key, value 출력
	}

	mit = m.find(3); //3이란 key 탐색
	if (mit != m.end()) { //m.end()가 아니면 출력 (find해서 없으면 m.end()반환하므로)
		cout << "\n 3이란 key를 찾았습니다. value 값은 " << mit->second << "입니다." << endl;
	}
	else {
		cout << "\n 3이란 key를 찾지 못했습니다." << endl;
	}
	return 0;
}

실행결과는 다음과 같다.


여기까지 map 공부를 마친다. 계속해서 stl에 대해 알아가볼 예정이다.

반응형

'Programming > Language' 카테고리의 다른 글

[Assembly] 1부터 10까지의 합 계산  (0) 2020.06.04
[C++] STL - multimap 공부  (0) 2020.05.24
[C++] STL - set 공부  (0) 2020.05.14
[C++] STL - stack 공부  (0) 2020.05.11
[C++] STL - list 공부  (0) 2020.05.07

+ Recent posts