Zaawansowane CPP/Ćwiczenia 12: Używanie funktorów: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mirek (dyskusja | edycje)
Nie podano opisu zmian
Mirek (dyskusja | edycje)
Nie podano opisu zmian
Linia 66: Linia 66:
  result_type(_val);};
  result_type(_val);};
  };
  };
 
Do tego dochodzi jeszcze specjalizacja dla <tt>Result <nowiki> =</nowiki>    void</tt> i funkcje:
Do tego dochodzi jeszcze specjalizacja dla <tt>Result <nowiki> =</nowiki>    void</tt> i funkcje:


Linia 88: Linia 88:
     void operator<nowiki> =</nowiki>  (const T&) {};
     void operator<nowiki> =</nowiki>  (const T&) {};
   };
   };
 
której operator przypisania "połyka" swój argument.
której operator przypisania "połyka" swój argument.
Kod znajduje się w pliku [http://osilek.mimuw.edu.pl/images/4/45/Dev_null.h dev_null.h].
Kod znajduje się w pliku [http://osilek.mimuw.edu.pl/images/4/45/Dev_null.h dev_null.h].
Linia 101: Linia 101:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Iterator  
Iterator  
 
  template<typename F,typename T>   
  template<typename F,typename T>   
  class exec_iterator_t: public std::iterator<std::output_iterator_tag,T>  
  class exec_iterator_t: public std::iterator<std::output_iterator_tag,T>  
  {
  {
   F _fun;
   F _fun;
 
oparty jest o zagnieżdżoną  klasę proxy:
oparty jest o zagnieżdżoną  klasę proxy:
 
  struct do_it {
  struct do_it {
     exec_iterator_t *_parent;
     exec_iterator_t *_parent;
Linia 119: Linia 119:
przekazanej. Operator <tt>*</tt> zwraca obiekt proxy, a operatory  
przekazanej. Operator <tt>*</tt> zwraca obiekt proxy, a operatory  
<tt>++</tt> nie robią nic:
<tt>++</tt> nie robią nic:
 
 
  public:
  public:
   exec_iterator_t(F fun):_fun(fun),_proxy(this) {};
   exec_iterator_t(F fun):_fun(fun),_proxy(this) {};
Linia 128: Linia 128:


Do utworzenia iteratora używamy szablon funkcji
Do utworzenia iteratora używamy szablon funkcji
 
 
  template<typename T,typename F>  
  template<typename T,typename F>  
  exec_iterator_t<F,T> exec_iterator(F f){
  exec_iterator_t<F,T> exec_iterator(F f){

Wersja z 11:41, 25 wrz 2006

Ćwiczenie 1

Napisz algorytm for_each który działałby na dwu zakresach.

template<typename InputIterator1,
         typename InputIterator2,
         typename BinaryFunction op> 
BinaryFunction for_each(InputIterator1 first1,
                        InputIterator1 last1,
                        InputIterator2 first2,
                        BinaryFunction op);

Algorytm ma działać tak jak standardowy for_each, tyle że funkcja op ma być stosowana do par elementów:

op(*first1,*first2);
op(*(first1+1),*(first2+1);
...
Rozwiązanie

Ćwiczenie 2

Zaimplementuj opisany na wykładzie adapter, który opakowuje funkcję lub funktor, ignorując zwracaną przez nie wartość,, i zwracający zamiast niej jakąś wartość wybranego typu. Np.:

double f(int);
adapt(f,7)(0);

wywołuje f(0) i zwraca 7.

double f(int);
adapt(f)(0);

wywołuje f(0) i nie zwraca żadnej wartości.

Rozwiązanie

Ćwiczenie 3

Napisz iterator, który nic nie robi, ignorując przypisywane do niego elementy.

Rozwiązanie

Ćwiczenie 4

Zaimplementuj opisany w wykładzie iterator, który działa podaną funkcją na przypisywane obiekty.

Rozwiązanie