C++ 14일차

2021. 6. 30. 01:40C++

맵(Map)이란?

키를 이용하여 내용을 찾는 방식

키와 값이 쌍으로 저장

키는 중복이 될 수 없다

C++ 맵은 자동 정렬되는 컨테이너다.(키 기준)

이진 탐색 트리 기반(오름차순)

 

ex)std::map<std::string, int> simpleScoreMap <-기본적인 맵 사용 방식

앞에 있는 string이 키(Key)며 뒤의 int가 값(value)이다.

 

위는 맵의 생성 아래는 맵의 복사생성자 형식이다.

std::pair<key,value>

두 데이터를 한 단위로 저장한다!

 

데이터를 쌍으로 넣기위해

ex) simpleScoreMap.insert(std::pair<std::string,int>("Mocha",100));

 

insert는 새 요소를 map에 삽입한다.

반복자와 bool 값을 한 쌍으로 변환

반복자는 요소를 가리키며 Bool값은 삽입 결과를 알려준다

키는 중복 삽입이 불가능한다!!(insert는 새 요소라 키 겹치면 사용 불가능)

 

operator[]

Key에 대응하는 값을 참조로 반환

map에 키가 없으면 새 요소 삽입

map에 키가 있으면 값을 덮어씀

 

요소 찾기

std::map<std::string, int>::iterator it = simpleScoreMap.find("Mocha");

반복자 it를 선언하여 simpleScoreMap에서 Mocha키를 find한 후 it는 Mocha키를 가리킨다

만약 끝까지 없으면? if(it!=simpleScoreMap.end())를 이용하여 없는 것을 확인

 

find란??? iteraotor find(const Key& key);

map에서 key를 찾으면 그에 대응하는값을 가리키는 반복자 반환

못 찾으면 end() 반환

 

void swap(map& other) //비싼 연산X

두 map의 키와 값을 서로 맞바꿈

 

void clear();

map을 비운다

 

void erase(iterator position); //반복자를 넣어 제거할 수 있지만, Key를 넣어도 가능하다

map의 요소들을 제거

 

STL 맵에 pair로 내가 생성한 클래스가 들어가는가??

정답은 아니다에 가깝다. 왜 들어가지 않냐?

STL 맵에서는 항상 정렬이 되는데 정렬이 되는건 데이터 비교가 있는 것이고

=>내가 생성한 클래스는 비교할 수가 없기때문이다.

그러면? Operator<()를 이요하여 두 키를 비교하는 함수를 작성해야한다!!

Operator<()의 위치는 클래스 안에 넣어줘야한다!!

맵에서 요소들을 정렬하는 또 다른 방법??

map을 만들 때 비교함수인 comparer를 넣을 수 있다. //다만 oop의 방식이랑은 조금 다르다.

위의 operator<방식이 더 좋지만 위 방식을 사용못하는 경우 사용!!ex)남의 구조체      가능하면 studentInfo를 바꾸는게 베스트!

맵의 장점?

std::list나 std::vector보다 탐색 속도가 빠르다. //둘은 O(N) 맵은 O(log N)

맵의 단점

자동으로 정렬 //장점이자 단점..

해쉬맵이 아니다 = O(1)이 아니다.

C++11에서 해결책이 있다

 

셋은 맵과 거의 같다!!

1.정렬되는 컨테이너

2.중복되지 않는 키를 요소로 저장 //맵은 키-값 셋은 키만 들어감

3.이진 탐색 트리 기반 (오름차순)

 

맵과 장단점이 같다.

'C++' 카테고리의 다른 글

C++ 탬플릿 프로그래밍  (0) 2021.12.22
C++ 15일차  (0) 2021.07.01
C++ 13일차  (0) 2021.06.28
C++ 12일차  (0) 2021.06.27
C++ 11일차  (0) 2021.06.23