// печатается: список ilist равен ilist2? Да.
res = equal( ilist.begin(), ilist.end(), ilist2.begin() );
cout "список ilist равен ilist2? "
( res ? "Да" : "Нет" ) ".\n";
// false: 0, 2, 8 не являются равными и нечетными
// печатается: список ilist equal_and_odd() ilist2? Нет.
res = equal( ilist.begin(), ilist.end(),
ilist2.begin(), equal_and_odd() );
cout "список ilist equal_and_odd() ilist2? "
( res ? "Да" : "Нет" ) ".\n";
return 0;
}
Алгоритм 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
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";