본문 바로가기
C++/[루키스] STL

[STL] multimap, multiset

by 묻공러 2024. 3. 21.

multimap과 multiset

map과 set은 key의 중복이 허용되지 않는다

multimap과 multiset은 key의 중복이 허용되고

사용 빈도수가 다소 낮다

 


multimap의 간단한 사용법

map에 사용되는 insert, erase, find 등과 같은

대부분의 기능을 사용할 수 있다

 

다만, [] 문법을 사용할 수 없다

key가 중복되다 보니
어떤 key에 대한 value를 추가하거나 수정할지 

명확하지 않을 수 있어서 막아둔 것이다

 

erase()의 경우는

해당 key를 들고있는 데이터를 모두 삭제하고 삭제된 데이터 개수를 반환한다

 

find()의 경우는

해당 key를 들고 있는 데이터 중 가장 첫 번째인 iterator만 반환한다

#include <iostream>
#include <map>
#include <set>
using namespace std;

void main(void)
{
	multimap<int, int> mm;

	// insert
	mm.insert(make_pair(1, 100));
	mm.insert(make_pair(1, 200));
	mm.insert(make_pair(2, 100));
	mm.insert(make_pair(2, 200));
	mm.insert(make_pair(3, 100));
	mm.insert(make_pair(3, 200));

	// 사용 불가능
	//mm[1] = 300;

	// erase
	size_t count = mm.erase(1);

	// find
	multimap<int, int>::iterator itFind = mm.find(2);
	if (itFind != mm.end())
		mm.erase(itFind);
	
	//// 순회
	//for (multimap<int, int>::iterator it = mm.begin(); it != mm.end(); ++it)
	//{
	//	cout << it->first << " " << it->second << endl;
	//}
}

 

 

multimap의 equal_range()

앞서 find()의 경우는

해당 key를 들고 있는 데이터 중 가장 첫 번째인 iterator만 반환되었다

만약,

해당 key를 들고 있는 모든 데이터를 찾고싶다면

equal_range()를 활용하면 된다

반환 타입은

pair<multimap<int, int>::iterator, multimap<int, int>::iterator> 형태로

first는 해당 key가 포함된 데이터의 시작지점이고

second는 해당 key가 포함된 데이터의 끝의 다음 지점이다

#include <iostream>
#include <map>
#include <set>
using namespace std;

void main(void)
{
	multimap<int, int> mm;

	// insert
	mm.insert(make_pair(1, 100));
	mm.insert(make_pair(1, 200));
	mm.insert(make_pair(2, 100));
	mm.insert(make_pair(2, 200));
	mm.insert(make_pair(3, 100));
	mm.insert(make_pair(3, 200));

	// equal_range
	pair<multimap<int, int>::iterator, multimap<int, int>::iterator> itPair;
	itPair = mm.equal_range(2);

	for (multimap<int, int>::iterator it = itPair.first; it != itPair.second; ++it)
	{
		cout << it->first << " " << it->second << endl;
	}
}

 

 

multimap의 lower_bound(), upper_bound()

lower_bound()는

해당 key를 들고 있는 데이터의 시작지점을 반환하고

upper_bound()는

해당 key를 들고 있는 데이터의 끝의 다음지점을 반환한다

#include <iostream>
#include <map>
#include <set>
using namespace std;

void main(void)
{
	multimap<int, int> mm;

	// insert
	mm.insert(make_pair(1, 100));
	mm.insert(make_pair(1, 200));
	mm.insert(make_pair(2, 100));
	mm.insert(make_pair(2, 200));
	mm.insert(make_pair(3, 100));
	mm.insert(make_pair(3, 200));

	// lower_bound, upper_bound
	multimap<int, int>::iterator itLbound = mm.lower_bound(2);// key가 2인 데이터 시작지점
	multimap<int, int>::iterator itUbound = mm.upper_bound(2);// key가 2인 데이터 마지막의 다음지점

	for (multimap<int, int>::iterator it = itLbound; it != itUbound; ++it)
	{
		cout << it->first << " " << it->second << endl;
	}
}

 

 




multiset의 간단한 사용법

multimap에 사용되는 insert, erase, find 등과 같은

대부분의 기능을 사용할 수 있다

 

erase()의 경우는

해당 key를 들고있는 데이터를 모두 삭제하고 삭제된 데이터 개수 반환한다

 

find()의 경우는

해당 key를 들고 있는 데이터 중 가장 첫 번째인 iterator만 반환한다


multimap에서 사용되는

equal_range(), lower_bound(), upper_bound() 또한 사용 가능하다

#include <iostream>
#include <map>
#include <set>
using namespace std;

void main(void)
{
	multiset<int> ms;

	// insert
	ms.insert(100);
	ms.insert(200);
	ms.insert(200);
	ms.insert(300);
	ms.insert(400);
	ms.insert(500);

	// erase
	size_t count = ms.erase(100);

	// find
	multiset<int>::iterator itFind = ms.find(500);
	if (itFind != ms.end())
		ms.erase(itFind);
	
	// equal_range
	pair<multiset<int>::iterator, multiset<int>::iterator> itPair;
	itPair = ms.equal_range(200);

	for (multiset<int>::iterator it = itPair.first; it != itPair.second; ++it)
	{
		cout << *it << endl;
	}

	// lower_bound, upper_bound
	multiset<int>::iterator itLbound = ms.lower_bound(200);
	multiset<int>::iterator itUbound = ms.upper_bound(200);

	for (multiset<int>::iterator it = itLbound; it != itUbound; ++it)
	{
		cout << *it << endl;
	}

	// 순회
	cout << endl;
	for (multiset<int>::iterator it = ms.begin(); it != ms.end(); ++it)
	{
		cout << *it << endl;
	}
}

 

'C++ > [루키스] STL' 카테고리의 다른 글

[STL] algorithm  (0) 2024.03.22
[STL] 사용 빈도 총정리  (0) 2024.03.22
[STL] set  (0) 2024.03.20
[STL] map  (1) 2024.03.19
[STL] deque  (0) 2024.03.18