Выбрать главу

pair ForwardIterator, ForwardIterator

equal_range( ForwardIterator first,

ForwardIterator last, const Type &value );

template class ForwardIterator, class Type, class Compare

pairForwardIterator, 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(), greaterint() );

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,

greaterint() );

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,

greaterint() );

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

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

"*ivec_iter.second: " *ivec_iter.second

"\n\n";

}

Алгоритм fill()

template class ForwardIterator, class Type

void

fill( ForwardIterator first,

ForwardIterator last, const Type& value );

fill() помещает копию значения value в каждый элемент диапазона, ограниченного парой итераторов [first,last).

#include algorithm

#include list

#include string

#include iostream.h

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

исходная последовательность элементов массива:

0 1 1 2 3 5 8

массив после fill(ia+1,ia+6):

0 9 9 9 9 9 8

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

c eiffel java ada perl

список после fill(++ibegin,--iend):

c c++ c++ c++ perl

*/

int main()

{

const int value = 9;

int ia[] = { 0, 1, 1, 2, 3, 5, 8 };

ostream_iterator int ofile( cout, " " );

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

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

fill( ia+1, ia+6, value );

cout "массив после fill(ia+1,ia+6):\n";

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

string the_lang( "c++" );

string langs[5] = { "c", "eiffel", "java", "ada", "perl" };

list string, allocator il( langs, langs+5 );

ostream_iterator string sofile( cout, " " );

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

copy( il.begin(), il.end(), sofile ); cout "\n\n";

typedef liststring,allocator ::iterator iterator;

iterator ibegin = il.begin(), iend = il.end();