|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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. |
FreeBSD Download: 4272x |
| 2. |
PCLinuxOS-2010 Download: 3176x |
| 3. |
alcolix Download: 6069x |
| 4. |
Onebase Linux Download: 4558x |
| 5. |
Novell Linux Desktop Download: 0x |
| 6. |
KateOS Download: 1548x |
| 7. |
AnkurBangla LiveDesktop Technology Preview Download: 1742x |
| 1. |
TURGEN SYSTEM Download: 505x |
| 2. |
Keyfrog Download: 1195x |
| 3. |
knas Download: 362x |
| 4. |
CPC4X Download: 3964x |
| 5. |
Scilab Download: 7194x |
| 6. |
Symphaty Download: 805x |
| 7. |
Drosera Download: 358x |
| 8. |
Esmska Download: 0x |
| 9. |
Cestovní príkaz Download: 0x |
| 10. |
Cestovné příkazy Download: 0x |
| 11. |
Kniha jízd - Speedy Download: 0x |
| 12. |
Ekonomický systém Kamar Download: 0x |
linuxsoft.cz | Design:
www.megadesign.cz
|
zákony online