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

C++ STL multiset::equal_range() 함수 완벽 정리 – 문법, 동작 원리, 예제

이 글에서는 C++ STL의 multiset::equal_range() 함수에 대해 자세히 알아보겠습니다. 이 함수의 동작 방식, 문법, 그리고 실제 사용 예제를 통해 개념을 확실히 이해할 수 있도록 설명합니다.

C++ STL에서 multiset이란?

multiset은 set 컨테이너와 매우 유사한 연관 컨테이너입니다. set과 마찬가지로 값을 키(key) 형태로 저장하며, 항상 특정한 정렬 순서를 유지합니다.

multiset과 set의 가장 큰 차이점은 중복 허용 여부입니다. set은 고유한 키만 저장하므로 두 개 이상의 동일한 키가 존재할 수 없지만, multiset은 동일한 값을 가진 여러 개의 키를 동시에 저장할 수 있습니다.

multiset의 키는 내부적으로 이진 탐색 트리(Binary Search Tree)를 구현하는 데 활용되며, 덕분에 검색, 삽입, 삭제 연산을 로그 시간 복잡도 O(log n)으로 빠르게 수행할 수 있습니다.

multiset::equal_range()란 무엇인가?

multiset::equal_range()는 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다.

이 함수는 multiset 컨테이너 내에서 매개변수로 전달된 값과 같은 모든 요소들의 범위(range)를 반환합니다. 반환값은 하한(lower bound)과 상한(upper bound)으로 구성된 pair 형태이며, 이 범위에는 인자로 주어진 값과 일치하는 컨테이너 내의 모든 요소가 포함됩니다.

문법(Syntax)

ms_name.equal_range(value_type& val);

매개변수

이 함수는 하나의 매개변수를 받습니다.

  • val − 컨테이너에서 범위를 찾고자 하는 값입니다.

반환 값

이 함수는 pair 객체를 반환합니다. pair의 first는 하한 반복자(lower_bound), second는 상한 반복자(upper_bound)를 가리키며, 두 반복자 사이의 범위에 해당 값과 같은 요소들이 포함됩니다.

간단한 예제

입력

std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.equal_range(2);

출력

2 2

위 예제에서 multiset에는 값 2가 두 개 포함되어 있으므로, equal_range(2)는 이 두 요소를 모두 포함하는 범위를 반환합니다.

실전 코드 예제

#include <bits/stdc++.h>
using namespace std;
int main(){
    multiset<int> check;
    check.insert(10);
    check.insert(20);
    check.insert(30);
    check.insert(40);
    check.insert(50);
    check.insert(60);
    check.insert(70);
    check.insert(80);
    cout<<"Elements are: ";
    for (auto i = check.begin(); i!= check.end(); i++)
        cout << *i << " ";
    //lower bound와 upper bound 확인
    auto i = check.equal_range(30);
    cout<<"\nThe lower bound of 30 is " << *i.first;
    cout<<"\nThe upper bound of 30 is " << *i.second;
    // 마지막 요소 확인
    i = check.equal_range(20);
    cout<<"\nThe lower bound of 20 is " << *i.first;
    cout<<"\nThe upper bound of 20 is " << *i.second;
    i = check.equal_range(80);
    cout<<"\nThe lower bound of 80 is " << *i.first;
    cout<<"\nThe upper bound of 80 is " << *i.second;
    return 0;
}

출력 결과

Elements are: 10 20 30 40 50 60 70 80
The lower bound of 30 is 30
The upper bound of 30 is 40
The lower bound of 20 is 20
The upper bound of 20 is 30
The lower bound of 80 is 80
The upper bound of 80 is 8

결과 해석

  • equal_range(30): 하한은 30 자신을 가리키고, 상한은 30보다 큰 첫 번째 요소인 40을 가리킵니다.
  • equal_range(20): 하한은 20, 상한은 20 다음 요소인 30을 가리킵니다.
  • equal_range(80): 80은 컨테이너의 최대값이므로 하한은 80이고, 상한은 end() 반복자를 가리켜 역참조 시 유효하지 않은 값이 출력될 수 있습니다.

정리

multiset::equal_range()는 중복 값을 허용하는 multiset에서 특정 값이 위치한 범위를 한 번의 호출로 효율적으로 얻을 수 있는 강력한 도구입니다. lower_bound()와 upper_bound()를 각각 호출하는 것보다 한 번의 탐색으로 두 경계를 모두 얻을 수 있어 성능 면에서도 유리합니다. 특히 특정 값의 개수를 세거나(range 내 거리 계산), 해당 값들을 일괄 처리할 때 유용하게 활용됩니다.