C++에는 같은 타입의 피연산자를 비교하기 위한 여섯 가지 관계 연산자가 있습니다. 바로 >, <, ==, <=, >=, !=입니다. 이 글에서는 C++ STL 배열(std::array)에서 이러한 관계 연산자가 어떻게 동작하는지 자세히 설명합니다.
핵심 연산자: 동등 비교(==)와 미만 비교(<)
STL 배열에서 주로 사용되는 두 연산자는 두 배열 컨테이너 간의 동등 비교(==)와 미만 비교(<)입니다.
동등 비교(==)는 연산자 양쪽에 있는 두 배열의 요소들을 순서대로 비교합니다. 좌변(L.H.S)과 우변(R.H.S) 배열의 첫 번째 요소부터 시작하여, 처음으로 일치하지 않는 요소를 만나는 순간 비교가 중단됩니다.
미만 비교(<)는 사전식(lexicographic) 방식으로 동작합니다. 이 알고리즘은 표준 라이브러리의 std::lexicographical_compare 알고리즘과 동일하게 작동하며, operator<를 사용해 양방향으로(a<b와 b<a 모두 확인) 순차적으로 비교를 수행합니다. 사전식 순서란 사전에서 단어를 첫 글자부터 끝까지 알파벳 순으로 정렬하는 방식을 말합니다.
나머지 연산자의 유도 관계
나먤 네 가지 연산자는 ==와 <를 조합하여 다음과 같이 정의됩니다.
a != b는!(a == b)와 동일a > b는(b < a)와 동일a <= b는!(b < a)와 동일a >= b는!(a < b)와 동일
이 연산자들은 <array> 헤더에 오버로딩되어 있습니다.
주의: 비교하는 두 STL 배열은 반드시 동일한 템플릿 매개변수 <Type, Length>(타입과 크기)를 가져야 합니다.
비교 연산의 시간 복잡도는 선형 시간(linear time)으로, 배열의 크기에 비례합니다. 즉 O(n)입니다.
반환값은 조건이 성립하면 true, 그렇지 않으면 false입니다.
예제 코드
#include <iostream>
#include <stdio.h>
#include <array>
using namespace std;
int main(){
// 배열 선언
array<int, 5> marks1 = { 10,20,30,40,50 };
array<int, 5> marks2 = { 100,200,300,400,500 };
array<int, 5> marks3 = { 10,20,30,40,50 };
// a>=b 는 !(a<b)와 동일함을 보여주는 예
if (marks1 >= marks2){
cout << "Marks1 is greater than equal to Marks2\n";
}
else{
cout << "Marks1 is neither greater nor equal to Marks2\n";
}
if (!(marks1 < marks2)){
cout << "Marks1 is greater than equal to Marks2\n";
}
else{
cout << "Marks1 is neither greater nor equal to Marks2\n";
}
// a<=b 는 !(a>b)와 동일함을 보여주는 예
if (marks1 <= marks2){
cout << "Marks1 is less than equal to Marks2\n";
}
else{
cout << "Marks1 is neither less nor equal to Marks2\n";
}
if (!(marks1 > marks2)){
cout << "Marks1 is less than equal to Marks2\n";
}
else{
cout << "Marks1 is neither less nor equal to Marks2\n";
}
// a!=b 는 !(a==b)와 동일함을 보여주는 예
if (marks1 != marks3){
cout << "Marks1 is not equal to Marks2\n";
}
else{
cout << "Marks1 is equal to Marks2\n";
}
if (!(marks1 == marks3)){
cout << "Marks1 is not equal to Marks2\n";
}
else{
cout << "Marks1 is equal to Marks2\n";
}
return 0;
}실행 결과
Marks1 is neither greater nor equal to Marks2 Marks1 is neither greater nor equal to Marks2 Marks1 is less than equal to Marks2 Marks1 is less than equal to Marks2 Marks1 is equal to Marks2 Marks1 is equal to Marks2
위 예제에서 볼 수 있듯이, 직접 연산자를 사용한 결과와 유도 관계식을 적용한 결과가 완전히 일치합니다. 이를 통해 나머지 관계 연산자들이 ==와 <를 기반으로 정의된다는 사실을 코드로 확인할 수 있습니다.