티스토리 뷰

프로그래밍/C++

std::multimap

에어버스 2019. 5. 4. 13:59

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행에서 삭제 후>

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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