Язык программирования C++. Вводный курс

Алгоритм equal_range()


template< class ForwardIterator, class Type >

pair< ForwardIterator, ForwardIterator >

equal_range( ForwardIterator first,

             ForwardIterator last, const Type &value );

template< class ForwardIterator, class Type, class Compare >

pair< ForwardIterator, ForwardIterator >

equal_range( ForwardIterator first,

             ForwardIterator last, const Type &value,



             Compare comp );

equal_range()

возвращает пару итераторов: первый представляет значение итератора, возвращаемое алгоритмом lower_bound(), второй – алгоритмом upper_bound(). (О семантике этих алгоритмов рассказано в их описаниях.) Например, дана последовательность:

int ia[] = {12,15,17,19,20,22,23,26,29,35,40,51};

Обращение к equal_range() со значением 21

возвращает пару итераторов, в которой оба указывают на значение 22. Обращение же со значением 22 возвращает пару итераторов, где first

указывает на 22, а second – на 23. В первом варианте при сравнении используется оператор “меньше”, определенный для типа элементов контейнера; во втором – предикат comp.

#include <algorithm>

#include <vector>

#include <utility>

#include <iostream.h>

/* печатается:

   последовательность элементов массива после сортировки:

   12 15 17 19 20 22 23 26 29 35 40 51

   результат equal_range при поиске значения 23:

        *ia_iter.first: 23      *ia_iter.second: 26

   результат equal_range при поиске отсутствующего значения 21:

        *ia_iter.first: 22      *ia_iter.second: 22

   последовательность элементов вектора после сортировки:

   51 40 35 29 26 23 22 20 19 17 15 12

   результат equal_range при поиске значения 26:

        *ivec_iter.first: 26    *ivec_iter.second: 23

   результат equal_range при поиске отсутствующего значения 21:

        *ivec_iter.first: 20    *ivec_iter.second: 20

*/

int main()

{

   int ia[] = { 29,23,20,22,17,15,26,51,19,12,35,40 };

   vector< int, allocator > ivec( ia, ia+12 );

   ostream_iterator< int >  ofile( cout, " " );

   sort( &ia[0], &ia[12] );

   cout << "последовательность элементов массива после сортировки:\n";

   copy( ia, ia+12, ofile ); cout << "\n\n";

   pair< int*,int* > ia_iter;

   ia_iter = equal_range( &ia[0], &ia[12], 23 );

   cout << "результат equal_range при поиске значения 23:\n\t"

        << "*ia_iter.first: "  << *ia_iter.first << "\t"

        << "*ia_iter.second: " << *ia_iter.second << "\n\n";

                 

   ia_iter = equal_range( &ia[0], &ia[12], 21 );

   cout << "результат equal_range при поиске "

        << "отсутствующего значения 21:\n\t"

        << "*ia_iter.first: "  << *ia_iter.first << "\t"

        << "*ia_iter.second: " << *ia_iter.second << "\n\n";

                 

   sort( ivec.begin(), ivec.end(), greater<int>() );

   cout << "последовательность элементов вектора после сортировки:\n";

   copy( ivec.begin(), ivec.end(), ofile ); cout << "\n\n";

                 

   typedef vector< int, allocator >::iterator iter_ivec;

   pair< iter_ivec, iter_ivec > ivec_iter;

   ivec_iter = equal_range( ivec.begin(), ivec.end(), 26,

               greater<int>() );

                 

   cout << "результат equal_range при поиске значения 26:\n\t"

        << "*ivec_iter.first: "  << *ivec_iter.first << "\t"

              << "*ivec_iter.second: " << *ivec_iter.second

        << "\n\n";

   ivec_iter = equal_range( ivec.begin(), ivec.end(), 21,

               greater<int>() );

   cout << "результат equal_range при поиске отсутствующего значения 21:\n\t"

        << "*ivec_iter.first: "  << *ivec_iter.first << "\t"

              << "*ivec_iter.second: " << *ivec_iter.second

        << "\n\n";

}



Содержание раздела