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을 값으로 넣었다.아래는 실행 결과이다.
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형식으로 string과 pair<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로 복사시킨후 정렬시키면된다.