Map

주상돈·2025년 2월 7일

TIL

목록 보기
26/53

Map안에 Map넣을 수 있다.
예시코드를 보자

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

int main() {
    // 내부 Map 선언
    std::map<std::string, std::string> innerMap;
    innerMap["key1"] = "value1";
    innerMap["key2"] = "value2";

    // 외부 Map 선언
    std::map<std::string, std::map<std::string, std::string>> outerMap;
    outerMap["innerMap1"] = innerMap;

    // 출력
    for (const auto& outerPair : outerMap) {
        std::cout << "Key: " << outerPair.first << std::endl;
        for (const auto& innerPair : outerPair.second) {
            std::cout << "  " << innerPair.first << ": " << innerPair.second << std::endl;
        }
    }

    return 0;
}
  • std::map<std::string>, std::map<std::string>, std::string 구조로 선언하여 Map 안에 또 다른 Map을 값으로 넣었다.
  • 외부 Map outerMap의 키는 innerMap1, 값은 innerMap이다.

아래는 실행 결과이다.

Key: innerMap1
  key1: value1
  key2: value2

무언가 두 개의 값을 묶어서 하나로 저장할 수 있는 C++ 표준 라이브러리인 std::pair에 대해 알아보자.
학생id, 과목이름, 과목성적을 묶어서 성적관리를 할때 각 과목별 평균을 구해야하는 상황이라 가정해보자.

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

using namespace std;

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

    // 예제 데이터 입력
    studentNumber[1001]["C++"] = 85;
    studentNumber[1001]["알고리즘"] = 90;
    studentNumber[1002]["C++"] = 92;
    studentNumber[1002]["자료구조"] = 88;

    map<string, pair<int, int>> subjectSumCount;  // 과목별 총점과 학생 수 저장

    // 전체 데이터 순회
    for (const auto& student : studentNumber) {
        for (const auto& subject : student.second) {
            string subjectName = subject.first;
            int score = subject.second;

            subjectSumCount[subjectName].first += score;  // 점수 합계
            subjectSumCount[subjectName].second += 1;     // 학생 수 카운트
        }
    }

    // 평균 출력
    cout << "과목별 평균 점수:" << endl;
    for (const auto& entry : subjectSumCount) {
        string subjectName = entry.first;
        int totalScore = entry.second.first;
        int studentCount = entry.second.second;

        double average = static_cast<double>(totalScore) / studentCount;
        cout << subjectName << ": " << average << endl;
    }

    return 0;
}

이렇게
subjectSumCount에 map형식으로 stringpair<int, int>를 사용해서 첫 값으로는 점수 합계, 두번째 값으로는 학생 수를 세서 저장하는 방식을 사용했다.map은 Key값을 기준으로 기본적으로 정렬된다.. 근데 value값을 기준으로 정렬하고 싶을땐 어떻게 할까?

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    map<int, string> data = {{3, "C++"}, {1, "Python"}, {2, "Java"}};

    // 데이터를 vector로 복사
    vector<pair<int, string>> vec(data.begin(), data.end());

    // 값 기준 정렬
    sort(vec.begin(), vec.end(), [](const pair<int, string>& a, const pair<int, string>& b) {
        return a.second < b.second;  // 알파벳 순으로 정렬
    });

    // 정렬된 출력
    for (const auto& entry : vec) {
        cout << entry.first << ": " << entry.second << endl;
    }

    return 0;
}

아까 위에서 썼던 pair라이브러리를 활용해서 vector로 복사시킨후 정렬시키면된다.

0개의 댓글