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

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <list>
  7. #include <deque>
  8. #include <functional>
  9.  
  10. //---------------------------------------------------------------------------
  11. //  soubor:    f12_stl_operator.cpp
  12. //  autor:     Jaroslav Franek
  13. //  vytvoreno: 20011123
  14. //  copyright: (c) 2001 Jaroslav Franek
  15. //  umisteni:  Chip CD, rubrika Chip Plus, 02/02
  16. //  reference: Jak se na funktor vola... II. dil, Chip 02/02
  17. //  testovano v : Borland C++ Builder 5.0
  18. //                Microsoft Visual C++ .NET 7.0 (beta2)
  19. //
  20. //  komentar:  stl funktory - operatory (a nejake bindery)
  21. //---------------------------------------------------------------------------
  22.  
  23. //---------------------------------------------------------------------------
  24. //
  25. //  ruzne zpusoby pouziti v akci
  26. //
  27. //---------------------------------------------------------------------------
  28.  
  29. int main()
  30. {
  31.    // nejdrive si pripravime kontejnery
  32.    const int N = 9;
  33.    int pole[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  34.  
  35.    // a ted STL kontejnery
  36.    std::vector<int> cisla1(pole, pole + N); // tohle uz umime, cisla1-3
  37.    std::list<int> cisla2(pole, pole + N);   // se inicializuji prvky pole 'pole'
  38.    std::deque<int> cisla3(pole, pole + N);  //
  39.  
  40.    // vypiseme si je na obrazovku,
  41.    std::cout << "cisla1 : ";
  42.    std::copy(cisla1.begin(), cisla1.end(), std::ostream_iterator<int>(std::cout, "  "));
  43.    std::cout << "\n"
  44.                 "cisla2 : ";
  45.    std::copy(cisla2.begin(), cisla2.end(), std::ostream_iterator<int>(std::cout, "  "));
  46.    std::cout << "\n"
  47.                 "cisla3 : ";
  48.    std::copy(cisla3.begin(), cisla3.end(), std::ostream_iterator<int>(std::cout, "  "));
  49.    std::cout << std::endl;
  50.  
  51. //*******************************************************************
  52.    //  k prvkum kontejneru cisla1 pricteme prvky kontejneru cisla2
  53.    //
  54.    std::transform(cisla1.begin(), cisla1.end(), cisla2.begin(), cisla1.begin(), std::plus<int>());
  55. //*******************************************************************
  56.  
  57.    // vypiseme
  58.    std::cout << "cisla1 = cisla1 + cisla2 : ";
  59.    std::copy(cisla1.begin(), cisla1.end(), std::ostream_iterator<int>(std::cout, "  "));
  60.    std::cout << std::endl;
  61.  
  62. //*******************************************************************
  63.    // vynasobime vsechna cisla kontejneru cisla2 hodnotou -1
  64.    // zde si pomuzeme binderem
  65.    //
  66.    std::transform(cisla2.begin(), cisla2.end(), cisla2.begin(), std::bind1st(std::multiplies<int>(), -1));
  67. //*******************************************************************
  68.  
  69.    // vypiseme
  70.    std::cout << "cisla2 = (-1) * cisla2 : ";
  71.    std::copy(cisla2.begin(), cisla2.end(), std::ostream_iterator<int>(std::cout, "  "));
  72.    std::cout << std::endl;
  73.  
  74. //*******************************************************************
  75.    // u vsech prvku cisla 3 zmenime znamenka
  76.    //
  77.    std::transform(cisla3.begin(), cisla3.end(), cisla3.begin(), std::negate<int>());
  78. //*******************************************************************
  79.  
  80.    // vypiseme
  81.    std::cout << "cisla3 = -cisla3 : ";
  82.    std::copy(cisla3.begin(), cisla3.end(), std::ostream_iterator<int>(std::cout, "  "));
  83.    std::cout << std::endl;
  84.  
  85.    //  zjistime, jestli je v kontejneru prvek a, (zase za pomoci binderu)
  86.    //
  87.    int a = -7;
  88.  
  89.    //  funkce find_if vraci iterator na prvni prvek, ktery splnuje podminku;
  90.    //  pokud zadny prvek nesplnuje podminku, vraci find_if iterator
  91.    //  na prvni "prvek" za poslednim (one past end), neboli zde cisla1.end()
  92.    //
  93.  
  94.    // cisla1
  95. //*******************************************************************
  96.    if ( std::find_if(cisla1.begin(), cisla1.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla1.end() )
  97. //*******************************************************************
  98.    {
  99.       std::cout << "cisla1 obsahuje prvek s hodnotou " << a;
  100.    }
  101.    else
  102.    {
  103.       std::cout << "cisla1 neobsahuje prvek s hodnotou " << a;
  104.    }
  105.    std::cout << std::endl;
  106.  
  107.    // cisla2
  108. //*******************************************************************
  109.    if ( std::find_if(cisla2.begin(), cisla2.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla2.end() )
  110. //*******************************************************************
  111.    {
  112.       std::cout << "cisla2 obsahuje prvek s hodnotou " << a;
  113.    }
  114.    else
  115.    {
  116.       std::cout << "cisla2 neobsahuje prvek s hodnotou " << a;
  117.    }
  118.    std::cout << std::endl;
  119.  
  120.    // cisla3
  121. //*******************************************************************
  122.    if ( std::find_if(cisla3.begin(), cisla3.end(), std::bind2nd(std::equal_to<int>(), a)) != cisla3.end() )
  123. //*******************************************************************
  124.    {
  125.       std::cout << "cisla3 obsahuje prvek s hodnotou " << a;
  126.    }
  127.    else
  128.    {
  129.       std::cout << "cisla3 neobsahuje prvek s hodnotou " << a;
  130.    }
  131.    std::cout << std::endl;
  132.  
  133.    // vsimnete si, ze je uplne jedno, jakeho je kontejner typu,
  134.    // kod vypada uplne stejne, meni se jen identifikator kontejneru
  135.  
  136.    return 0;
  137. }
  138. //---------------------------------------------------------------------------
  139.