만일, 이미 원소가 존재하고 있는데insert를 하였으면 무시가 되었지요. 하지만 멀티셋과 멀티맵은 중복된 원소를 허락합니다.
멀티셋(multiset)과 멀티맵(multimap)
#include<iostream>
#include<set>
#include<string>
usingnamespacestd;
template <typenameK>
voidprint_set(constmultiset<K>&s) {
// 셋의 모든 원소들을 출력하기
for (constauto& elem : s) {
cout << elem << endl;
}
}
intmain() {
multiset<string> s;
s.insert("a");
s.insert("b");
s.insert("a");
s.insert("c");
s.insert("d");
s.insert("c");
print_set(s);
}
다음은 멀티맵입니다.
#include<iostream>
#include<map>
#include<string>
usingnamespacestd;
template <typenameK, typenameV>
voidprint_map(constmultimap<K, V>&m) {
// 맵의 모든 원소들을 출력하기
for (constauto& kv : m) {
cout << kv.first << " " << kv.second << endl;
}
}
intmain() {
multimap<int, string> m;
m.insert(make_pair(1, "hello"));
m.insert(make_pair(1, "hi"));
m.insert(make_pair(1, "ahihi"));
m.insert(make_pair(2, "bye"));
m.insert(make_pair(2, "baba"));
print_map(m);
// 뭐가 나올까요?
cout<<"--------------------"<<endl;
cout<<m.find(1)->second<<endl;
}
일단 맵 과는 다르게, 한 개의 키에 여러개의 값이 대응될 수 있다는 것은 알 수 있습니다. 하지만 이 때문에[]연산자를 멀티맵의 경우 사용할 수 없습니다.
왜냐하면 예를 들어서
m[1]
을 했을 때 "hello" 를 리턴해야할지, 아니면 "hi" 를 리턴해야 할 지 알 수 없기 때문이지요. 따라서 멀티맵의 경우 아예[]연산자를 제공하지 않습니다.
위 처럼find함수를 사용했을 때 무엇을 리턴할까요? 일단 해당하는 키가 없으면m.end()를 리턴합니다. 그렇다면 위 경우 1 이라는 키에 3 개의 문자열이 대응되어 있는데 어떤거를 리턴해야 할까요? 제일 먼저insert한것? 아니면 문자열 중에서 사전 순으로 가장 먼저 오는 것?
사실 C++ 표준을 읽어보면 무엇을 리턴하라고 정해놓지 않았습니다. 즉, 해당되는 값들 중 아무 거나 리턴해도 상관 없다는 뜻입니다. 위 경우hello가 나왔지만, 다른 라이브러리를 쓰는 경우hi가 나올 수 도 있고,ahihi가 나올 수 도 있습니다.
그렇다면 1 에 대응되는 값들이 뭐가 있는지 어떻게 알까요? 이를 위해 멀티맵은 다음과 같은 함수를 제공하고 있습니다.