map은 키(key) 타입의 '<' 연산자를 기반으로 한 우선순위로 정렬된다.
map<pair<int, int>, int> MAP;
MAP.insert({ { 1, 8 }, 100 });
MAP.insert({ { 2, 7 }, 200 });
MAP.insert({ { 3, 6 }, 300 });
MAP.insert({ { 4, 5 }, 400 });
MAP.insert({ { 4, 4 }, 500 });
MAP.insert({ { 4, 3 }, 600 });
MAP.insert({ { 7, 2 }, 700 });
MAP.insert({ { 8, 1 }, 800 });
cout << "MAP ==================================" << endl;
for (auto iter = MAP.begin(); iter != MAP.end(); iter++) {
cout << (*iter).first.first << ", " << (*iter).first.second << endl;
}
Ket type: pair<int, int>
(1) pair의 first 원소 기준 내림차순
(2) first가 같다면 second 원소 기준 내림차순
struct cmp
{
bool operator()(const pair<int, int>& p1, const pair<int, int>& p2) const {
if (p1.first != p2.first) {
// (1) first 원소 기준 내림차순
return p1.first > p2.first;
}
else {
// (2) first 원소가 같다면 second 기준 내림차순
return p1.second > p2.second;
}
}
};
{
map<pair<int, int>, int, cmp> MAP2;
MAP2.insert({ { 1, 8 }, 100 });
MAP2.insert({ { 1, 9 }, 100 });
MAP2.insert({ { 1, 10 }, 100 });
MAP2.insert({ { 1, 11 }, 100 });
MAP2.insert({ { 1, 12 }, 100 });
MAP2.insert({ { 2, 7 }, 200 });
MAP2.insert({ { 3, 6 }, 300 });
MAP2.insert({ { 4, 5 }, 400 });
MAP2.insert({ { 5, 4 }, 500 });
MAP2.insert({ { 6, 3 }, 600 });
MAP2.insert({ { 7, 2 }, 700 });
MAP2.insert({ { 8, 1 }, 800 });
cout << "MAP2 ==================================" << endl;
for (auto iter = MAP2.begin(); iter != MAP2.end(); iter++) {
cout << (*iter).first.first << ", " << (*iter).first.second << endl;
}
}
map<pair<int, int>, int, greater<pair<int, int>>> MAP3;
MAP3.insert({ { 1, 8 }, 100 });
MAP3.insert({ { 1, 9 }, 100 });
MAP3.insert({ { 1, 10 }, 100 });
MAP3.insert({ { 1, 11 }, 100 });
MAP3.insert({ { 1, 12 }, 100 });
MAP3.insert({ { 2, 7 }, 200 });
MAP3.insert({ { 3, 6 }, 300 });
MAP3.insert({ { 4, 5 }, 400 });
MAP3.insert({ { 5, 4 }, 500 });
MAP3.insert({ { 6, 3 }, 600 });
MAP3.insert({ { 7, 2 }, 700 });
MAP3.insert({ { 8, 1 }, 800 });
cout << "MAP3 ==================================" << endl;
for (auto iter = MAP3.begin(); iter != MAP3.end(); iter++) {
cout << (*iter).first.first << ", " << (*iter).first.second << endl;
}
struct MyStruct {
int id;
int age;
string name;
bool operator<(const MyStruct& other) const {
if (id != other.id)
return id < other.id;
else {
if (age != other.age)
return age < other.age;
else
return name < other.name;
}
}
};
{
map<MyStruct, int> MAP5;
MAP5.insert({ {1, 5, "AAA"}, 1 });
MAP5.insert({ {2, 4, "BBB"}, 1 });
MAP5.insert({ {3, 3, "CCC"}, 1 });
MAP5.insert({ {4, 2, "DDD"}, 1 });
MAP5.insert({ {4, 3, "EEE"}, 1 });
cout << "MAP5 ==================================" << endl;
for (auto iter = MAP5.begin(); iter != MAP5.end(); iter++) {
cout << (*iter).first.id << ", " << (*iter).first.age << ", " << (*iter).first.name << endl;
}
}
만약 operator<을 구현하지 않았다면 다음과 같은 에러 발생
struct MyStruct {
int id;
int age;
string name;
/*
bool operator<(const MyStruct& other) const {
if (id != other.id)
return id < other.id;
else {
if (age != other.age)
return age < other.age;
else
return name < other.name;
}
}
*/
};
struct myStructCmp {
bool operator()(const MyStruct& s1, const MyStruct& s2) const {
if (s1.id != s2.id)
return s1.id < s2.id;
else if (s1.age != s2.age)
return s1.age < s2.age;
else
return s1.name < s2.name;
}
};
{
map<MyStruct, int, myStructCmp> MAP5;
MAP5.insert({ {1, 5, "AAA"}, 1 });
MAP5.insert({ {2, 4, "BBB"}, 1 });
MAP5.insert({ {3, 3, "CCC"}, 1 });
MAP5.insert({ {4, 2, "DDD"}, 1 });
MAP5.insert({ {4, 3, "EEE"}, 1 });
cout << "MAP5 ==================================" << endl;
for (auto iter = MAP5.begin(); iter != MAP5.end(); iter++) {
cout << (*iter).first.id << ", " << (*iter).first.age << ", " << (*iter).first.name << endl;
}
}