[C++][STL] map 정리

[C++][STL] map 정리

반응형

Intro

안녕하세요. 오늘은 C++ STL Associative Container 중 하나인 map에 대해 알려드리겠습니다.

목차

1) Map이란?

2) Map 기본 형태

3) Map 정렬

4) Map 사용방법

- 헤더 포함

- map 선언

- search : map에서 데이터 찾기

- insert : map에서 데이터 삽입

- for : 반복문 사용하기(인덱스 기반, 범위 기반)

- delete: map에서 데이터 삭제

- code : 전체 코드

1) Map이란?

map은 각 노드가 key와 value 쌍으로 이루어진 트리입니다. 특히, 중복을 허용하지 않습니다.

따라서 map은 first, second가 있는 pair 객체로 저장되는 데 first- key로 second- value로 저장됩니다.

C++의 map의 내부 구현은 검색, 삽입, 삭제가 O(logn) 인 레드블랙트리로 구성되어 있습니다.

2) MAP 기본 형태

map map1;

3) MAP 정렬

map은 자료를 저장할때 내부에서 자동으로 정렬합니다.

map은 key를 기준으로 정렬하며 오름차순으로 정렬합니다.

만약 내림차순으로 정렬하고 싶은 경우와 같이 사용하면 됩니다.

map map1;

(만약 다른 방법으로 int데이터를 내림차순으로 정렬하고 싶을 경우,

데이터에 -(마이너스)를 붙여 삽입하여 처리하면 내림차순으로 정렬됩니다.)

3) MAP 사용방법

1) 헤더 포함

map을 사용하려면 헤더에 #include 처리를 해야 합니다.

2) map 선언하기

map의 기본 구조는 map 이름입니다.

map m;

3) map에 찾고자 하는 데이터가 있는 지 확인하기(search)

map에서 데이터를 찾을 때는 iterator을 사용합니다.

데이터를 끝까지 찾지 못했을 경우, iterator는 map.end()를 반환합니다.

if (m.find("Alice") != m.end()) { cout << "find" << endl; } else { cout << "not find" << endl; }

4) map에 데이터 삽입

map은 중복을 허용하지 않습니다. insert를 수행할때, key가 중복되면 insert가 수행되지 않습니다.

중복되면 그것은 key의 역할을 제대로 하지 않습니다.

m.insert({"Cam", 300});

5) 반복문 데이터 접근 (first, second)

인덱스 기반 반복문 활용한 예제

: 인덱스 기반은 iterator을 활용하여 begin()부터 end()까지 찾습니다.

//인덱스기반 for (auto iter = m.begin() ; iter != m.end(); iter++) { cout << iter->first << " " << iter->second << endl; } cout << endl;

범위 기반 반복문 활용한 예제

for (auto iter : m) { cout << iter.first << " " << iter.second << endl; }

6) map에서 삭제하기

map에서 데이터를 삭제하기 위해 활용할 함수는 erase와 clear입니다.

1. 특정 위치의 요소 삭제

m.erase(m.begin()+2);

2. key값을 기준으로 요소 삭제

m.erase("Alice");

3. map의 모든 요소 삭제

erase 함수로 모든 요소 삭제하기 (map의 begin부터 end까지)

m.erase(m.begin(), m.end());

clear 함수로 모든 요소 삭제하기

m.clear();

7) map 사용 구문 ( 삽입, 찾기, 반복문 구현 )

#include #include using namespace std; map mapset; int main(void) { mapset.insert({ "Alice", 100 }); mapset.insert({ "Bob", 200 }); if (mapset.find("Alice") != mapset.end()) { cout << "find" << endl; } else { cout << "not find" << endl; } //인덱스기반 for (auto iter = mapset.begin() ; iter != mapset.end(); iter++) { cout << iter->first << " " << iter->second << endl; } cout << endl; //범위기반 for (auto iter : mapset) { cout << iter.first << " " << iter.second << endl; } return 0; }

출처: https://life-with-coding.tistory.com/305 [나다움]

반응형

from http://cho001.tistory.com/192 by ccl(A) rewrite - 2021-09-23 22:00:23