[STL] C++ map, multimap, unordered_map





결과

map 내림차순 결과






코드

#include <iostream>
#include <string>

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

int main() {
	
	// map<int, string> m;	// 오름차순
	map<int, string, greater<int>> m;	// 내림차순
	// multimap<int, string> m;	// 중복 key 가능

	// unordered_map<int, string> m;	// 정렬 x


	m.insert(make_pair(4, "d") );
	m.insert(make_pair(1, "a"));
	m.insert(make_pair(3, "c"));
	m.insert(make_pair(2, "b"));
	m.insert(make_pair(3, "c"));
	
	cout << "개수 : " << m.size() << "\n";
	
	// 3 키를 갖는 원소가 존재하면 해당 값 수정
	if(m.find(3) != m.end() ) m.at(3) = "w";

	m.erase(2);	// key 값

	for (auto i = m.begin(); i != m.end(); i++) {
		cout << i->first << " " << i->second << "\n";
	}
	cout << "\n";


	return 0;
}






1. map


map<int, string> m;	// 오름차순

- <키, 값> 의 구조를 갖는다.

ㄴ 여기서 키는 집합처럼 중복된 key는 갖을 수 없다.



- 해당 키가 이미 존재할 때, 값을 변경하도록 처리하기 위해서는 따로 검사하여 처리해주어야 한다. ( 글 하단에서 설명 )



- 자동으로 오름차순으로 정렬한다.


ㄴ 내림차순으로 정렬하기 위해서는 아래처럼 선언을 해준다.

map<int, string, greater<int>> m;	// 내림차순






2. multimap


multimap<int, string> m;	// 중복 key 가능

- map 라이브러리의 포함되어 있다.


- 기존의 map과는 다르게 동일한 Key를 갖을 수 있다.


- erase() 함수를 사용하여 삭제 시 값을 인수로 준다면 전부 지우지만

하나 씩 지우기 위해서는 find() 함수를 추가적으로 사용하여 삭제하여야 한다.


- at() 함수를 사용하여서 값을 변경할 수 없다.






3. unordered_map


unordered_map<int, string> m;	// 정렬 x

- 기존의 map과 동일하지만 정렬을 하지 않는다.



- 사용하기 위해서는 #include <unordered_map> 해주어야 한다.











insert(make_pair(E key, E value)) : 삽입

- pair을 생성한 후 <키,값> 을 삽입한다.


- 만약 키가 이미 존재할 경우 second의 false를 리턴한다.




erase(E key) 또는 erase(map<E>::iterator) : 삭제

- 키를 넣으면 삭제할 수 있다.


- 혹은 iterator을 인수로 주어서 삭제할 수도 있다.

ㄴ multimap일 경우 중복 값이 가능하므로 

키를 넣어 삭제 시 해당 값이 모두 삭제되지만

find를 사용하여 iterator을 인수로 주면 하나씩 삭제가 가능하다.





find(E e) : 탐색

- 존재하지 않는 값이면 map.end()를 리턴한다.

( end의 iterator )





at(E Key) = "수정할 값" : 수정


- 만약 삽입 시 이미 키가 존재할 경우 값을 변경해 주고 싶다면 해당 예처럼 하면 된다.

if( m.insert(make_pair(3, "w")).second == false ) m.at(3) = "w";

ㄴ 삽입 시 이미 키가 존재하므로 second의 false를 갖는다.

그러면 at() 함수를 사용하여 해당 값을 변경해주면 된다.






+ Recent posts