home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 December / Chip_2001-12_cd1.bin / chplus / cpp / stl1.cpp < prev   
C/C++ Source or Header  |  2001-10-25  |  4KB  |  111 lines

  1. //---------------------------------------------------------------------------
  2. //   autor: Jaroslav Franek
  3. //   datum: 25.10.2001
  4. //   o co jde: priklad pouziti knihovny STL,
  5. //             doplnek ke clanku v Chipu
  6. //   vytvoreno a odladeno v Borland C++ Builderu
  7. //   mozna nebude fungovat v Microsoft Visual C++ v6.0 (vnorene sablony)
  8. //---------------------------------------------------------------------------
  9.  
  10. //#pragma hdrstop
  11.  
  12. #include <vector>
  13. #include <list>
  14. #include <stack>
  15. #include <algorithm>
  16. #include <iostream>
  17.  
  18. //---------------------------------------------------------------------------
  19. int main()
  20. {
  21.    int pole[20] = { 12, 32, 55, 11, 26,
  22.                     33, 48, 56, 27, 13,
  23.                     18, 19,  7, 99, 17,       // minimum je '7'
  24.                     29, 91, 74, 10, 24 };
  25.  
  26.    std::cout << "Vypis pole : ";
  27.    // jak vypsat pole a nepouzit smycku?
  28.    // co takhle zkopirovat ty prvky na vystup
  29.    // pomoci algoritmu copy a vystupniho iteratoru
  30.    std::copy(pole, pole + 20, std::ostream_iterator<int>(std::cout, "  "));
  31.    std::cout << std::endl;
  32.  
  33.    // minimalni prvek v poli je...
  34.    int min_pole = *std::min_element(pole, pole + 20);
  35.    std::cout << "Minimum pole je " << min_pole << std::endl;
  36.  
  37.    // vytvorim vektor a zaroven
  38.    // provedu jeho inicializaci
  39.    // pomoci prvku pole 'pole'
  40.    std::vector<int> vec(pole, pole + 20);
  41.  
  42.    std::cout << "Vypis vektoru : ";
  43.    // jak vypsat vektor a nepouzit smycku?
  44.    // to uz umime
  45.    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
  46.    std::cout << std::endl;
  47.  
  48.    // minimalni prvek ve vektoru je...
  49.    int min_vec = *std::min_element(vec.begin(), vec.end());
  50.    std::cout << "Minimum vektoru je " << min_vec << std::endl;
  51.  
  52.    // minimum z druheho az pateho prvku
  53.    // rozsahy udane pomoci iteratoru maji
  54.    // vzdy charakter polouzavrenych (nebo polootevrenych)
  55.    // intervalu [prvni prvek, jeden prvek za)
  56.    // tzn: vec.begin()+1 je iterator na 2. prvek a patri do zpracovavane oblasti
  57.    // vec.begin()+5 je iterator na 6. prvek a nepatri do zpracovavane oblasti
  58.    int min_vec_2az5 = *std::min_element(vec.begin() + 1, vec.begin() + 5);
  59.    std::cout << "Minimum vektoru (2. az 5.prvku) je " << min_vec_2az5 << std::endl;
  60.  
  61.    // a ted 'trik' se seznamem
  62.    // vytvorim ho analogicky jako vektor,
  63.    // ale k inicializaci pouziju vektor 'vec'
  64.    std::list<int> seznam(vec.begin(), vec.end());
  65.  
  66.    std::cout << "Vypis seznamu : ";
  67.    // jak vypsat seznam a nepouzit smycku?
  68.    // uplne stejne (genericke programovani v plne krase...)
  69.    std::copy(seznam.begin(), seznam.end(), std::ostream_iterator<int>(std::cout, "  "));
  70.    std::cout << std::endl;
  71.  
  72.    // minimalni prvek v seznamu je...
  73.    int min_seznam = *std::min_element(seznam.begin(), seznam.end());
  74.    std::cout << "Minimum seznamu je " << min_seznam << std::endl;
  75.  
  76.    // odstranim nejmensi prvek
  77.    // (zopakuji volani funkce min_element,
  78.    // normalne bych si ten iterator predtim ulozil,
  79.    // ale aby to bylo stejne jako v clanku, tak:)
  80.    seznam.erase(std::min_element(seznam.begin(), seznam.end()));
  81.  
  82.    std::cout << "Vypis seznamu (ze se opravdu odstranil minimalni prvek) : ";
  83.    // tohle uz tu bylo...
  84.    std::copy(seznam.begin(), seznam.end(), std::ostream_iterator<int>(std::cout, "  "));
  85.    std::cout << std::endl;
  86.  
  87.    // jak se tedy uklada ten iterator? takhle
  88.    // inicializace prima (chybi hacek nad r :-)
  89.    std::list<int>::iterator min_seznam_iter(std::min_element(seznam.begin(), seznam.end()));
  90.    // nebo taky takhle
  91.    // inicializace kopirovanim
  92. //   std::list<int>::iterator min_seznam_iter = std::min_element(seznam.begin(), seznam.end());
  93.  
  94.    // iterator se dereferencuje jako ukazatel
  95.    std::cout << "Minimum seznamu po odebrani minimalniho prvku je "
  96.              << *min_seznam_iter << std::endl;
  97.  
  98.    // a jeste zasobnik
  99.    std::stack<int, std::vector<int> > zasobnik;
  100.    zasobnik.push(10);
  101.    std::cout << "Na vrcholu zasobniku je " << zasobnik.top() << std::endl;
  102.    zasobnik.pop();
  103.  
  104.    // To byla ukazka prace s poli, seznamy a vektory.
  105.    // Videli jste nekde nejakou smycku (for, while,...)?
  106.    // Vite, kde se pouzili vnorene sablony?
  107.  
  108.    return 0;
  109. }
  110. //---------------------------------------------------------------------------
  111.