Professional Documents
Culture Documents
ORGANIZAN
Pednka pst tden odpad (28.10.)
sttn svtek cvien (s vjimkou pondl) normln probhaj pondln skupiny si maj monost nahradit cvien v jin skupin
MANIPULTORY
MANIPULTORY PROUD
#include <iomanip> Zpsob jak ovlivnit chovn proud oproti defaultnmu
formtovn vkldanch dat (typicky sel) zarovnn textu vstupu chovn internho vyrovnvacho pole
Modifiktory, vod STL, 21.10.2013
Viz. ukzka
// Pi has3.1415927410125732422value
cout << "Pi has" << std::setprecision(20) << PI << "value" << endl;
// Pi has3.141500value
cout << "Pi has" << std::setprecision(6) << std::fixed << 3.1415 << "value" << endl;
// Pi has3.14159value
cout << "Pi has" << std::setprecision(4) << std::scientific << 3.1415 << "value" << endl; cout.unsetf(ios::scientific); return 0; 7
Metoda setbase()
argument 8, 10 nebo 16
10
11
pokud nen specifikovan dlka dostaten, automaticky se zvt na nejmen potebnou velikost
12
int main() { const float PI = 3.14159265358979323846264338327950288419716939937510582097494459230781 cout << "Pi has" << PI << "value" << endl; // Pi has3.14159value cout << "Pi has" << std::setw(10) << PI << "value" << endl; // Pi has 3.14159value cout << "Pi has" << PI << "value" << endl; // Pi has3.14159value cout << "Pi has" << std::setw(10) << std::left << PI << "value" << endl; // Pi has3.14159 value return 0; }
13
int main() { cout.setf(ios::hex, ios::basefield); cout.setf(ios::showbase); cout << 255 << endl; // 0xff cout.unsetf(ios::showbase); cout << 255 << endl; // ff
float value2 = 3; cout << std::showpoint << value2 << endl; // 3.000 logick hodnoty slovn cout << std::boolalpha << (5 == 4) << endl; // false 14 cout << std::noboolalpha << (5 == 4) << endl; // 0 return 0; }
16
17
18
2.
3.
19
CO JE GENERICK PROGRAMOVN?
Typov nezvisl kd Okoln kd manipulujc s objektem zstv stejn nezvisle na typu objektu
float value; int value; CComplexNumber value; cout << value;
20
21
22
23
Kontejnery
objekty, kter uchovvaj jin objekty bez ohledu na typ kontejnery rzn optimalizovny pro rzn typy loh nap. std::string (uchovv pole znak) nap. std::list (zetzen seznam)
Modifiktory, vod STL, 21.10.2013
2.
Itertory
zpsob (omezenho) pstupu k prvkm kontejneru nap. std::string.begin() peten opertory ++ pro pesun na dal prvek atd.
3.
Algoritmy
bn operace vykonan nad celmi kontejnery nap. sort(str.begin(), str.end())
A mnoh dal
24
KONTEJNERY
25
SYNTAXE STL
STL obsahuje velk mnostv td a metod Dleit je umt hledat
http://www.cplusplus.com/reference/stl/
A rozumt syntaxi
http://www.cplusplus.com/reference/stl/list/ template <class T, class Allocator = allocator<T>> class list; nap. list<int> seznam; jmno kontejneru nap. list<string> seznam;
klov slovo pro ablony zpsob alokace v pamti vtinou pouita defaultn monost (tj. nevypluje se)
26
KONTEJNERY - MOTIVACE
Vtinu dat je nutn uchovvat ve sloitjch strukturch
Modifiktory, vod STL, 21.10.2013
27
C++ obsahuje nejbnj zpsoby reprezentace dat pmo v zkladn knihovn (kontejnery) Jsou definovny spolen funkce pro nejastj operace
je dky tomu snadn vymnit druh kontejneru
#include <vector> #include <list> int main() { std::vector<int> kontejner(10); 28 // std::list<int> kontejner(10); kontejner.push_back(123); return 0; }
29
Itertory
begin(), end(), rbegin()
30
KONTEJNER VECTOR
...
Syntaxe pouit
#include <vector> int main() { std::vector<int> vect(10); return 0; }
http://www.cplusplus.com/reference/stl/vector/
31
32
http://www.cplusplus.com/reference/stl/vector/
Dv peten verze opertoru []. Prvn vrac referenci na n+1 prvek vektoru. Reference je nutn, aby se vraz dal pout jako l-hodnota.
nap. vect[10] = 4;
34
VECTOR
#include <iostream> #include <vector> using std::vector; using std::cout; using std::endl;
UKZKY
hlavikov soubor pro kontejner vector instance ablony s typem int, poten velikost 10
Modifiktory, vod STL, 21.10.2013
int main() { const int ARRAY_LEN = 10; vector<int> vect(ARRAY_LEN); // Fill with some data for (int i = 0; i < ARRAY_LEN; i++) { vect[i] = i + 10; } cout << "Vector size: " << vect.size(); cout << "Value of 10. element: " << vect[9];
// problem: reading outside allocated array cout << "Value of 31. element: " << vect[30]; // no bounds checking //cout << "Value of 31. element: " << vect.at(30); // with bounds checking // Add something to the end of vector vect.push_back(97); vect.push_back(98); vect.push_back(99); cout << "Vector size: " << vect.size() << endl; cout << "Value of last element: " << vect[vect.size() - 1] << endl; // Play with vector capacity (reserved space) cout << "Vector capacity: " << vect.capacity() << endl; vect.reserve(100); cout << "Vector size: " << vect.size() << endl; cout << "Vector capacity: " << vect.capacity() << endl; return 0; }
poet prvk ve vektoru pidn dodatench prvk zvten pedalokovan 35 maximln kapacity vektoru
KOPROVN KONTEJNER
Kontejnery lze koprovat (opertor =) Dochz ke kopii vech poloek Jednotliv poloky jsou koprovny jako hodnoty
tj. plytk kopie nen problm u primitivnch datovch typ nen problm u typ s vhodnm koprovacm konstruktorem
36
KONTEJNER LIST
Spojovan seznam pro rychl vkldn/odebrn
pouvn velice asto spojovan seznam schrnek jednotliv schrnky obsahuj zvolen datov typ
Modifiktory, vod STL, 21.10.2013
37
Lze vloit i sekvence prvk zrove. Od itertoru first po dosaen itertoru last.
38
39
40
KONTEJNER MAP
Motivace:
chceme rychl pstup k prvku (jako u pole), ale nemme index nap. UO studenta dle jeho jmna: jmno UO idea: jmno hash(jmno) index pole[index] UO
Kontejner pro rychl pstup k hodnot prvku dle jeho klov hodnoty (znte z databz)
realizovno prostednictvm asociativnch pol (haovac tabulky) vdy dvojice kl a hodnota instance ablony specifikujeme dvma datovmi typy typ kle a typ hodnoty
http://www.cplusplus.com/reference/stl/map/
41
KONTEJNER MAP(2)
Obsahuje dvojici hodnot
pro sekvenn prochzen je nutn speciln itertor
#include <map> int main() { std::map<string, int> myMap; return 0; }
42
// Another way of insert myMap["Lenka Slicna"] = 2; // if key does not exist yet, it is created myMap["Lenka Slicna"] = 1; // if key already exists, just set associated value cout << "Map size: " << myMap.size(); // Access value by key "Tonda Flakac" cout << "Tonda Flakac: " << myMap["Tonda Flakac"];
43
list
pro ast vkldn nkam doprosted
map, multimap
pokud potebujete asociativn pole (klhodnota)
bitset
pro pole bit s ohledem na pam vhodnj ne vector<bool>
44
pokud budeme vkldat 1000 prvk, je zbyten provdt 100x zvtovn vyuijte reserve(1000); nebo pmo v konstruktoru std::list<int> myList(1000);
45
ADAPTORY
Zmn defaultn chovn kontejneru STL adaptory
Modifiktory, vod STL, 21.10.2013
stack zsobnk LIFO #include <stack> queue fronta FIFO #include <queue> priority_queue prioritn fronta FIFO #include <queue>
46
ADAPTORY UKZKA
#include <iostream> #include <stack> using std::cout; using std::endl;
zmna defaultnho kontejneru POZOR: koncov zobky mus bt > >, ne >> (opertor vstupu) Pozn. Od C++11 u mohou bt zobky za sebou (peklada rozli dle kontextu)
int main() { std::stack<int> myStack; std::stack<int, std::list<float> > myStack2; myStack.push(10); myStack.push(2); myStack.push(35); myStack.push(14); while (!myStack.empty()) { cout << myStack.top() << endl; myStack.pop(); } return 0; }
47
ITERTORY
48
ITERTORY - MOTIVACE
Nstroj pro pstup k polokm danho kontejneru Lze si pedstavit jako inteligentn ukazatel na poloku kontejneru Ne vdy je dostupn opertor []
u nkterch kontejner nelze pmo urit, kter poloka je i-t (resp. takov azen nem pro uivatele vznam) nap. kontejner map
ITERTORY - SYNTAXE
std::jmno_tdy<parametry_ablony>::iterator std::list<int>::iterator iter; std::map<string, int>::iterator iter; Kontejnery maj alespo metody begin() a end()
begin() vrt itertor na prvn poloku end() vrt itertor tsn za posledn polokou peten i pro const varianty (peklada rozli dle kontextu) C++11 pidv cbegin() a cend() pro explicitn specifikaci
std::list<int>::iterator iter; for (iter = myList.begin(); iter != myList.end(); iter++) { cout << *iter << endl; }
50
51
Opertor *
itertor je forma ukazatele => derefence Jak je rozdl mezi iter = a *iter = ?
Opertor ->
nap. map<typ_kl, typ_hodnota>::iterator iter; kl = iter->first; hodnota = iter->second;
52
v.begin()
v.end()
v.size() v.capacity()
rezervovno
53
ITERTORY - PM PSTUP
Nkter kontejnery umouj pstup dle indexu
opertor []
Modifiktory, vod STL, 21.10.2013
54
insert(iterator, hodnota);
55
// Create small vector and fill ascendingly std::vector<int> myVect(10); for (unsigned int i = 0; i < myVect.size(); i++) myVect[i] = i; // Print via direct access for (unsigned int i = 0; i < myVect.size(); i++) { cout << myVect[i] << endl; }
// Print via iterator std::vector<int>::iterator iter2; for (iter2 = myVect.begin(); iter2 != myVect.end(); iter2++) { 56 cout << *iter << endl; }
TYPY ITERTOR
vstupn (istream_iterator)
jen ten (nemodifikuje kontejner)
Modifiktory, vod STL, 21.10.2013
vstupn (ostream_iterator)
jen zpis (neumouje ten, jen zpis)
57
const_iterator
pro pouit s konstantnmi objekty (nelze mnit odkazovan prvek)
58
REVERZN ITERTOR
Obrac vznam opertor ++ a -std::kontejner::reverse_iterator Vyuit metod rbegin()a rend()
// Wrong: naive print from end will not print first item for (iter = myList.end(); iter != myList.begin(); --iter) cout << *iter << endl; }
// Use reverse iterator std::list<int>::reverse_iterator riter; for (riter = myList.rbegin(); riter != myList.rend(); riter++) { cout << *riter << endl; }
59
ITERTORY - POZNMKY
Itertor abstrahuje koncept prochzen a manipulace pro rzn kontejnery Mnoina podporovanch itertor ale nen stejn pro vechny kontejnery
nelze vdy pouze vymnit typ kontejneru
me st/zapisovat za koncem vyhrazen pamti nkter implementace (nap. MSVS2012 debug) ale provdj
60
SHRNUT
Modifiktoru proud
umoujc zmnit dl vlastnosti proudu jednorzov vs. do dal zmny
Modifiktory, vod STL, 21.10.2013
61