bdfgdfg

[C++ STL] std::multimap, std::multiset (연관 컨테이너) 본문

게임프로그래밍/STL

[C++ STL] std::multimap, std::multiset (연관 컨테이너)

marmelo12 2022. 1. 30. 23:20
반응형

std::multimap

std::multimap은 연관 컨테이너이며 기본적으로 map과 동일하다. 단 std::map과는 달리 중복키를 허용한다.

std::map에서는 insert를 통해 중복된키에 해당하는 요소를 삽입하면 삽입되지 않으며, operator[]연산자를 이용해도

중복키에 해당하는 요소가 이미 존재한다면 값을 덮어씌운다.

std::multimap은 insert를 할 때 키가 이미 존재해도 중복키를 허용하기에 데이터를 저장한다.

그 외에는 map과 동일하기에 설명할게 없다.

 

먼저 std::multimap을 사용하기 위해서는 <map> 헤더파일을 추가해야 한다.

기본적인 생성 방법

1
2
3
4
// 기본 생성 방식
std::multimap<intint> mMap;
// 복사 생성자 지원
std::multimap<intint> mMap2(mMap);
cs

 

멤버함수도 map과 동일하지만, map은 가능한데 multimap은 안되는 것과 중복키에 해당하는 값을 가져오는것만 설명.

 

1. insert 함수 및 operator[]연산자

1
2
3
4
5
6
// 기본 생성 방식
std::multimap<intint> mMap;
mMap.insert(std::make_pair(1020));
mMap.insert(std::make_pair(1040));
auto iter = mMap.insert(std::make_pair(1060));
std::cout << iter->first << " " << iter->second;
cs

우선 insert함수. multimap에 key와 value의 쌍(pair)의 새요소를 multimap에 삽입한다.

map과 다른점은 map은 insert가 반환하는 것은 키에 해당하는 요소와 성공여부를 알려주는 bool값이 담긴 pair를 반환하지만 multimap은 중복키를 애초에 허용하므로 반환되는 값은 삽입된 요소의 반복자를 반환한다.

또한 위에서 10이라는 key값을 3번 삽입하였는데 multimap 객체의 size를 보면

모두 삽입이 된것을 알 수 있다.

 

그리고 operator []연산. map에서는 가능했지만 multimap에서는 불가능하다.

그 이유는 중복키를 허용하기에 어떠한 key에 해당하는 값(value)을 참조로 반환해야 할지 명확하지가 않으므로.

 

참고로 해당하는 key가 몇개가 중복이 되었는지 알고싶으면 count멤버함수를 사용하면 된다.

 

2. find 함수와 std::equal_range함수

1
2
3
4
5
6
7
// 기본 생성 방식
std::multimap<intint> mMap;
mMap.insert(std::make_pair(1020));
mMap.insert(std::make_pair(1040));
mMap.insert(std::make_pair(1060));
 
auto it = mMap.find(10); // 무엇을 반환?
cs

find함수는 인자로 넘긴 값을 통해 multimap에 해당하는 key값을 찾아 요소를 반환(해당 요소를 가리키는 반복자)한다.

다만 중복키의 경우에는 가장 먼저 찾은(탐색한) 요소의 반복자를 반환한다.

20의 값을 저장하는 요소를 가리키고 있음. 

 

그럼 중복된 key에 해당하는 모든 요소를 가져오려면 어떻게 해야할까.

1
2
3
4
5
6
7
8
//std::pair를 반환
//key에 해당하는 첫번째 요소의 반복자(first)
//key에 해당하는 마지막 요소의 반복자(second)를 반환
auto rangeIter = mMap.equal_range(10);
for (auto iter = rangeIter.first; iter != rangeIter.second; ++iter)
{
    std::cout << iter->first << " " << iter->second << std::endl;
}
cs

equal_range라는 멤버함수를 사용하면 된다.

equal_range는 인자로 넘긴 key값에 해당하는 요소들을 pair로 반환하게 되는데.

pair의 first는 key에 해당하는 첫번째 요소의 반복자를 반환하며 second는 key에 해당하는 마지막 요소의 반복자를 반환.

 

std::multiset

multiset도 마찬가지로 set에서 key(value)값을 하나만 사용하며 중복키를 허용한다.

그 이외에는 모두 multimap과 동일하다.

 

반응형
Comments