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




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


Вообще говоря, при передаче адресов элементов массива обобщенному алгоритму мы можем написать

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

или

int *presult = find( ia, ia+6, search_value );

Если бы мы хотели ограничиться лишь отрезком массива, то достаточно было бы модифицировать передаваемые алгоритму адреса. Так, при следующем обращении к find() просматриваются только второй и третий элементы (напомним, что элементы массива нумеруются с нуля):

// искать только среди элементов ia[1] и ia[2]

int *presult = find( &ia[1], &ia[3], search_value );

А вот пример использования контейнера типа vector с алгоритмом find():

#include <algorithm>

#include <vector>

#include <iostream>

int main()

{

   int search_value;

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

   vector<int> vec( ia, ia+6 );

   cout << "enter search value: ";

   cin >> search_value;

   vector<int>::iterator presult;

   presult = find( vec.begin(), vec.end(), search_value );

   cout << "The value " << search_value

        << ( presult == vec.end()

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

        << endl;

}

find() можно применить и к списку:

#include <algorithm>

#include <list>

#include <iostream>

int main()

{

   int search_value;

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

   list<int> ilist( ia, ia+6 );

   cout << "enter search value: ";

   cin >> search_value;

   list<int>::iterator presult;

   presult = find( ilist.begin(), ilist.end(), search_value );

   cout << "The value " << search_value

        << ( presult == ilist.end()

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

   << endl;

}

(В следующем разделе мы обсудим построение программы, в которой используются различные обобщенные алгоритмы, а затем рассмотрим объекты-функции. В разделе 12.4 мы подробнее расскажем об итераторах. Развернутое введение в обобщенные алгоритмы – предмет раздела 12.5, а их детальное обсуждение и иллюстрация применения вынесено в Приложение. В конце главы речь пойдет о случаях, когда применение обобщенных алгоритмов неуместно.)

Упражнение 12.1

Обобщенные алгоритмы критикуют за то, что при всей элегантности дизайна проверка корректности возлагается на программиста. Например, если передан неверный итератор или пара итераторов, помечающая неверный диапазон, то поведение программы не определено. Вы согласны с такой критикой? Следует ли оставить применение обобщенных алгоритмов только наиболее квалифицированным специалистам? Может быть, нужно запретить использование потенциально опасных конструкций, таких, как обобщенные алгоритмы, указатели и явные приведения типов?




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