Программирование >>  Операторы преобразования типа 

1 ... 38 39 40 [ 41 ] 42 43 44 ... 239


В системах, не поддерживающих аргументы шабло1гов по умолчанию, обычно приходится использовать вторую форлгу.

Обратите внима1тис на пробел между символами >. Последовательность > воспри}гима-ется компилятором как оператор сдвига, что приводит к синтаксической ошибке.

Аналогичным способом определяются другие функции для получения или изменения состояния объекта функции на протяжении его жизненного цикла. Пример приведен на с. 335.

Учтите, что для некоторых алгоритмов стандартная библиотека С++ не определяет количество вызовов объекта для каждого элемента, поэтому нельзя исключать, что элементу будут передаваться разные экземпляры объекта функции. Это может привести к нежелательным последствиям, в частности, если объекты функций используются как предикаты. Проблема рассматривается на с. 303.

Стандартные объекты функций

Стандартная библиотека С++ содержит несколько объектов функций для выполнения базовых операций. Иногда эти объекты избавляют программиста от необходимости создавать собственные объекты функций. Типичным примером служит объект функции, используемый как критерий сортировки. По умолчанию сортировка с применением оператора < осуществляется с критерием lesso. Рассмотрим следующее объявление:

set<1nt> coll;

Это объявление расширяется до set<int.less<int coll; Сортировка элементов оператором <

Так же просто обеспечивается сортировка элементов в обратном порядке:

set<1nt.greater<int> > coll: Сортировка элементов оператором >

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

transform (coll .begln(). coll.endO, Источник

col 1.beginC). Приемник

negate<1nt>()): Операция

Выражение negate<int>() создает объект функции стандартного шаблонного класса negate. Этот объект просто возвращает элемент типа int, для которого оп был вызван, с противоположным знаком. Алгоритм transfonnQ использует эту операцию для преобразования всех элементов первой коллекции во вторую коллекцию. Если источник и приемник совпадают (как в нашем случае), возвращаемые элементы с измененным знаком записываются на место исходных. Таким образом, приведенная выше команда меняет знак всех элементов коллекции.



Возведение всех элементов коллекции в квадрат выполняется аналогично:

transform (coll.beginO. coll.endO. Первый источник

coll.beginO. Второй источник

coll -beginO . Приемник

mult1pl1es<int>0): Операция

На этот раз другая форма алгоритма transform() объединяет элементы двух коллекций, 11рименяя к ним заданную операцию, и записывает результат в третью коллекцию. В данном примере во всех трех случаях используется одна и та же коллекция, поэтому каждый элемент умтюжается сам на себя, а результат записывается в исходную позицию .

Специальные фупкционалыше адаптеры позволяют объединять стандартные объекты функций с другими значениями или определять особые ситуации. Пример:

stl/fol.cpp #include <1ostream> #include <set> #include <deque> Iinclude <algorithm> Iinclude print.hpp using namespace std:

Int ma1n() {

set<int.greater<int> > colli; deque<int> col 12:

Вставка элементов со значениями от 1 до 9 for (int 1=1: i<=9; ++i) { colU.insertd):

PRINT ELEMENTS(colU. initialized: );

Преобразование всех элементов col 12 умножением на 10 transform (colli.beginO.colli.end(), Источник

backjnserter(coll2). Приемник

b1nd2nd(mult1plies<int>0,10)); Операция

PRINT ELEMENTS(con2. transforfTied: );

Замена значения, равного 70, на 42

replacejf (со112.beginO,coll2.end(). Интервал

bind2nd(equal to<int>().70). Критерий замены

42): Новое значение

В предыдущих версиях STL объект функции, ubiuo.niWBiuviA умножение, назыпался times. Переименовалие произошло из-за конфликта имен с функциями стандартов операционных систем (Х/Ореп, POSIX), а также потому, что имя multiplies более понятно.



PRINTJLEMENTS(coll 2. replaced: ):

Удаление всех элементов со значениями, меньшими 50 coll2.eraseCrefflove if(coll2.beg1n(),coll2.end(). Интервал

b1nd2nd{less<int>().50)). Критерий удаления coll2.endC)):

PRINT ELEMENTSCcol12, removed: П:

Следующая команда умножает каждый элемент colli на 10 и вставляет его в coiI2:

transform (colli.begln{),colli.endO. Источник

bdck 1nserter(coll2), Приемник

b1nd2nd(mult1plies<1nt>(),lO)); Операция

Функциональный адаптер bind2nd обеспечивает вызов multiplies<int> для каждого элемента исходной коллекции (первый аргумент) и множителя 10 (второй аргумент).

При вызове bind2nd() происходит следующее: в четвертом аргументе алгоритм transformO рассчитывает получить операцию, которая вызывается с одним аргументом (элементом, с которым она выполняется). В пашем примере аргумент умножается на 10. Следовательно, мы должны объединить операцию с двумя аргументами и постоянную величину, которая всегда будет использоваться вместо второго аргумента; в результате будет получена нужная операция с одним аргументом. Именно это и делает адаптер bind2nd(). Он сохраняет операцию и второй аргумент в своих внутренних данных. Когда aлJopитм вызывает адаптер bind2nd для конкретного элемента, вызывается операция с переданным элементом (первый аргумент) и внутренним значением (второй аргумент), а возвращается полученный результат.

В аналогичном фрагменте выражение bind2nd(equai to<int>(),70) определяет критерий отбора элементов, заменяемых значением 42:

replace if (coll2.begin().coll2.end().

bi nd2nd(equal to<int>().70). 42);

Адаптер bind2nd вызывает бинарный предикат equaLto со вторым аргументом, равным 70. Тем самым определяется унарный предикат для элементов обрабатываемой коллекции.

Последняя команда действует аналогично. Выражение bind2nd(Iess<int>(),50) определяет элементы, которые должны быть удалены из коллекции. Команда удаляет все элементы со значением меньше 50. Результат выполнения программы выглядит так:

initialized: 9 8 7 6 5 4 3 2 1

transformed: 90 80 70 60 50 40 30 20 10

replaced: 9D 80 42 60 5D 40 3D 20 10

removed: 9D 80 60 50



1 ... 38 39 40 [ 41 ] 42 43 44 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика