묻공러
[STL] multimap, multiset
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (487)
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 (124)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
      • 유니티 (1)
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
C++/[루키스] STL

[STL] multimap, multiset

2024. 3. 21. 13:02

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
'C++/[루키스] STL' 카테고리의 다른 글
  • [STL] algorithm
  • [STL] 사용 빈도 총정리
  • [STL] set
  • [STL] map
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.