Читаем Программирование полностью

Посмотрим, как можно решить задачу “найти максимальный элемент” с помощью последовательности STL.

template

Iterator high(Iterator first, Iterator last)

// возвращает итератор на максимальный элемент в диапазоне [first:last]

{

  Iterator high = first;

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

    if (*high<*p) high = p;

  return high;

}

Обратите внимание на то, что мы исключили локальную переменную h, которую до сих пор использовали для хранения максимального элемента. Если вам неизвестен реальный тип элементов последовательности, то инициализация –1 выглядит совершенно произвольной и странной. Она действительно является произвольной и странной! Кроме того, такая инициализация представляет собой ошибку: в нашем примере число 1 оправдывает себя только потому, что отрицательных скоростей не бывает. Мы знаем, что “магические константы”, такие как –1, препятствуют сопровождению кода (см. разделы 4.3.1, 7.6.1, 10.11.1 и др.). Здесь мы видим, что такие константы могут снизить полезность функции и свидетельствовать о неполноте решения; иначе говоря, “магические константы” могут быть — и часто бывают — свидетельством небрежности.

Обобщенную функцию high() можно использовать для любых типов элементов, которые можно сравнивать с помощью операции <. Например, мы могли бы использовать функцию high() для поиска лексикографически последней строки в контейнере vector (см. упр. 7).

Шаблонную функцию high() можно применять к любой последовательности, определенной парой итераторов. Например, мы можем точно воспроизвести нашу программу.

double* get_from_jack(int* count); // Джек вводит числа типа double

  // в массив и возвращает количество

  // элементов в переменной *count

vector* get_from_jill(); // Джилл заполняет вектор

void fct()

{

  int jack_count = 0;

  double* jack_data = get_from_jack(&jack_count);

  vector* jill_data = get_from_jill();

  double* jack_high = high(jack_data,jack_data+jack_count);

  vector& v = *jill_data;

  double* jill_high = high(&v[0],&v[0]+v.size());

  cout << "Максимум Джилл " << *jill_high

       << "; Максимум Джека" << *jack_high;

  // ...

  delete[] jack_data;

  delete jill_data;

}

Здесь в двух вызовах функции high() шаблонным типом аргумента является тип double*. Это ничем не отличается от нашего предыдущего решения. Точнее, выполняемые коды этих программ ничем не отличаются друг от друга, хотя степень общности этих кодов разнится существенно. Шаблонная версия функции high() может применяться к любому виду последовательности, определенной парой итераторов. Прежде чем углубляться в принципы библиотеки STL и полезные стандартные алгоритмы, реализующие эти принципы, и для того чтобы избежать создания сложных кодов, рассмотрим несколько способов хранения коллекций данных.

ПОПРОБУЙТЕ

В этой программе снова сделана серьезная ошибка. Найдите ее, исправьте и предложите универсальный способ устранения таких проблем. 

<p id="AutBody_Root376"><strong>20.4. Связанные списки</strong></p>

  Еще раз рассмотрим графическое представление последовательности.

Сравним его с визуализацией вектора, хранящегося в памяти.

По существу, индекс 0 означает тот же элемент, что и итератор v.begin(), а функция v.size() идентифицирует элемент, следующий за последним, который можно также указать с помощью итератора v.end().

Элементы в векторе располагаются в памяти последовательно. Понятие последовательности в библиотеки STL этого не требует. Это позволяет многим алгоритмам вставлять элементы между существующими элементами без их перемещения. Графическое представление абстрактного понятия последовательности предполагает возможность вставки (и удаления) элементов без перемещения остальных элементов. Понятие итераторов в библиотеки STL поддерживает эту концепцию.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных