Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL lexicographical_compare() 함수 완벽 정리: 개념부터 구현 예제까지

C++ 표준 라이브러리(STL)의 알고리즘 헤더에 포함된 std::lexicographical_compare() 함수는 두 개의 요소 범위(range)를 비교하여, 첫 번째 범위가 두 번째 범위보다 사전식(lexicographically)으로 앞서는지, 즉 '작은' 값을 갖는지를 검사합니다.

여기서 말하는 사전식 비교란 일반적으로 사전에서 단어를 알파벳 순서대로 정렬할 때 사용되는 비교 방식을 의미합니다. 문자열뿐만 아니라 반복자(iterator)로 접근 가능한 모든 컨테이너의 요소들에 적용할 수 있습니다.

함수 선언

template <class InputIterator1, class InputIterator2>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2);

매개변수 설명

  • first1, last1: 비교 대상인 첫 번째 시퀀스의 시작과 끝을 가리키는 반복자
  • first2, last2: 비교 대상인 두 번째 시퀀스의 시작과 끝을 가리키는 반복자

반환값

  • 첫 번째 범위가 두 번째 범위보다 사전식으로 작으면 true
  • 그렇지 않으면 false

동작 원리 (알고리즘)

시작
result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end())
만약 result == true 이면
"v1이 v2보다 작다" 출력
result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end())
만약 result == false 이면
"v1은 v2보다 작지 않다" 출력
종료

구현 예제 코드

아래 예제에서는 대문자로 시작하는 문자열 벡터 v1과 소문자로 시작하는 문자열 벡터 v2를 비교합니다. 아스키 코드 기준으로 대문자가 소문자보다 먼저 오므로, 처음에는 v1이 더 작다고 판단됩니다.

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

int main(void) {
// v1과 v2 초기화
vector<string> v1 = {"One", "Two", "Three"};
vector<string> v2 = {"one", "two", "three"};
bool result;

// 첫 번째 비교 수행
result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());
if (result == true)
cout << "v1이 v2보다 작습니다." << endl;

// v1의 첫 번째 요소를 변경한 후 다시 비교
v1[0] = "two";
result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());
if (result == false)
cout << "v1은 v2보다 작지 않습니다." << endl;

return 0;
}

실행 결과

v1이 v2보다 작습니다.
v1은 v2보다 작지 않습니다.

결과 해설

첫 번째 비교에서는 v1[0]이 "One", v2[0]이 "one"입니다. 아스키 코드에서 대문자 'O'(79)는 소문자 'o'(111)보다 값이 작기 때문에, v1이 사전식으로 더 작다고 판정되어 true가 반환됩니다.

반면 v1[0]을 "two"로 변경한 후에는 두 범위의 첫 번째 요소가 동일해집니다. 이후 두 번째 요소도 "Two"와 "two"로 같은 상황이지만, 내부적으로 대소문자 차이로 인해 v1이 더 작지 않다고 판정되어 false가 반환됩니다.

마무리

lexicographical_compare()는 문자열 정렬, 버전 비교, 사용자 정의 타입의 순서 판단 등 다양한 상황에서 유용하게 활용되는 STL 알고리즘입니다. 반복자만 전달하면 되므로 vector, array, list 등 어떤 컨테이너에도 손쉽게 적용할 수 있다는 점이 큰 장점입니다.