home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 February
/
Chip_2002-02_cd1.bin
/
chplus
/
funktor
/
f22_podraz_citac.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-01-02
|
3KB
|
113 lines
//---------------------------------------------------------------------------
#include <iostream>
#include <vector>
#include <algorithm>
//---------------------------------------------------------------------------
// soubor: f22_podraz_citac.cpp
// autor: Jaroslav Franek
// vytvoreno: 20011125
// copyright: (c) 2001 Jaroslav Franek
// umisteni: Chip CD, rubrika Chip Plus, 02/02
// reference: Jak se na funktor vola... II. dil, Chip 02/02
// testovano v : Borland C++ Builder 5.0
//
// komentar: podraz - citac (viz clanek)
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// funktor - citac,
// verze ktera nefunguje spravne
//
//---------------------------------------------------------------------------
class cFunktor
{
public:
cFunktor()
: pocet_(0)
{
}
int operator ()(int x)
{
++pocet_;
// n∞jakΘ akce ...
return x;
}
int get_pocet() { return pocet_; }
void reset_pocet() { pocet_ = 0; }
private:
int pocet_;
// ...
};
//---------------------------------------------------------------------------
//
// funktor - citac, tentokrat fungujici,
// pozor: reference odkazuje nekam ven z funktoru, takze vsechny kopie
// budou odkazovat na to same misto
//
//---------------------------------------------------------------------------
class cFunktorX
{
public:
cFunktorX(int & counter)
: pocet_(counter)
{
reset_pocet();
}
int operator ()(int x)
{
++pocet_;
// n∞jakΘ akce ...
return x;
}
int get_pocet() { return pocet_; }
void reset_pocet() { pocet_ = 0; }
private:
int & pocet_;
// ...
};
//---------------------------------------------------------------------------
//
// kde je chyba?
//
//---------------------------------------------------------------------------
int main()
{
// nejdrive si pripravime pole
const int N = 9;
int pole[] = { -1, -2, 3, -4, 0, -6, 0, -8, 9 };
// a ted STL kontejner
std::vector<int> cisla(pole, pole + N); // N prvku, pole[i]
// ted nam nejde o to, jake tam jsou prvky, nebo, co se s nimi stane
// jde jen o to, kolikrat se zavola funktor
// mel by se zavolat N-krat
// podraz
cFunktor funktor;
funktor.reset_pocet();
std::transform(cisla.begin(), cisla.end(), cisla.begin(), funktor);
std::cout << "pocet volani = " << funktor.get_pocet() << std::endl;
// vzdycky vypise 0
// tohle udela, co chceme
int pocet;
cFunktorX funktorx(pocet);
funktorx.reset_pocet(); // tj. pocet = 0;
std::transform(cisla.begin(), cisla.end(), cisla.begin(), funktorx);
std::cout << "pocet volani = " << funktorx.get_pocet() << std::endl;
// tohle vypise N
return 0;
}
//---------------------------------------------------------------------------