Программирование на C / C++ / Ален И. Голуб. Правила программирования на Си и Си++ [pdf]
.pdfС++ для начинающих |
1093 |
template< class InputIterator1, class InputIterator2 > bool
equal( InputIterator1 first1,
InputIterator1 last, InputIterator2 first2 );
template< class InputIterator1, class InputIterator2, class BinaryPredicate >
bool
equal( InputIterator1 first1, InputIterator1 last,
Алгоритм equal()
InputIterator2 first2, BinaryPredicate pred );
equal() возвращает true, если обе последовательности одинаковы в диапазоне, ограниченном парой итераторов [first,last). Если вторая последовательность содержит дополнительные элементы, они игнорируются. Чтобы убедиться в
if ( vec1.size() == vec2.size() &&
тождественности данных последовательностей, необходимо написать: equal( vec1.begin(), vec1.end(), vec2.begin() );
или воспользоваться оператором равенства, определенном в классе самого контейнера: vec1 == vec2. Если второй контейнер содержит меньше элементов, чем первый, и алгоритму приходится просматривать элементы за концом контейнера, то поведение программы не определено. По умолчанию для сравнения применяется оператор равенства в классе элементов контейнера, а во втором варианте алгоритма – указанный предикат pred.
С++ для начинающих |
1095 |
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,
Алгоритм equal_range()
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.
С++ для начинающих |
1096 |
#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";
С++ для начинающих |
1097 |
}
template< class ForwardIterator, class Type > void
fill( ForwardIterator first,
Алгоритм fill()
ForwardIterator last, const Type& value );
fill() помещает копию значения value в каждый элемент диапазона, ограниченного парой итераторов [first,last).
С++ для начинающих |
1099 |
template< class ForwardIterator, class Size, class Type > void
fill_n( ForwardIterator first,
Size n, const Type& value );
fill_n() присваивает count элементам из диапазона [first,first+count) значение value.
С++ для начинающих |
1101 |
}
template< class InputIterator, class T > InputIterator
find( InputIterator first,
Алгоритм find()
InputIterator last, const T &value );
Элементы из диапазона, ограниченного парой итераторов [first,last), сравниваются со значением value с помощью оператора равенства, определенного для типа элементов контейнера. Как только соответствие найдено, поиск прекращается. find() возвращает итератор типа InputIterator, указывающий на найденный
#include <algorithm> #include <iostream.h> #include <list> #include <string>
int main()
{
int array[ 17 ] = { 7,3,3,7,6,5,8,7,2,1,3,8,7,3,8,4,3 };
int elem = array[ 9 ]; int *found_it;
found_it = find( &array[0], &array[17], elem );
// печатается: поиск первого вхождения 1 найдено!
cout << "поиск первого вхождения "
<<elem << "\t"
<<( found_it ? "найдено!\n" : "не найдено!\n" );
string beethoven[] = {
"Sonata31", "Sonata32", "Quartet14", "Quartet15", "Archduke", "Symphony7" };
string s_elem( beethoven[ 1 ] );
list< string, allocator > slist( beethoven, beethoven+6 ); list< string, allocator >::iterator iter;
iter = find( slist.begin(), slist.end(), s_elem );
// печатается: поиск первого вхождения Sonata32 найдено!
cout << "поиск первого вхождения "
<<s_elem << "\t"
<<( found_it ? "найдено!\n" : "не найдено!\n" );
элемент; в противном случае возвращается last.
}