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 (0) | 2024.03.19 |
[STL] deque (0) | 2024.03.18 |