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가 같다면 찾는 원소가 없는 것이다.