С++ для начинающих




Краткий обзор - часть 2


Имеется по две версии каждого обобщенного алгоритма: в одной для сравнения применяется оператор равенства, а в другой – объект-функция или указатель на функцию, реализующую сравнение. (Объекты-функции рассматриваются в разделе 12.3.) Вот, например, реализация обобщенного алгоритма find(), в котором используется оператор сравнения для типов хранимых в контейнере элементов:

template < class ForwardIterator, class Type >

ForwardIterator

find( ForwardIterator first, ForwardIterator last, Type value )

{

   for ( ; first != last; ++first )

             if ( value == *first )

          return first;

   return last;

}

ForwardIterator (однонаправленный итератор) – это один из пяти категорий итераторов, предопределенных в стандартной библиотеке. Он поддерживает чтение и запись адресуемого элемента. (Все пять категорий рассматриваются в разделе 12.4.)

Алгоритмы достигают независимости от типов за счет того, что никогда не обращаются к элементам контейнера непосредственно; доступ и обход элементов осуществляются только с помощью итераторов. Неизвестны ни фактический тип контейнера, ни даже то, является ли он контейнером или встроенным массивом. Для работы со встроенным типом массива обобщенному алгоритму можно передать не только обычные указатели, но и итераторы. Например, алгоритм find() для встроенного массива элементов типа int можно использовать так:

#include <algoritm>

#include <iostream>

int main()

{

   int search_value;

   int ia[ 6 ] = { 27, 210, 12, 47, 109, 83 };

   cout << "enter search value: ";

   cin >> search_value;

   int *presult = find( &ia[0], &ia[6], search_value );

   cout << "The value " << search_value

        << ( presult == &ia[6]

            ? " is not present" : " is present" )

   << endl;

}

Если возвращенный указатель равен адресу &ia[6] (который расположен за последним элементом массива), то поиск оказался безрезультатным, в противном случае значение найдено.




Содержание  Назад  Вперед