티스토리 뷰
std::multimap
CMap, std::map과 달리 하나의 키가 여러 값을 가리킬 수 있다.
키캆으로 정렬된다. (tree 구조) CString 을 Key 값으로 사용 가능하다.
std::unorderd_multimap : 순서가 부여되지 않은 컨테이너는 Hash table구조로 데이터 추가/삭제/검색 속도가 빠르다. Key 값을 std::string 은 되지만, CString 은 안됨. (별도 해시함수를 만들어야 하나?)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 |
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
typedef int KeyType;
typedef std::pair<const KeyType, std::string> Pair;
typedef std::multimap<KeyType, std::string> MapCode;
void main()
{
MapCode codes;
codes.insert(Pair(415, "SF"));
codes.insert(Pair(510, "OL"));
codes.insert(Pair(718, "BK"));
codes.insert(Pair(718, "SS"));
codes.insert(Pair(415, "SE"));
codes.insert(Pair(510, "BK"));
std::cout << "지역코드가 415 인 도시 수 : " << codes.count(415) << std::endl;
std::cout << "지역코드가 718 인 도시 수 : " << codes.count(415) << std::endl;
std::cout << "지역코드 도시" << std::endl;
MapCode::iterator it;
for (it = codes.begin(); it != codes.end(); ++it)
std::cout << " " << it->first << " " << it->second << std::endl;
std::pair<MapCode::iterator, MapCode::iterator> range = codes.equal_range(718);
std::cout << "지역코드가 718인 도시들 : " << std::endl;
for (it = range.first; it != range.second; ++it)
std::cout << it->second << std::endl;
std::string s;
std::cin >> s;
} |
cs |
실행결과>
삭제>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
struct _struct정보
{
CString str1, str2, str3;
};
typedef std::multimap<CString, _struct정보> MapCode;
MapCode::iterator it;
MapCode codes;
_struct정보 struct정보;
CString strKey = TEXT("하나");
struct정보.str1 = "AAA1"; struct정보.str2 = "BBB1";
struct정보.str3 = "CCC1";
codes.insert(std::make_pair(strKey, struct정보));
struct정보.str1 = "AAA2";
struct정보.str2 = "BBB2";
struct정보.str3 = "CCC2";
codes.insert(std::make_pair(strKey, struct정보));
struct정보.str1 = "AAA3";
struct정보.str2 = "BBB3";
struct정보.str3 = "CCC3";
codes.insert(std::make_pair(strKey, struct정보));
CString str1, str = TEXT("");
str1.Empty();
for (it = codes.begin(); it != codes.end(); ++it)
{
str.Format(TEXT("%s %s\n"), it->first, it->second.str1);
str1 += str;
}
AfxMessageBox(str1);
std::pair<MapCode::iterator, MapCode::iterator> range = codes.equal_range(strKey);
for (it = range.first; it != range.second;) //여기서 it++ 하면 삭제 후 예외발생 함.
{
if (it->second.str1 == TEXT("AAA2"))
it = codes.erase(it);
else
it++;
}
str1.Empty();
for (it = codes.begin(); it != codes.end(); ++it)
{
str.Format(TEXT("%s %s\n"), it->first, it->second.str1);
str1 += str;
}
AfxMessageBox(str1); |
cs |
40행에서 삭제 후>