본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 21: STL 맵과 셋

by cogito21_cpp 2024. 8. 1.
반응형

STL 맵 (map)

맵은 키-값 쌍을 저장하는 연관 컨테이너로, 키를 기준으로 자동으로 정렬됩니다. 맵은 키의 중복을 허용하지 않습니다.

 

1. 맵 초기화와 기본 연산

맵을 선언하고 초기화하는 방법:

#include <iostream>
#include <map>

using namespace std;

int main() {
    map<string, int> m;

    // 요소 추가
    m["Alice"] = 30;
    m["Bob"] = 25;
    m["Charlie"] = 35;

    // 요소 출력
    for (map<string, int>::iterator it = m.begin(); it != m.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    // 요소 찾기
    map<string, int>::iterator it = m.find("Bob");
    if (it != m.end()) {
        cout << "Found Bob, age: " << it->second << endl;
    }

    // 요소 제거
    m.erase("Alice");

    // 요소 출력
    for (map<string, int>::iterator it = m.begin(); it != m.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

 

2. 맵의 주요 함수

  • insert(): 키-값 쌍을 맵에 추가
  • erase(): 특정 키를 가진 요소를 제거
  • find(): 특정 키를 가진 요소를 찾음
  • size(): 맵의 크기를 반환
  • begin(): 맵의 첫 번째 요소를 가리키는 반복자를 반환
  • end(): 맵의 마지막 요소 다음을 가리키는 반복자를 반환
  • clear(): 맵의 모든 요소를 제거

 

STL 셋 (set)

셋은 중복되지 않는 원소들의 집합을 저장하는 컨테이너로, 원소를 기준으로 자동으로 정렬됩니다.

 

1. 셋 초기화와 기본 연산

셋을 선언하고 초기화하는 방법:

#include <iostream>
#include <set>

using namespace std;

int main() {
    set<int> s;

    // 요소 추가
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(2);  // 중복된 요소는 추가되지 않음

    // 요소 출력
    for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    // 요소 찾기
    set<int>::iterator it = s.find(2);
    if (it != s.end()) {
        cout << "Found 2" << endl;
    }

    // 요소 제거
    s.erase(1);

    // 요소 출력
    for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

 

2. 셋의 주요 함수

  • insert(): 원소를 셋에 추가
  • erase(): 특정 원소를 제거
  • find(): 특정 원소를 찾음
  • size(): 셋의 크기를 반환
  • begin(): 셋의 첫 번째 원소를 가리키는 반복자를 반환
  • end(): 셋의 마지막 원소 다음을 가리키는 반복자를 반환
  • clear(): 셋의 모든 원소를 제거

 

예제 문제

문제 1: 학생의 이름과 점수를 관리하는 프로그램 작성 (맵 사용)

사용자로부터 학생의 이름과 점수를 입력받아 맵에 저장하고, 맵의 내용을 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main() {
    map<string, int> students;
    string name;
    int score;

    cout << "Enter student name and score (type 'stop' for name to end): ";
    while (cin >> name && name != "stop") {
        cin >> score;
        students[name] = score;
    }

    cout << "Student scores: " << endl;
    for (map<string, int>::iterator it = students.begin(); it != students.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

 

이 프로그램은 사용자로부터 학생의 이름과 점수를 입력받아 맵에 저장하고, 맵의 내용을 출력합니다.

 

문제 2: 중복되지 않는 숫자를 관리하는 프로그램 작성 (셋 사용)

사용자로부터 숫자를 입력받아 셋에 저장하고, 셋의 내용을 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>
#include <set>

using namespace std;

int main() {
    set<int> numbers;
    int num;

    cout << "Enter numbers (type -1 to end): ";
    while (cin >> num && num != -1) {
        numbers.insert(num);
    }

    cout << "Unique numbers: ";
    for (set<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

 

이 프로그램은 사용자로부터 숫자를 입력받아 셋에 저장하고, 셋의 내용을 출력합니다.

 

문제 3: 학생의 이름과 점수를 관리하는 프로그램 작성 (맵과 셋 사용)

사용자로부터 학생의 이름과 점수를 입력받아 맵에 저장하고, 점수가 중복되지 않도록 셋을 사용하여 점수를 관리하는 프로그램을 작성하세요.

 

해설:

#include <iostream>
#include <map>
#include <set>
#include <string>

using namespace std;

int main() {
    map<string, int> students;
    set<int> scores;
    string name;
    int score;

    cout << "Enter student name and score (type 'stop' for name to end): ";
    while (cin >> name && name != "stop") {
        cin >> score;
        if (scores.find(score) == scores.end()) { // 점수가 중복되지 않으면
            students[name] = score;
            scores.insert(score);
        } else {
            cout << "Score already exists. Please enter a different score." << endl;
        }
    }

    cout << "Student scores: " << endl;
    for (map<string, int>::iterator it = students.begin(); it != students.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

 

이 프로그램은 사용자로부터 학생의 이름과 점수를 입력받아 맵에 저장하고, 셋을 사용하여 점수가 중복되지 않도록 관리합니다.

 

다음 단계

21일차의 목표는 C++의 STL 맵과 셋에 대해 학습하는 것이었습니다. 다음 날부터는 파일 입출력에 대해 다룰 것입니다.

 

내일은 "파일 입출력"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형