home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 February
/
Chip_2002-02_cd1.bin
/
chplus
/
funktor
/
f12_stl_operator.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-01-02
|
5KB
|
139 lines
//---------------------------------------------------------------------------
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>
#include <functional>
//---------------------------------------------------------------------------
// soubor: f12_stl_operator.cpp
// autor: Jaroslav Franek
// vytvoreno: 20011123
// 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
// Microsoft Visual C++ .NET 7.0 (beta2)
//
// komentar: stl funktory - operatory (a nejake bindery)
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// ruzne zpusoby pouziti v akci
//
//---------------------------------------------------------------------------
int main()
{
// nejdrive si pripravime kontejnery
const int N = 9;
int pole[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// a ted STL kontejnery
std::vector<int> cisla1(pole, pole + N); // tohle uz umime, cisla1-3
std::list<int> cisla2(pole, pole + N); // se inicializuji prvky pole 'pole'
std::deque<int> cisla3(pole, pole + N); //
// vypiseme si je na obrazovku,
std::cout << "cisla1 : ";
std::copy(cisla1.begin(), cisla1.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n"
"cisla2 : ";
std::copy(cisla2.begin(), cisla2.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n"
"cisla3 : ";
std::copy(cisla3.begin(), cisla3.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
//*******************************************************************
// k prvkum kontejneru cisla1 pricteme prvky kontejneru cisla2
//
std::transform(cisla1.begin(), cisla1.end(), cisla2.begin(), cisla1.begin(), std::plus<int>());
//*******************************************************************
// vypiseme
std::cout << "cisla1 = cisla1 + cisla2 : ";
std::copy(cisla1.begin(), cisla1.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
//*******************************************************************
// vynasobime vsechna cisla kontejneru cisla2 hodnotou -1
// zde si pomuzeme binderem
//
std::transform(cisla2.begin(), cisla2.end(), cisla2.begin(), std::bind1st(std::multiplies<int>(), -1));
//*******************************************************************
// vypiseme
std::cout << "cisla2 = (-1) * cisla2 : ";
std::copy(cisla2.begin(), cisla2.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
//*******************************************************************
// u vsech prvku cisla 3 zmenime znamenka
//
std::transform(cisla3.begin(), cisla3.end(), cisla3.begin(), std::negate<int>());
//*******************************************************************
// vypiseme
std::cout << "cisla3 = -cisla3 : ";
std::copy(cisla3.begin(), cisla3.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
// zjistime, jestli je v kontejneru prvek a, (zase za pomoci binderu)
//
int a = -7;
// funkce find_if vraci iterator na prvni prvek, ktery splnuje podminku;
// pokud zadny prvek nesplnuje podminku, vraci find_if iterator
// na prvni "prvek" za poslednim (one past end), neboli zde cisla1.end()
//
// cisla1
//*******************************************************************
if ( std::find_if(cisla1.begin(), cisla1.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla1.end() )
//*******************************************************************
{
std::cout << "cisla1 obsahuje prvek s hodnotou " << a;
}
else
{
std::cout << "cisla1 neobsahuje prvek s hodnotou " << a;
}
std::cout << std::endl;
// cisla2
//*******************************************************************
if ( std::find_if(cisla2.begin(), cisla2.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla2.end() )
//*******************************************************************
{
std::cout << "cisla2 obsahuje prvek s hodnotou " << a;
}
else
{
std::cout << "cisla2 neobsahuje prvek s hodnotou " << a;
}
std::cout << std::endl;
// cisla3
//*******************************************************************
if ( std::find_if(cisla3.begin(), cisla3.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla3.end() )
//*******************************************************************
{
std::cout << "cisla3 obsahuje prvek s hodnotou " << a;
}
else
{
std::cout << "cisla3 neobsahuje prvek s hodnotou " << a;
}
std::cout << std::endl;
// vsimnete si, ze je uplne jedno, jakeho je kontejner typu,
// kod vypada uplne stejne, meni se jen identifikator kontejneru
return 0;
}
//---------------------------------------------------------------------------