이 글에서는 C++ STL의 map::value_comp() 함수가 어떻게 동작하는지, 문법은 어떻게 되는지, 그리고 실제 예제를 통해 어떻게 활용하는지 자세히 알아보겠습니다.
C++ STL에서 맵(Map)이란?
맵(map)은 연관 컨테이너(associative container)의 일종으로, 키(key)와 매핑된 값(mapped value)의 조합으로 구성된 요소들을 특정 순서에 따라 저장합니다. 맵 컨테이너 내부의 데이터는 항상 연관된 키를 기준으로 자동 정렬되며, 각 값은 고유한 키를 통해서만 접근할 수 있습니다.
map::value_comp()란 무엇인가?
map::value_comp()는 C++ STL에 내장된 함수로, <map> 헤더 파일에 선언되어 있습니다. 이 함수는 맵 컨테이너가 내부적으로 요소를 비교할 때 사용하는 비교 객체(comparison object)의 복사본을 반환합니다. 기본적으로 이 객체는 '보다 작음(less than)' 연산자와 동일한 방식으로 동작합니다.
쉽게 말해 value_comp()는 함수 포인터 또는 함수 객체(function object)의 일종으로, 같은 타입의 두 값을 비교하여 첫 번째 요소가 두 번째 요소보다 작으면 true를, 그렇지 않으면 false를 반환합니다. 참고로 key_comp()가 키만 비교하는 것과 달리, value_comp()는 키와 값으로 이루어진 pair 전체를 비교 대상으로 삼는다는 점이 다릅니다.
문법(Syntax)
Map_name.value_comp();
매개변수(Parameter)
이 함수는 별도의 매개변수를 받지 않습니다.
반환 값(Return Value)
맵 컨테이너와 연관된 비교 객체(map::value_compare 타입)를 반환합니다.
예제 1
입력
map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
auto comp = newmap.value_comp();
auto last = *newmap.rbegin();
for (auto it = newmap.begin(); comp(*it, last); ++it) {
cout << it->second << endl;
}
출력
1 2 3
위 예제에서는 value_comp()가 반환한 비교 객체를 사용해 현재 요소가 마지막 요소보다 작은 동안 반복하며 값을 출력합니다. 마지막 요소에 도달하면 비교 결과가 false가 되어 반복이 종료됩니다.
예제 2
#include <iostream>
#include <map>
using namespace std;
int main() {
map<char, int> TP = {
{ 'a', 10 },
{ 'b', 20 },
{ 'c', 30 },
{ 'd', 40 },
{ 'e', 50 },
};
auto temp = *TP.rbegin(); // 마지막 요소 ('e', 50)
auto i = TP.begin();
cout << "Elements in map are : \n";
do {
cout << i->first << " = " << i->second << endl;
} while (TP.value_comp()(*i++, temp));
return 0;
}
출력
Elements in map are : a = 10 b = 20 c = 30 d = 40 e = 50
동작 원리 정리
위 코드에서 TP.rbegin()은 맵의 마지막 요소인 ('e', 50)을 가리킵니다. do-while 루프는 현재 요소가 마지막 요소보다 작은 동안, 즉 value_comp()가 true를 반환하는 동안 계속해서 요소를 출력합니다. ('e', 50)에 도달하면 자기 자신과의 비교가 되므로 false가 반환되고 루프가 종료됩니다. 이처럼 value_comp()는 맵의 정렬 기준을 그대로 활용하여 요소를 순회하거나 비교할 때 유용하게 사용할 수 있습니다.