|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operátor | Odpovídající funktor |
+ | plus |
- | minus |
* | multiplies |
/ | divides |
% | modulus |
> | greater |
< | less |
>= | greater_equal |
<= | less_equal |
== | equal_to |
!= | not_equal_to |
&& | logical_and |
|| | logical_or |
! | logical_not |
Všechny výše uvedené, předdefinované funktory, jsou přizpůsobivé. Pokud je objekt funktoru přizpůsobivý, znamená to, že obsahuje
položky, které jsou vytvořené pomocí příkazu typedef. Mezi tyto položky patří first_argument_type,
second_argument_type a result_type. Jinak řečeno, například návratovým typem objektu minus<double>
je minus<double>::result_type. Pro lepší pochopení opět uvedu jednoduchý příklad.
Mějme vektor v1, jehož každý prvek chceme vynásobit číslem 3.14. K tomu budeme potřebovat opět verzi funkce transform,
které mimo jiných parametrů musíme předat i unární funkci. Z předchozí tabulky už víme, že o násobení se postará funktor
multiplies, nicméně jde o binární funkci, která se pro náš případ nehodí. Potřebujeme tedy tzv. funkční adaptér,
který nám převede funktor se dvěma parametry na funktor, která má jeden parametr. K řešení tohoto problému se v C++ používají
třídy binder1st a binder2nd. Na následujícím ukázce je kód, který vynásobí každý prvek vektoru
číslem 3.14.
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
const double pi = 3.14;
const int N = 5;
double myArray[N] = {1, 3, 5, 7, 9};
vector<double> v1(myArray, myArray + 5);
ostream_iterator<double> it(cout, " ");
transform(v1.begin(), v1.end(), it, bind1st(multiplies<double>(), pi));
return 0;
}
Třída binder1st obsahuje námi použitou funkci bind1st, díky níž jsme binární funkci multiplies
převedli na unární funkci a mohli jsme ji potom použít na vyřešení našeho problému. Myslím, že již není nutné uvádět příklad na
použítí bind2nd, neboť funguje analogicky funkci bind1st.
To by bylo k funktorům zhruba vše. Doufám, že jste jim porozuměli, neboť některé věci se na první pohled mohou jevit jako poněkud těžkopádné, přitom to není nic složitého a je dobré funktorům rozumět.
|
|
||
|
DISCUSSION
For this item is no comments. |
||
|
Add comment is possible for logged registered users.
|
||
| 1. |
Pacman linux Download: 5546x |
| 2. |
FreeBSD Download: 9762x |
| 3. |
PCLinuxOS-2010 Download: 9256x |
| 4. |
alcolix Download: 11735x |
| 5. |
Onebase Linux Download: 10419x |
| 6. |
Novell Linux Desktop Download: 0x |
| 7. |
KateOS Download: 6921x |
| 1. |
xinetd Download: 3047x |
| 2. |
RDGS Download: 937x |
| 3. |
spkg Download: 5966x |
| 4. |
LinPacker Download: 11164x |
| 5. |
VFU File Manager Download: 3765x |
| 6. |
LeftHand Mała Księgowość Download: 8002x |
| 7. |
MISU pyFotoResize Download: 3476x |
| 8. |
Lefthand CRM Download: 4270x |
| 9. |
MetadataExtractor Download: 0x |
| 10. |
RCP100 Download: 3773x |
| 11. |
Predaj softveru Download: 0x |
| 12. |
MSH Free Autoresponder Download: 0x |
linuxsoft.cz
| Design: www.megadesign.cz