[C++STL] 연관 컨테이너 - multiset

박남호·2022년 12월 8일
0

multiset은 템플릿 형식, 주요 인터페이스, 멤버의 형식이 모두 set과 같지만 key가 중복으로 저장된다는 점이 다르다. 아래는 multiset의 count(), find(), lower_bound(), upper_bound() 멤버 함수 예제이다.

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

int main()
{
	multiset<int> ms;
	ms.insert(50);
	ms.insert(30);
	ms.insert(30);
	ms.insert(30);
	ms.insert(10);
	ms.insert(70);
	ms.insert(90);

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

	cout << "30원소의 개수 :" << ms.count(30) << endl; // 30 원소의 개수

	iter = ms.find(30); // 30 첫 번째 원소의 반복자
	cout << "iter:" << *iter << endl;

	multiset<int>::iterator lower_iter;
	multiset<int>::iterator upper_iter;
	lower_iter = ms.lower_bound(30); //30 순차열의 시작 반복자
	upper_iter = ms.upper_bound(30); //30 순차열의 끝 반복자
	cout << "lower_iter : " << *lower_iter << " , "
		<< "upper_iter : " << *upper_iter << endl;

	for (iter = lower_iter; iter != upper_iter; ++iter) 
	{
		cout << *iter << " ";
	}
	cout << endl;
	return 0;
}

ms.find(30)는 첫 번째 30 원소의 반복자를 반환한다. ms.count(30)은 30 원소의 개수를 반환하며 lower_iter와 upper_iter는 각 시작 반복자와 끝 반복자로 lower_iter는 30의 첫 번째 원소 upper_iter는 30원소의 다음 원소인 50을 가리킨다. for (iter = lower_iter; iter != upper_iter; ++iter) 이렇게 for문을 작성하면 30 원소 3개만 출력이 가능하다.

다음은 equal_range() 예제이다.


#include <iostream>
#include <set>

using namespace std;

int main()
{
	multiset<int> ms;
	ms.insert(50);
	ms.insert(30);
	ms.insert(30);
	ms.insert(50);
	ms.insert(10);
	ms.insert(70);
	ms.insert(90);
	multiset<int>::iterator iter;
	//multiset의 반복자 쌍(pari) 객체 생성
	pair<multiset<int>::iterator, multiset<int>::iterator> iter_pair;
	iter_pair = ms.equal_range(30);
	for (iter = iter_pair.first; iter != iter_pair.second; ++iter)
	{
		cout << *iter << " ";
	}
	cout << endl;
	return 0;
}

equal_range()는 찾은 원소의 시작 반복자와 끝 반복자 쌍을 반환한다. 만약 iter_pair.first와 iter_pair.second가 같다면 찾는 원소가 없는 것이다.

profile
NamoPark

0개의 댓글