2021. 6. 30. 01:40ㆍC++
맵(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의 방식이랑은 조금 다르다.
맵의 장점?
std::list나 std::vector보다 탐색 속도가 빠르다. //둘은 O(N) 맵은 O(log N)
맵의 단점
자동으로 정렬 //장점이자 단점..
해쉬맵이 아니다 = O(1)이 아니다.
C++11에서 해결책이 있다
셋은 맵과 거의 같다!!
1.정렬되는 컨테이너
2.중복되지 않는 키를 요소로 저장 //맵은 키-값 셋은 키만 들어감
3.이진 탐색 트리 기반 (오름차순)
맵과 장단점이 같다.