home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 February
/
Chip_2002-02_cd1.bin
/
chplus
/
funktor
/
f18_stl_komplexni_priklad.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-01-02
|
4KB
|
92 lines
//---------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
//---------------------------------------------------------------------------
// soubor: f18_stl_komplexni_priklad.cpp
// autor: Jaroslav Franek
// vytvoreno: 20011124
// 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: reseni ukolu z clanku
// komplexni priklad na adaptery
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
// pomocna funkce 'porovnej', analogie funkce 'strcmp'
// vraci: -1 kdyz x < y
// 0 kdyz x == y
// 1 kdyz y < x
// operator < implementuje ostre silne usporadani (zde pro typ std::string)
// v clanku "Nebojte se STL" v Chipu 12/01 naleznete
// definici ostreho slabeho usporadani
// ostre silne usporadani splnuje vsechno to co slabe + navic:
// pokud neplati x<y ani y<x, pak nutne x==y
// (tj. ekvivalence prvku splyva s rovnosti)
//---------------------------------------------------------------------------
int porovnej(std::string x, std::string y) // kvuli jistym vlastnostem C++
{ // musim predavat parametry hodnotou
return (x < y) ? -1 : ((x > y) ? 1 : 0); // coz neni zrovna nejlepsi,
} // ale pokud u retezcu funguje "cow"
// tak by to melo byt v pohode
// pozn: "cow" == "copy on write", to znamena, ze i kdy musim vytvorit
// kopie retezcu pri predani argumentu, nedojde ke kopirovani obsahu retezce,
// nebot pri porovnani neprovadim zapis do retezce (nemenim ho),
// puvodni retezec i kopie (argument) sdileji stejna data (ten text)...
//---------------------------------------------------------------------------
//
// co to udela
//
//---------------------------------------------------------------------------
int main()
{
// pripravime si vektor retezcu
std::vector<std::string> v;
v.push_back("Ahoj");
v.push_back("ja");
v.push_back("programuju");
v.push_back("v C++");
v.push_back("a");
v.push_back("ne v");
v.push_back("C");
v.push_back(", nebo jo");
v.push_back("taky trochu v ");
v.push_back("C");
v.push_back(".");
// vypiseme na obrazovku // vypisujeme retezce, oddelime mezerou
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
//*******************************************************************
std::replace_if(v.begin(), v.end(), // vstupni rozsah
std::not1(std::bind2nd(std::ptr_fun(porovnej), "C")), // predikat
"C++"); // cim to nahradit, kdyz predikat vrati 'true'
//*******************************************************************
// znovu na obrazovku // vypisujeme retezce, oddelime mezerou
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
// co se stalo: kazdy vyskyt retezce "C" byl nahrazen retezcem "C++"
// to je vse, nic vic nic min...
// nehledejte v uvedene vete nejaky hlubsi smysl...
return 0;
}
//---------------------------------------------------------------------------