|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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.
|
|
||
|
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
|
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
||
| 1. |
Pacman linux Download: 5529x |
| 2. |
FreeBSD Download: 9747x |
| 3. |
PCLinuxOS-2010 Download: 9236x |
| 4. |
alcolix Download: 11711x |
| 5. |
Onebase Linux Download: 10399x |
| 6. |
Novell Linux Desktop Download: 0x |
| 7. |
KateOS Download: 6901x |
| 1. |
xinetd Download: 3031x |
| 2. |
RDGS Download: 937x |
| 3. |
spkg Download: 5938x |
| 4. |
LinPacker Download: 11124x |
| 5. |
VFU File Manager Download: 3747x |
| 6. |
LeftHand Mała Księgowość Download: 7979x |
| 7. |
MISU pyFotoResize Download: 3459x |
| 8. |
Lefthand CRM Download: 4243x |
| 9. |
MetadataExtractor Download: 0x |
| 10. |
RCP100 Download: 3755x |
| 11. |
Predaj softveru Download: 0x |
| 12. |
MSH Free Autoresponder Download: 0x |
linuxsoft.cz | Design:
www.megadesign.cz