home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 February / Chip_2002-02_cd1.bin / chplus / funktor / f18_stl_komplexni_priklad.cpp < prev    next >
C/C++ Source or Header  |  2002-01-02  |  4KB  |  92 lines

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <functional>
  8.  
  9. //---------------------------------------------------------------------------
  10. //  soubor:    f18_stl_komplexni_priklad.cpp
  11. //  autor:     Jaroslav Franek
  12. //  vytvoreno: 20011124
  13. //  copyright: (c) 2001 Jaroslav Franek
  14. //  umisteni:  Chip CD, rubrika Chip Plus, 02/02
  15. //  reference: Jak se na funktor vola... II. dil, Chip 02/02
  16. //  testovano v : Borland C++ Builder 5.0
  17. //                Microsoft Visual C++ .NET 7.0 (beta2)
  18. //
  19. //  komentar:  reseni ukolu z clanku
  20. //             komplexni priklad na adaptery
  21. //---------------------------------------------------------------------------
  22.  
  23. //---------------------------------------------------------------------------
  24. //
  25. //  pomocna funkce 'porovnej', analogie funkce 'strcmp'
  26. //  vraci: -1 kdyz x < y
  27. //          0 kdyz x == y
  28. //          1 kdyz y < x
  29. //  operator < implementuje ostre silne usporadani (zde pro typ std::string)
  30. //  v clanku "Nebojte se STL" v Chipu 12/01 naleznete
  31. //  definici ostreho slabeho usporadani
  32. //  ostre silne usporadani splnuje vsechno to co slabe + navic:
  33. //  pokud neplati x<y ani y<x, pak nutne x==y
  34. //  (tj. ekvivalence prvku splyva s rovnosti)
  35. //---------------------------------------------------------------------------
  36.  
  37. int porovnej(std::string x, std::string y)     // kvuli jistym vlastnostem C++
  38. {                                              // musim predavat parametry hodnotou
  39.    return (x < y) ? -1 : ((x > y) ? 1 : 0);    // coz neni zrovna nejlepsi,
  40. }                                              // ale pokud u retezcu funguje "cow"
  41.                                                // tak by to melo byt v pohode
  42. // pozn: "cow" == "copy on write", to znamena, ze i kdy musim vytvorit
  43. // kopie retezcu pri predani argumentu, nedojde ke kopirovani obsahu retezce,
  44. // nebot pri porovnani neprovadim zapis do retezce (nemenim ho),
  45. // puvodni retezec i kopie (argument) sdileji stejna data (ten text)...
  46.  
  47. //---------------------------------------------------------------------------
  48. //
  49. //  co to udela
  50. //
  51. //---------------------------------------------------------------------------
  52.  
  53. int main()
  54. {
  55.    // pripravime si vektor retezcu
  56.    std::vector<std::string> v;
  57.    v.push_back("Ahoj");
  58.    v.push_back("ja");
  59.    v.push_back("programuju");
  60.    v.push_back("v C++");
  61.    v.push_back("a");
  62.    v.push_back("ne v");
  63.    v.push_back("C");
  64.    v.push_back(", nebo jo");
  65.    v.push_back("taky trochu v ");
  66.    v.push_back("C");
  67.    v.push_back(".");
  68.  
  69.    // vypiseme na obrazovku                  // vypisujeme retezce, oddelime mezerou
  70.    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " "));
  71.    std::cout << std::endl;
  72.  
  73. //*******************************************************************
  74.    std::replace_if(v.begin(), v.end(),                          // vstupni rozsah
  75.                    std::not1(std::bind2nd(std::ptr_fun(porovnej), "C")),  // predikat
  76.                    "C++");   // cim to nahradit, kdyz predikat vrati 'true'
  77. //*******************************************************************
  78.  
  79.    // znovu na obrazovku                     // vypisujeme retezce, oddelime mezerou
  80.    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " "));
  81.    std::cout << std::endl;
  82.  
  83.    // co se stalo: kazdy vyskyt retezce "C" byl nahrazen retezcem "C++"
  84.    // to je vse, nic vic nic min...
  85.  
  86.    // nehledejte v uvedene vete nejaky hlubsi smysl...
  87.  
  88.    return 0;
  89. }
  90. //---------------------------------------------------------------------------
  91.  
  92.