English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ set equal_range() 사용법 및 예제

C++ STL Set(집합)

C ++ set equal_range()이 함수는 컨테이너에서 val과 일치하는 모든 요소를 포함하는 범위의 경계를 반환합니다. set 컨테이너에는 중복된 값이 없기 때문에 이 범위는 최대 하나의 요소를 포함할 수 있습니다.

val이 컨테이너의 어떤 값도 일치하지 않으면, 반환된 범위는 0이 되며 두 이터레이터는 가장 가까운 val보다 큰 값을 가리키며, 그렇지 않으면 val이 컨테이너의 모든 요소보다 크다면 end를 가리킵니다.

문법

pair<const_iterator,const_iterator> equal_range(const value_type& val) const;
pair<iterator,iterator> equal_range(const value_type& val);

이 범위는 두 이터레이터로 정의되며, 하나는 val이 미만이 아닌 첫 번째 요소를 가리키고, 다른 하나는 val이 초과하는 첫 번째 요소를 가리킵니다.

매개변수

val:집합 컨테이너에서 검색할 값을

반환 값

이 함수는 pair를 반환합니다. pair::first는 범위의 하한에 위치하며 lower_bound(val)이 반환할 값과 같은 값을 가지며, pair::second는 upper_bound(val)이 반환할 값과 같은 값을 가지며, 이는 범위의 상한에 위치합니다.

복잡

대수적 크기입니다.

이터레이터 유효성

변경 없음

데이터 경쟁

컨테이너에 접근됩니다(상수 및 비상수 버전 모두 컨테이너를 변경할 수 없습니다).

집합의 요소에 동시에 접근하는 것은 안전합니다.

예외 안전성

예외가 발생하면 컨테이너에 어떤 변경도 없습니다.

예제1

간단한 예제를 보겠습니다:

#include <iostream>
#include <set>
using namespace std;
int main(void) {
   set<char> m = {'a','b','c','d'};
   auto ret = m.equal_range('b');
   cout << 
b의 최소값은: << *ret.first << endl;
   cout << 
b의 최댓값은: << *ret.second << endl;
   return 0;
}

출력:

b의 최소값은: b
b의 최댓값은: c

위의 예제에서 b의 최소값은 b, b의 최댓값은 c입니다.

예제2

간단한 예제를 보겠습니다:

#include <iostream>
#include <set>
using namespace std;
 
int main()
{
     // 컨테이너 초기화
    set<int> mp;
 
    // 임의의 순서로 요소를 삽입합니다
    mp.insert( 4 );
    mp.insert( 1 );
    mp.insert( 6 );
 
    pair<set<int>::const_iterator,set<int>::const_iterator> ret;
 
    ret = mp.equal_range(10);
    cout << 
최소값은: << *ret.first;
    cout << 
최댓값은: << *ret.second;
 
    return 0;
}

출력:

하한은 3
상한은 3

위의 예제에서 equal_range() 함수는 end()로 반환됩니다.3، 그것은 set mp에 존재하지 않는10。

예제3

간단한 예제를 보겠습니다:

#include <set>  
#include <iostream>  
  
int main(  
{  
   using namespace std;  
   typedef set<int, less<int> > IntSet;  
   IntSet s1;  
   set<int, less<int> > :: const_iterator s1_RcIter;  
  
   s1.insert( 10 );  
   s1.insert( 20 );  
   s1.insert( 30 );  
  
   pair<IntSet::const_iterator, IntSet::const_iterator> p1, p2;  
   p1 = s1.equal_range( 20 );  
  
   cout << "집합s1중간 키는20의 요소의 상한은: "  
        << *(p1.second) << "." << endl;  
  
   cout << "집합s1중간 키는20의 요소의 하한은: "  
        << *(p1.first << "." << endl;  
  
   //directly call upper_bound
   s1_RcIter = s1.upper_bound( 20 );  
   cout << "directly call upper_bound(20)에서  
        << *s1_RcIter << "," << endl  
        << "pair의 두 번째 요소와 일치하는  
        << " equal_range(20)을 반환합니다." << endl;  
  
   p2 = s1.equal_range( 40 );  
  
    //키를 찾지 못하면
    //pair의 두 요소 모두 end()을 반환합니다
   if ( ( ( p2.first == s1.end() ) ) && ( ( p2.second == s1.end() ) )  
      cout << "집합s1키가 0보다 작은 것이 없습니다40의 요소." << endl;  
   else  
      cout << "집합s1의 키 >= 40의 요소는: "  
           << *(p1.first << "." << endl; 
           
           return 0;
}

출력:

집합 s1중간 키는20의 요소의 상한은: 30.
집합 s1중간 키는20의 요소의 하한은: 20.
upper_bound(20)에서 30,
equal_range(20)을 반환합니다.
집합 s1키가 0보다 작은 것이 없습니다40의 요소.

예제4

간단한 예제를 보겠습니다:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
  std::set<int> myset;
  for (int i=1; i<=5; i++myset.insert(i*10);   // myset: 10 20 30 40 50
  pair<std::set<int>::const_iterator,set<int>::const_iterator> ret;
  ret = myset.equal_range(30);
  cout << "하한 지점: " << *ret.first << '\n';
  cout << "상한 지점: " << *ret.second << '\n';
  return 0;
}

출력:

하한 지점: 30
상한 지점: 40

C++ STL Set(집합)