ñòaíäaðòíîé áèáëèîòåêå îïðåäåëåíû øaáëîíû ôóíêöèîíaëüíûõ îáúåêòîâ äëя âñåõ aðèôìåòè÷åñêèõ îïåðaöèé, îïðåäåëåííûõ â яçûêå C++.
Таблица 13.2. Арифметические функциональные объекты
Имя
|
Тип
|
Результат
|
plus
|
áèíaðíûé
|
x + y
|
minus
|
áèíaðíûé
|
x – y
|
multiplies
|
áèíaðíûé
|
x * y
|
divides
|
áèíaðíûé
|
x / y
|
mOdulus
|
áèíaðíûé
|
x % y
|
negate
|
óíaðíûé
|
– x
|
Íèæå ïðèâåäåí øaáëîí îáúåêòa plus (îñòaëüíûå îáúåêòû îïèñaíû aíaëîãè÷íûì îáðaçîì):
template struCt plus : binary_funCtiOn{ T OperatOr()(COnst T& x, COnst T& y) COnst{
returnx+ y;
}
};
Ïîñêîëüêó ôóíêöèîíaëüíûå îáúåêòû èñïîëüçóþòñя áîëüøåé ÷añòüþ âìåñòå ñ aë- ãîðèòìaìè ñòaíäaðòíîé áèáëèîòåêè, ïðèìåðû ïðèìåíåíèя aðèôìåòè÷åñêèõ ôóíêöèîíaëüíûõ îáúåêòîâ ïðèâåäåíû â ðaçäåëå «Àëãîðèòìû» ía ñ. 356, 370.
Предикаты
 ñòaíäaðòíîé áèáëèîòåêå îïðåäåëåíû øaáëîíû ôóíêöèîíaëüíûõ îáúåêòîâ äëя îïåðaöèé ñðaâíåíèя è ëîãè÷åñêèõ îïåðaöèé, îïðåäåëåííûõ â яçûêå C++. Îíè âîçâðaùaþò çía÷åíèå òèïa bOOl, òî åñòü яâëяþòñя ïðåäèêaòaìè.
Таблица 13.3. Предикаты стандартной библиотеки
Имя
|
Тип
|
Результат
|
equal_tO
|
áèíaðíûé
|
x == y
|
nOt_equal_tO
|
áèíaðíûé
|
x != y
|
greater
|
áèíaðíûé
|
x > y
|
less
|
áèíaðíûé
|
x < y
|
greater_equal
|
áèíaðíûé
|
x >= y
|
less_equal
|
áèíaðíûé
|
x <= y
|
lOgiCal_and
|
áèíaðíûé
|
x && y
|
lOgiCal_Or
|
áèíaðíûé
|
x || y
|
lOgiCal_nOt
|
óíaðíûé
|
! x
|
Íèæå ïðèâåäåí øaáëîí îáúåêòa equal_tO (îñòaëüíûå îáúåêòû îïèñaíû aíaëîãè÷- íûì îáðaçîì):
template struCt equal_tO : binary_funCtiOn{
bOOl OperatOr()(COnst T& x, COnst T& y) COnst{ return x == y;
}
};
Ïðîãðaììèñò ìîæåò îïèñaòü ñîáñòâåííûå ïðåäèêaòû äëя îïðåäåëåíèя êðèòåðèåâ ñðaâíåíèя îáúåêòîâ. Ýòî íåîáõîäèìî, êîãäa êîíòåéíåð ñîñòîèò èç ýëåìåíòîâ ïîëüçîâaòåëüñêîãî òèïa. Íaïðèìåð, äëя îïèñaííîãî ía ñ. 183 êëañña mOnstr ïðåäè- êaò, ñðaâíèâaþùèé äâa îáúåêòa ïî çía÷åíèþ ïîëя ammO, èìååò âèä:
struCt mOnstr_less_ammO:
publiC binary_funCtiOn{ bOOl OperatOr ()(mOnstr & m1, mOnstr & m2){
return m1.get_ammO() < m2.get_ammO();
}
};
Ïðèìåðû ïðèìåíåíèя ïðåäèêaòîâ ïðèâåäåíû ía ñ. 338, 360, 363.
Отрицатели
Îòðèöaòåëè nOt1 è nOt2 ïðèìåíяþòñя äëя ïîëó÷åíèя ïðîòèâîïîëîæíîãî óíaðíî- ãî è áèíaðíîãî ïðåäèêaòa ñîîòâåòñòâåííî. Èñïîëüçîâaòü îòðèöaòåëè î÷åíü ïðî- ñòî. Íaïðèìåð, äëя òîãî ÷òîáû ïîëó÷èòü èíâåðñèþ ïðåäèêaòa less(), íóæíî çaïèñaòü âûðaæåíèå nOt2(less()). Îíî ýêâèâaëåíòíî greater_equal.
Îòðèöaòåëè ïðèìåíяþòñя äëя èíâåðòèðîâaíèя ïðåäèêaòîâ, çaäaííûõ ïîëüçîâa- òåëåì, ïîñêîëüêó äëя ñòaíäaðòíûõ ïðåäèêaòîâ áèáëèîòåêa ñîäåðæèò ñîîòâåòñò- âóþùèå èì ïðîòèâîïîëîæíûå îáúåêòû.
Ðaññìîòðèì ðåaëèçaöèþ îòðèöaòåëåé.  áèáëèîòåêå îïèñaíû ôóíêöèîíaëüíûå îáúåêòû unary_negate è binary_negate, яâëяþùèåñя ïîòîìêaìè unary_funCtiOn è binary_funCtiOn ñîîòâåòñòâåííî. Ýòè êëaññû ïðèíèìaþò â êa÷åñòâå ïaðaìåòða êîíñòðóêòîða îáúåêò, яâëяþùèéñя ïðåäèêaòîì òðåáóåìîãî òèïa:
template
Class unary_negate: publiC
unary_funCtiOn{ publiC:
expliCit unary_negate(COnst PrediCate& pred); bOOl OperatOr()
(COnst typename PrediCate::argument_type& x) COnst;
};
Îïåðaöèя () âîçâðaùaåò èíâåðñèþ ïðåäèêaòa. nOt1 è nOt2 îïðåäåëåíû êaê øaáëî- íû ôóíêöèé, ïðèíèìaþùèõ ïðåäèêaò è âîçâðaùaþùèõ ôóíêöèîíaëüíûé îáúåêò:
template
unary_negate
nOt1(COnst PrediCate& pred); template
binary_negate
nOt2(COnst PrediCate& pred);
Do'stlaringiz bilan baham: |