copy (k3...

Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
begin(),k3.end(),output);
cout <<"\n iloczyn skalarny k1.-k2 : ";
cout << inner_product(k1.begin(),k1.end(), k3.begin(),0)<<endl;
cout <<"\n odwrotny iloczyn skalarny k1.k2 : ";
cout << inner_product(k1.begin(),k1.end(), k2.rbegin(),0)<<endl;

getche();
return 0;
}

W wyniku działania program otrzymujemy następujący komunikat:


zbior k1 : 1 2 3 4 5

zbior k2 : 6 7 8 9 10
iloczyn skalarny k1.k2 : 130
zanegowany k2 : -6 -7 -8 -9 -10
iloczyn skalarny k1.-k2 : -130
odwrocony iloczyn skalarny k1.k2 : 110

Dla dwóch zbiorów:

k1 : 1 2 3 4 5
k2 : 6 7 8 9 10

program korzystając z algorytmu inner_product():

cout << inner_product(k1.begin(),k1.end(), k2.begin(),0)<<endl;

liczy iloczyn skalarny następująco:

k1.k2 = 0 + (1*6) + (2*7) + (3*8) + (4*9) + ( 5*10)= 6+14+24+36+50 = 130
164
5. Algorytmy
Możemy odwrócić porządek w drugim zbiorze, aby otrzymać inną postać
iloczynu skalarnego ( korzystamy z funkcji rbegin()) :


cout << inner_product(k1.begin(),k1.end(), k2.rbegin(),0)<<endl;

W tym przypadku iloczyn skalarny liczony jest następująco:

k1.k2 = 0 + (1*10) + (2*9) + (3*8) + (4*7) + ( 5*6)= 10+18+24+28+30 = 110

W instrukcji :


transform(k3.begin(),k3.end(),k3.begin(),negate<int>());

wykorzystaliśmy
algorytm
modyfikujący
transform()
z
funktorem
negate<typ>. Wywołanie tego algorytmu tworzy zbiór z zanegowanymi
wszystkimi elementami. Na marginesie zauważmy, że algorytm transform()
może mieć wiele zastosowań. Na przykład dla obliczenia pierwiastka
kwadratowego z każdego elementu kolekcji można by użyć funktora sqrt<typ>:


transform(k3.begin(),k3.end(),k3.begin(),sqrt<int>());

Pamiętajmy, że zawsze możemy tworzyć także własne funktory.








ROZDZIAŁ 6
OBIEKTY FUNKCYJNE
6.1. Wstęp.................................................................................................... 166
6.2. Opis obiektów funkcyjnych ................................................................. 173
6.3. Zastosowania obiektów funkcyjnych unarnych ................................... 178
6.4. Zastosowania obiektów funkcyjnych binarnych .................................. 181


166
6. Obiekty funkcyjne
6.1. Wstęp
Obiekty funkcyjne (zwane także funktorami) są obiektami klasy
implementującej operator(). Obiekty funkcyjne (ang. function objects) są bardzo
przydatne w programach wykorzystujących metody kontenerów oraz
wspomagają działania algorytmów STL. Na poziomie pojęciowym, obiekty
funkcje są obiektami działającymi jak funkcje. Choć funkcje i wskaźniki także
mogą być klasyfikowane, jako obiekty funkcyjne, to obiekty klasy
implementującej operator() są bardziej elastyczne i znacznie szybciej działające.
Wiele funktorów, takich jak na przykład less lub minus dostarcza biblioteka STL. Użytkownik może także implementować własne funktory.
Mamy dwa typy obiektów funkcyjnych: jednoargumentowe (unarne) i
dwuargumentowe (binarne). Zawsze należy sprawdzić, jakiego typu funktor jest
wymagany przez konkretny algorytm lub metodę. Te dwa typy są umieszczone
w STL i formalnie mają postać (A.Stepanov):


template <class Arg, class Result>

struct unary_function {
typedef Arg argument_type;


typedef Result result_type;

};





template <class Arg1, calss Arg2, class Result>

struct binary_function {
typedef Arg1 first_argument_type;


typedef Arg2 second_argument_type;


typedef Result result_type;

};


Biblioteka STL dostarcza następujące obiekty funkcyjne do wykonywania
operacji arytmetycznych:

template <class T>
struct plus : binary_function<T, T, T> {

T operator() (const T& x, const T& y) const {return x + y; }

template <class T>
struct minus : binary_function<T, T, T> {

T operator() (const T& x, const T& y) const {return x - y; }
Powered by wordpress | Theme: simpletex | © Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.