[맵(map)] 정렬 우선 순위

Jin Hur·2022년 10월 21일
0

map은 키(key) 타입의 '<' 연산자를 기반으로 한 우선순위로 정렬된다.

1. map<pair<int, int>, int> 순서

		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 원소 기준 내림차순


2. cmp 구조체 선언 및 operator() 오버로딩 활용

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;
		}
    }


3. less, greater 사용

  • greater: 비교 원소에 대해 내림차순 정렬
  • less: 비교 원소에 대해 오름차순 정렬 (default)
		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;
		}


4. 사용자 정의 자료형

4.1. 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;
		}
	}
};


	{
		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<을 구현하지 않았다면 다음과 같은 에러 발생

4.2. cmp 구조체 선언 및 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;
		}
	}

0개의 댓글