벡터에 이어서 맵에 대한 사용법을 찾아보고자 한다.
기본적으로 맵(Map) 은 자동적으로 정렬이 이루어져 있어야 유리한 무언가 + 값이 두개가 들어가는 경우
예를 들면 어떤 물건들을 관리하는데 그 물건의 번호와 가격을 저장하여 관리하고싶은데, 물건 번호를 정렬해서 유지하고싶다면 이런 경우가 맵을 사용하기 굉장히 적절한경우이다.
Map 은 두가지로 이루어져 있다. Key 와 Value 인데 Key 값으로 정렬이 된다. 중요한 점은 Key 값은 중복을 허용하지 않는다 !
만약 중복되는 Key 값을 사용하고 싶다면 Multimap 을 사용하여야 하지만 여기선 그냥 넘어가자. 왜냐하면 내가 잘 몰라
Map의 선언
Map 은 두가지 값을 선언해야하므로 그 선언되는 타입도 두가지이다.
map< KeyType, ValueType > 변수이름 ; 이렇게 선언하는데 이제 첫번째 데이터 타입이 Key 두번째가 Value 를 따르게 된다.
Key값을 기준으로 정렬이되니 신중하게 하여야 한다.
Map 의 사용 ( 입력 )
Map 은 한번에 두개의 값을 입력해야한다. 그래서 사용하는 방법이 두가지 있다.
1. insert
map.insert( pair <KeyType, ValutType >( KeyValue, Value ) ) ;
insert 를 통해서 값의 쌍을 넘겨주어야 하는데 따로 struct 를 만들필요 없이 pair 을 통해 값의 쌍을 묶어서 만든다음에 map 에 넘기는 방식
2. map[Key] = Value ;
굉장히 간편하다고도 볼수 있는 방법으로
map [ KeyValue ] = Value 로 선언하면 자동으로 인자가 추가가 된다.
Map의 사용 ( 탐색 )
Map 의 장점은 여러가지가 있지만 대표적인 장점으로는 Key 값으로 자동 정렬이 된다는 점과, 이 Key 를 통해 인자에 접근이 가능하다는 것이다.
1. Iterator 사용
앞서 벡터와 마찬가지로 map 또한 iterator 을 통해 접근이 가능하다. 다른점이라면 값이 두개이기때문에 " Iterator -> " 를 통해서 둘중 어떤 값을 사용할것인지 명시해줘야 한다는 것이다. begin 과 end 는 벡터와 동일하게 사용 가능하므로 앞선 글을 한번더 보면 좀더 도움이 될것이다.
for( auto a = map.begin() ; a != map.end() ; a++ ) 이게 가능하다는 뜻
구글링이 사실 제일 좋다
2. 인덱스를 통한 접근
Key 값이 뭐가 들어있는지 알고있다면 이를 인덱스처럼 사용하여 접근이 가능하다, 인덱스가 굳이 숫자가 아니어도 가능하다 ! 이는 굉장한 메리트이다.
예시로 과거 문제해결기법 이라는 것에서 다른 친구들이 배열 2,3개를 이요해서 알파벳과 랜덤 숫자를 매칭시켜주고있는데 난 그저 map 으로 선언을 하고, 알파벳 자체를, 인덱스로 해서 접근이가능했다. 근데 수행시간은 내가더 걸렷다 헿
만약 3 이라는 Key 를 가지고 있는 인자가 있는 것을 알고 있다면 Map[3] 이라고 하면 그 Value 값을 볼수 있게 된다.
Map의 사용 ( 제거와 업데이트 )
1. 업데이트
만약 이미 Key값이 존재하는 어떤 인자의 값을 바꾸고 싶다면 간단하다! insert 할때처럼
map [ Key ] = UpdateValue 하면 그냥 덮어 쓴다! 끝 !
2. 제거
제거또한 Key 값을 이용하여 쉽게 접근할수 있다. map . erase ( Key ) 자 삭제가 완료되었다 쉽다.
Map의 사용 ( 예제 )
#include <map>
#include <iostream>
using namespace std;
int main(){
map< char, int > mm ;
map< char, int >::iterator mm_iter ;
mm['C'] = 70 ;
mm['A'] = 100 ;
mm['B'] = 50 ;
for( mm_iter = mm.begin() ; mm_iter != mm.end() ; mm_iter++ ){
cout << mm_iter->first << " " << mm_iter->second << endl;
}
return 0;
}
결과값
A 100
B 50
C 70
-> 자동으로 정렬이 되어서 저장되어 있는 것을 알수 있다. Iterator 을 -> 사용해서 저장된 값에 접근한다.
여기서 mm['B'] = 600 ;
을 추가하고 다시 출력하면 B 는 600 과 짝지어서 출력되는걸 볼수 있다.