-

[C++ 코딩스킬] map, set 컨테이너 본문

7. 코딩 스킬

[C++ 코딩스킬] map, set 컨테이너

asdklfjlasdlfkj 2020. 2. 6. 21:16

C++을 활용해 삼성 SW 역량테스트 문제를 풀어보면 map이나 set은 그다지 필요가 없다.

다만 프로그래머스의 다양한 문제들을 다른 회사 대비용으로 풀다보면서 이 컨테이너들을 가끔 접하게 됐다.

사용이 미숙해 이번 기회에 자주 쓰이는 함수들을 정리해보았다.

 

아래의 실행 화면과 써둔 해당 라인을 같이 보면 이해가 쉽다.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <map>
#include <set>
#include <iostream>
#include <string>
using namespace std;
 
int main(){
    map<stringint> m;
    set<pair<stringint> > s;
 
    cout << "[중요] map은 기본적으로 key, value의 개념이기 때문에 선언시 내부에 pair를 안쓴다.\n       반면, set은 키,값의 개념이 아니기 때문에 사용해야 한다.\n\n";
    cout << "*** map 기본 사용 (insert, erase, find, 바로 값 넣기). key 기준으로 오름차순 정렬된다. ***\n\n";
 
    cout << "1-1. [map의 insert 함수] => \"map.insert(요소전체)\"\n     m.insert(요소전체) 또는 그 키가 없어도 m[key] = value 또는 m[key]++ (결과 1) 로 바로 삽입도 가능하다.\n\n";
    m.insert(make_pair("HI"777)); // 명시적으로 키 "HI", value 777이 들어감.
    m["BIII"= 10// 없는 키라도 이렇게 하면 10이 들어감.
    m["AAA"]++// 없는 키라도 이렇게 하면 AAA, 1이 들어감.
 
    cout << "key가 AAA인 요소만 값을 99999999로 변경하고 나머지 요소(BIII, 10과 HI, 777)들 출력\n-->\n";
    map<stringint>::iterator it;
    for (it = m.begin(); it != m.end(); it++){ // vector, queue, deque와 다르게 iterator로만 순회가 가능
        if (!it->first.compare("AAA")){ // it는 포인터이기 때문에 -> 사용. 키가 "AAA"인 것을 찾으면 그 value를 변화하는 코드.
            it->second = 99999999;
            cout << it->first << " " << it->second << '\n'// 변화 확인.
            continue;
        }
        cout << it->first << " " << (it->second) << '\n'// 나머지 출력도 동일하게.
    }
    cout << '\n';
 
    cout << "1-2. [map의 find 함수] => \"map.find(키)\"\n     ";
    cout << "m.find(\"BIII\")->first << \" \" << m.find(\"BIII\")->second 출력 결과는\n\n-->\n";
    cout << m.find("BIII")->first << " " << m.find("BIII")->second << "\n\n\n"// map 컨테이너의 find 함수는 key를 기준으로 찾는다. 반환은 map iterator 포인터형.
 
    cout << "1-3. [map의 erase 함수] => \"map.erase(키)\"\n     m.erase(\"BIII\")의 결과후 모두 출력하면?\n-->\n";
    m.erase("BIII"); // map 컨테이너의 erase 함수는 key를 기준으로 찾는다.
    // BIII키를 지운 결과 출력 -> HI, AAA 키만 출력함.
    for (it = m.begin(); it != m.end(); it++){
        if (!it->first.compare("AAA")){
            it->second = 99999999;
            cout << it->first << " " << it->second << '\n';
            continue;
        }
        cout << it->first << " " << (it->second) << '\n';
    }
 
 
 
    cout << "\n\n\n*** set 기본 사용 (insert, erase, find). 이 역시 오름차순 정렬된다. ***";
 
    s.insert(make_pair("Z"3));
    s.insert(make_pair("B"3));
    s.insert(make_pair("A"3));
 
    s.insert(make_pair("H"3));
 
    s.insert(make_pair("HI"3));
    s.insert(make_pair("HI"3)); // 저장 x
 
    s.insert(make_pair("HI"4));
 
    s.insert(make_pair("HI"5));
 
    cout << "\n\n2-1. [set의 insert 함수] => \"set.insert(요소전체)\"\n또한 iterator로 순회하면서 포인터로 출력할 수 있다.\n";
    cout << "set 전체 출력!!\n\n";
    for (set<pair<stringint> >::iterator it = s.begin(); it != s.end(); it++){
        cout << it->first << " " << it->second << '\n';
    }
 
    cout << "\n2-2. [set의 find 함수] => \"set.find(요소전체)\"\nkey로 iterator를 찾았다면, set은 요소 전체를 갖고 찾는다.\n";
    cout << "만약 못찾을 시 s.end()를 반환한다.\n";
    cout << "(\"HI\", 4)를 찾아서 지워보자\n";
    if (s.find(make_pair("HI"4)) != s.end()){
        cout << "--> s.end()아닌 포인터 반환! (\"HI\", 4)가 있다! 출력하면.. ";
        cout << s.find(make_pair("HI"4))->first << " " << s.find(make_pair("HI"4))->second << '\n';
    }
 
    cout << "\n2-3. [set의 erase함수] => \"set.erase(요소전체)\"\n\"HI\", 77인 요소를 삭제하면 없으므로 아무 변화도 없고, \n\"HI\", 4인 요소를 삭제하면 있으므로 삭제된다.\n\n";
    s.erase(make_pair("HI"77));
    s.erase(make_pair("HI"4));
 
    cout << "\"HI\", 4인 요소를 찾아 제거했으므로 find로 정말 지워졌는지 확인해보자.\n";
    cout << "지워졌다면 find로 찾았을 때 s.end()가 리턴될 것이다.\n";
    if (s.find(make_pair("HI"4)) != s.end()){
        cout << "--> s.end()가 아닌 포인터 리턴! 지워지지 않았습니다.\n";
    }
    else{
        cout << "--> s.end() 리턴! 지워졌습니다.\n\n\n";
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

아래의 실행화면과 함께 보자 (map은 45줄까지, set은 그 이후부터)

 

1. map 컨테이너

C++ STL map 컨테이너의 사용 예시. <key, value>형태의 요소를 저장하는 컨테이너로 '매핑'이 필요한 경우 사용하면 편리할 자료구조다. insert는 모든 요소를 사용하며, erase, find는 key만 사용한다. for 순환은 iterator를 사용해야 한다.

 

2. set 컨테이너

C++ STL set 컨테이너의 사용 예시. 저장하는 요소가 유일한 '집합'형태의 컨테이너로 유일한 자료를 저장해야 할 자료구조에 사용하면 편리하다. insert, find, erase 모두 모든요소를 사용해서 식별해야 한다. for 순환은 역시 iterator로 사용해야 한다.

 


Comments