|
Программирование >> Разработка устойчивых систем
щим интервалом, вы получите интервал {1,1,2,4,12}. Обратите внимание: первый элемент в выходном интервале всегда равен первому элементу исходного интервала. Возвращаемое значение представляет собой конечный итератор выходного интервала [resultresult+(last-first)). Outputlterator adjacent d1fference(Inputlterator first. Inputlterator last. Outputlterator result): Outputlterator adjacent difference(Inputlterator first. Inputlterator last. Outputlterator result. BinaryFunction op): Алгоритм вычисляет разность между соседними элементами в интервале [firstlast). Это означает, что каждый элемент нового интервала равен разности текущего и предыдущего элементов исходного интервала (первый элемент остается без изменений). Например, для исходного интервала {1,1,2,2,3} будет получен интервал {1,1 -1,2 -1,2 - 2,3 - 2}, то есть {1,0,1,0,1}. Во второй форме алгоритма вместо оператора - используется бинарная функция ор. Например, если задействовать объект multiplies<int>() с предшествующим интервалом, вы получите интервал {1,1,2,4,5}. Обратите внимание: первый элемент в выходном интервале всегда равен первому элементу исходного интервала. Возвращаемое значение представляет собой конечный итератор выходного интервала [resultresult+(last-first)). Следующая программа тестирует все алгоритмы <numeric> в обеих формах на примере целочисленных массивов. В тестах второй формы (с передачей функции) всегда используется объект функции, эквивалентный операции в первой форме, поэтому и результаты всегда одинаковы. Такой подход поможет вам лучше понять, какие операции при этом выполняются, и как заменить их собственными операциями. : C06:NumericTest.cpp linclude <algorithm> linclude <iostream> linclude <iterator> linclude <functional> linclude <numeric> linclude PrintSequence.h using namespace std: int mainO { int a[] = { 1. 1. 2. 2. 3, 5. 7. 9. 11. 13 }: const int ASZ = sizeof a / sizeof a[0]: print(a. a + ASZ. a . ): int r = accumulate(a. a + ASZ. 0): cout accumulate 1: r endl: С тем же результатом: г = accumulate(a. а + ASZ. 0. plus<int>()): cout accumulate 2: r endl: int b[] ={1.2. 3. 4, 1. 2. 3. 4, 1. 2 }: print(b. b + sizeof b / sizeof b[0]. b . ): r = inner product(a. a + ASZ. b, 0): cout inner product 1: r endl: С тем же результатом: г = inner product(a. а + ASZ. b. 0. plus<int>(). multiplies<int>()): cout 1nner product 2: г endl: int* It = partial sum(a. a + ASZ. b): print(b. it. partial sum 1 . ): С тем же результатом: it = part1al sum(a. a + ASZ. b. plus<int>()): print(b. It. partial sum 2 . ): it = adjacent difference(a. a + ASZ. b): print(b. it. adjacent difference 1 . ): С тем же результатом: It = adjacent difference(a. a + ASZ. b. minus<int>()): print(b. it. adjacent difference 2 . ): } III:- Обратите внимание: алгоритмы inner product() и partiaLsum() возвращают конечный итератор полученного интервала, который используется во втором аргументе функции print(). Поскольку вторая форма каждого алгоритма позволяет задать собственный объект функции, только первые формы являются чисто числовыми . Алгоритм inner product() позволяет выполнять операции, не являющиеся числовыми в общепринятом смысле. Вспомогательные алгоритмы Ниже описаны некоторые базовые алгоритмы, используемые в работе других алгоритмов. Трудно сказать, пригодятся ли они вам в работе. Заголовочный файл <utility> tempiate<class Tl. class T2> struct pair: tempiate<class Tl. class T2> pair<Tl.T2> make pair(const T1&. const T2&): Эти шаблоны упоминались и использовались ранее в этой главе. Объект pair просто упаковывает два объекта (которые могут относиться к разным типам) в один объект. Чаще всего он требуется тогда, когда функция должна вернуть более одного объекта, но у него есть и другие применения, например, в контейнерах или при передаче двух объектов в одном аргументе функции. Компоненты пары определяются записью р.first и р.second, где р - объект pair. Например, функция equaLrange(), описанная в этой главе, возвращает свой результат в виде пары итераторов. Объекты pair можно напрямую сохранять в отображениях (тар) и мультиотображениях (multimap); для этих контейнеров pair является типом значения элементов (value type). Для создания вспомогательных объектов pair вместо явного конструирования обычно применяется шаблонная функция make pair(). Эта функция автоматически определяет типы полученных аргументов, избавляя вас от лишнего ввода (а заодно повышая надежность программы). Заголовочный файл <iterator> difference type distance(Inputlterator first. Inputlterator last): Возвращает расстояние между first и last в элементах. Точнее, этот алгоритм возвращает целое количество инкрементов итератора first, после которых тот станет равным last. Разыменование итераторов при этом не производится. Заголовочный файл <iterator> void advancednputlteratorS i. Distance n): Перемещает итератор i вперед на величину п (двусторонние итераторы также могут смещаться назад при отрицательных значениях п). Алгоритм учитывает фактическую категорию итератора и выбирает наиболее эффективный способ перемещения. Например, итераторы произвольного доступа увеличиваются прибавлением целочисленного смещения (i += п), а двусторонние итераторы последовательно инкрементируются п раз. Заголовочный файл <iterator> backj nsertj terator<Contai ner> backJnserter(Containers x): front i nsertj terator<Contai ner> front inserter(Container& x): i nsertj terator<Contai ner> inserter(Containers x, Iterator i): Эти функции применяются для создания итераторов, которые при использовании оператора = вставляют новые элементы в контейнер (вместо того чтобы изменять значения существующих элементов). Для разных типов итераторов требуются разные операции вставки: для backjnsertjterator - push back(), для frontjnsertjterator - push front(), для insertjterator - insert() (поэтому последняя функция может вызываться с ассоциативными контейнерами, а первые две - с последовательными). Более подробная информация о контейнерах и вставке элементов приводится в следующей главе. const LessThanComparable& min(const LessThanComparableS a. const LessThanComparableS b): const T& min(const T& a. const T& b, BinaryPredicate binary pred): Возвращает меньший из двух аргументов или первый аргумент, если аргументы равны. Первая версия выполняет сравнение оператором <, а вторая передает оба аргумента бинарному предикату binary pred. const LessThanComparable& max(const LessThanComparableS a. const LessThanComparable& b): const T& max(const T& a. const T& b. BinaryPredicate binary pred): Работает аналогично min(), но возвращает больший из двух аргументов. void swap(Assignable& а. AssignableS b): void iter swap(ForwardIteratorl a. ForwardIterator2 b); Меняет местами a и b, используя присваивание. Учтите, что во всех классах контейнеров определены специализированные версии swap(), которые обычно превосходят обобщенную версию по эффективности. Функция iter swap() меняет местами значения, на которые ссылаются аргументы. Создание пользовательских алгоритмов Освоившись с алгоритмами STL, вы можете заняться созданием собственных обобщенных алгоритмов. Если эти алгоритмы будут соответствовать правилам, установленным для всех алгоритмов STL, с ними смогут легко работать программисты, знакомые с STL, и ваши алгоритмы станут своего рода расширением инструментария STL.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |