Программирование. Принципы и практика использования C++ Исправленное издание, стр. 271
if (h<*p) { high = p; h = *p; } return high;}Теперь можно написать следующий код:
double* jack_high = high(jack_data,jack_data+jack_count);vector<double>& v = *jill_data;double* jill_high = high(&v[0],&v[0]+v.size());Он выглядит получше. Мы не ввели слишком много переменных и написали только один цикл (в функции
high()*jack_high*jill_highcout << "Максимум Джилл: " << *jill_high << "; максимум Джека: " << *jack_high;Обратите внимание на то, что функция
high()ПОПРОБУЙТЕ
В этой маленькой программе мы оставили две потенциально опасные ошибки. Одна из них может вызвать катастрофу, а другая приводит к неправильным ответам, если функция
high()Функция
high()• Она работает только с массивами. Мы считаем, что элементы объекта класса
vector• Ее можно применять только к объектам класса
vectordoublevector<double*>char[10]• Она находит элемент с максимальным значением, но с этими данными можно выполнить множество других простых вычислений.
Попробуем обеспечить более высокую общность вычислений над нашими наборами данных.
Обратите внимание на то, что, решив выразить алгоритм поиска наибольшего элемента в терминах указателей, мы “случайно” уже обобщили решение задачи: при желании мы можем найти наибольший элемент массива или вектора, но, помимо этого, можем найти максимальный элемент части массива или вектора. Рассмотрим пример.
// ...vector<double>& v = *jill_data;double* middle = &v[0]+v.size()/2;double* high1 = high(&v[0], middle); // максимум первой // половиныdouble* high2 = high(middle, &v[0]+v.size()); // максимум второй // половины// ...Здесь указатель
high1high2
В качестве аргументов функции
high()double* find_highest(vector<double>& v){ double h = –1; double* high = 0; for (int i=0; i<v.size(); ++i) if (h<v[i]) { high = &v[i]; h = v[i]; } return high;}Однако это не обеспечивает достаточно гибкости, которую мы “случайно” уже придали функции
high()find_highest()20.2. Принципы библиотеки STL
Стандартная библиотека языка С++, обеспечивающая основу для работы с данными, представленными в виде последовательности элементов, называется STL. Обычно эту аббревиатуру расшифровывают как “стандартная библиотека шаблонов” (“standard template library”). Библиотека STL является частью стандарта ISO C++. Она содержит контейнеры (такие как классы
vectorlistmapsortfindaccumulatevectorostream
if