You are on page 1of 61

PB161 PROGRAMOVN V JAZYCE C++ OBJEKTOV ORIENTOVAN PROGRAMOVN

Manipultory proud, vod do Standard Template Library, Kontejnery, Itertory

Modifiktory, vod STL, 21.10.2013

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

Prbn test za 14 dn (4.11.)


dva termny, 14:00 a 15:00 nutno se pihlsit v ISu! (je ji vypsno)

Modifiktory, vod STL, 21.10.2013

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

Je jich velk mnostv, studujte dokumentaci


http://www.cplusplus.com/reference/iostream/manipulators/

MANIPULTORY PROUD (2)


Modifiktory jsou funkce upraven pro pouit s opertory << a >>
Modifiktory, vod STL, 21.10.2013

cout << endl;

Mohou bt ale pouity i jako bn funkce


endl(cout);

Modifiktory maj rznou oblast platnosti


pouze nsledujc znak a do dal explicitn zmny nebo zniku proudu

MANIPULTORY PROUD POET CIFER


Formtovn relnch sel
setprecision() poet cifer za desetinou rkou fixed zobrazen vech cifer do zobrazovan dlky sla showpoint vdy zobrazovat cifry za desetinou rkou
Modifiktory, vod STL, 21.10.2013

Viz. ukzka

POET CIFER - UKZKA


#include <iostream> #include <iomanip> using std::cout; using std::endl; using std::ios;

int main() { const float PI = 3.1415926535897932384626433832795028841971693993751058209749445923078164

Modifiktory, vod STL, 21.10.2013

// 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;

// Problem - why? Pi has3.141500000000000*18118839761882554739713668823242188*valu


cout << "Pi has" << std::setprecision(50) << 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

VYROVNVAC POLE PROUDU


Defaultn je pouito Nastaven chovn vyrovnvacho pole
unitbuf nepouije se vyrovnvac pam nounitbuf me se pout vyrovnvac pam (default) vyuit nap. pro debug konzoli

Modifiktory, vod STL, 21.10.2013 8

VYROVNVAC POLE PROUDU - UKZKA


#include <iostream> #include <iomanip> #include <sstream> using std::cout; using std::endl; using std::ios; int main() { // force cache flushing on insert cout << std::unitbuf; cout << 255 << endl; // output 255 and newline cout << std::setbase(16) << 255 << endl; // output 255 in hexadecimal and newline cout << 16 << endl; // output 16 in hexadecimal and newline cout << std::setbase(8) << 255 << endl; // output 255 in oct and newline //cout << std::setbase(2) << 255 << endl; // wrong: only 8, 10 and 16 base is allowed cout << std::nounitbuf; // disable flushing of cache on insert cout << 255; // will not display immediately cout << 255 << std::flush; // will force flush of this line cout << endl; return 0; } 9

Modifiktory, vod STL, 21.10.2013

MANIPULTORY PROUD SELN


SOUSTAVA Zmna seln soustavy pro vpis
defaultn dekadick
Modifiktory, vod STL, 21.10.2013

Metoda setbase()
argument 8, 10 nebo 16

Modifiktory dec, hex, oct


analogie setbase()

10

SELN SOUSTAVA - UKZKA


#include <iostream> #include <iomanip> using std::cout; using std::endl; using std::ios; int main() { cout << std::unitbuf; // force cache flushing on insert cout << 255 << endl; // output 255 and newline cout << std::setbase(16) << 255 << endl; // output 255 in hexadecimal and newline cout << 16 << endl; // output 16 in hexadecimal and newline cout << std::setbase(8) << 255 << endl; // output 255 in oct and newline //cout << std::setbase(2) << 255 << endl; // wrong: only 8, 10 and 16 base is allowed return 0; }

11

Modifiktory, vod STL, 21.10.2013

MANIPULTORY PROUD ZAROVNN TEXTU


ka vpisovanho pole setw()
setw(10)
Modifiktory, vod STL, 21.10.2013

pokud nen specifikovan dlka dostaten, automaticky se zvt na nejmen potebnou velikost

Zarovnn vypisovanho pole v textu


<< left, right

12

KA A ZAROVNN TEXTU - UKZKA


#include <iostream> #include <iomanip> #include <sstream> using std::cout; using std::endl; using std::ios;

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

Modifiktory, vod STL, 21.10.2013

DAL MANIPULTORY UKZKA


#include <iostream> #include <iomanip> using std::cout; using std::endl; using std::ios; pidn modifiktor nastavenm pznaku
Modifiktory, vod STL, 21.10.2013

int main() { cout.setf(ios::hex, ios::basefield); cout.setf(ios::showbase); cout << 255 << endl; // 0xff cout.unsetf(ios::showbase); cout << 255 << endl; // ff

pid identifikaci seln soustavy

odstrann pznaku modifiktor vynucen desetinn rky

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; }

TVORBA VLASTNCH MANIPULTOR


Pomoc funkce akceptujc istream resp. ostream
#include <iostream> using std::cout; using std::endl; std::ostream& insertVooDoo(std::ostream& out) { out << "VooDoo" << endl; out.flush(); return out; } int main() { cout << "Hello " << insertVooDoo; return 0; }
Modifiktory, vod STL, 21.10.2013 15

KDY TYPICKY POUT MANIPULTORY?


Defaultn hodnoty jsou vtinou vhodn pro vstup sel do vt Formtovn sel do tabulkovho vpisu typicky vyaduje pouit setw() Zbytek zle na potebch aplikace

16

Modifiktory, vod STL, 21.10.2013

Modifiktory, vod STL, 21.10.2013

STANDARD TEMPLATE LIBRARY (STL)

17

STANDARDN KNIHOVNA C++


Knihovn funkce z jazyka C
hlavikov soubory s prefixem cxxx vtina standardnch funkc pro jazyk C nap. cstdlib, cstdio C funkce obaleny ve jmennm prostoru std::
Modifiktory, vod STL, 21.10.2013

C++ knihovna STL


pekryv s funknost z C a vrazn rozen nap. iostream namsto cstdio obvykle sna pout, sna udrovatelnost me bt lep typov kontrola

18

STANDARDN KNIHOVNA C++ - KOMPONENTY


1.

Bez vyuit ablon


jen mal st mimo knihovnch funkc pevzatch z C
Modifiktory, vod STL, 21.10.2013

2.

Zaloen na ablonch, ale s fixovanm typem


nap. string (#include <string>) typedef basic_string<char> string; (basic_string je ablona)

3.

Zaloen na ablonch, monost volnho typu


nap. dynamick pole s kontrolou mez vector template < class T, class Allocator = allocator<T> > class vector; (bude probrno pozdji)

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;

Modifiktory, vod STL, 21.10.2013

Vyuit ddinosti pro stenou typovou nezvislost

20

STANDARD TEMPLATE LIBRARY (STL)


Sada td, metod a funkc do znan mry typov nezvisl Je to standardn soust jazyka C++ !
dostupn na vech platformch (s C++ pekladaem)

Modifiktory, vod STL, 21.10.2013

Nkolik pklad u znte


std::string souborov a etzcov proudy cin, cout

21

NVRHOV CLE STL


Poskytnout konzistentn zpsobem irokou sadu knihovnch funkc Doplnit do standardnch knihoven bn poadovanou funknost nedostupnou v C Zven uivatelsk pvtivosti
snadnost pouit zkladnch pamovch struktur tzen, dynamick prava velikosti, foreach

Modifiktory, vod STL, 21.10.2013

Vyut co nejvce typov nezvislosti


jednotn kd pro irok spektrum datovch typ

22

NVRHOV CLE STL (2)


Zven robustnosti a bezpenosti kdu
nap. automatick sprva pamti nap. voliteln kontrola mez pol automatick ukazatele uvoln dynamicky alokovanou pam
Modifiktory, vod STL, 21.10.2013

Zachovat vysokou rychlost


nemus ve kontrolovat (nap. meze pol) vtinou existuj i pomalej, ale kontrolujc metody

23

STL ZAVD NOV KONCEPTY


1.

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

Modifiktory, vod STL, 21.10.2013

KONTEJNERY

25

SYNTAXE STL
STL obsahuje velk mnostv td a metod Dleit je umt hledat
http://www.cplusplus.com/reference/stl/

A rozumt syntaxi

msto doplnn konkrtnho typu pro ablonu

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

Modifiktory, vod STL, 21.10.2013

KONTEJNERY - MOTIVACE
Vtinu dat je nutn uchovvat ve sloitjch strukturch
Modifiktory, vod STL, 21.10.2013

z C znme pole a struct, z C++ tdu

Vt mnostv dat vyaduje speciln organizaci v pamti


dosaen rozumnho vkonu vi astm operacm vkldn/odstrann/hledn prvku pamov spornost me tak hrt roli

Nen obecn nejlep typ organizace pro vechny poteby


viz. Nvrh algoritm

27

KONTEJNERY MOTIVACE (2)


V C bylo nutn implementovat vlastn struktury
zetzen seznam, strom nebo pout (nestandardizovan) dodaten knihovny
Modifiktory, vod STL, 21.10.2013

Zkladn operace jsou ale typicky pod shodn


nap. vloen a odstrann prvku nap. prochzen struktury po prvcch

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; }

TYPY STL KONTEJNER


Typy kontejner
sekvenn: vector, deque, list asociativn: set,multiset,map,multimap,bitset s upravenm chovnm (adaptory): stack (LIFO), queue (FIFO), priority_queue
Modifiktory, vod STL, 21.10.2013

Intern organizace kontejner se li


vyberte vhodn pro dan typ operace dynamick pole, etzen seznam, strom

Detailn srovnn parametr monost


http://www.cplusplus.com/reference/stl/

29

ZKLADN METODY VTINY KONTEJNER


Konstruktory a destruktory
poten inicializace, koprovac konstruktor
Modifiktory, vod STL, 21.10.2013

Itertory
begin(), end(), rbegin()

Metody pro zjitn a manipulaci velikosti


size(), empty(), resize()

Metody pstupu (jen ten)


opertor [], front()

Metody pro zmnu obsahu kontejneru


nap. push_back(), clear()

30

KONTEJNER VECTOR
...

Sekvenn kontejner pro rychl pstup indexem


rychlost srovnateln s bnm polem inteligentn pole: monost zvten, kontroly mez
Modifiktory, vod STL, 21.10.2013

Podobn sekvennmu poli znmmu z C


nap. int pole[10]; (C++11 navc zavd std::array)

Syntaxe pouit
#include <vector> int main() { std::vector<int> vect(10); return 0; }

http://www.cplusplus.com/reference/stl/vector/

31

KONTEJNER VECTOR DOKUMENTACE

32

http://www.cplusplus.com/reference/stl/vector/

Modifiktory, vod STL, 21.10.2013

KONTEJNER VECTOR - DOKUMENTACE


Potebn pro syntaxi vytvoen instance ablony. Typicky jeden parametr, zde nap. vector<int> myVect;
Modifiktory, vod STL, 21.10.2013

Seznam petench konstruktor vector<int> myVect; vector<int> myVect(20);

Dostupn itertory (bude probrno pozdji)

Dal metody kontejneru (typicky dostupn pro vtinu kontejner)

VECTOR JAK POUVAT DOKUMENTACI


http://www.cplusplus.com/reference/stl/vector/operator[]/

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;

Modifiktory, vod STL, 21.10.2013

Druh verze je urena pro konstantn objekty

Popis oekvanch argument

34

Popis nvratov hodnoty

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];

pstup pomoc opertoru []

// 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

Modifiktory, vod STL, 21.10.2013

Je problm pi koprovn poloek typu ukazatel

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

Nepistupuje se pes index, ale pomoc itertor Syntaxe pouit


#include <list> int main() { std::list<int> myList; return 0; http://www.cplusplus.com/reference/stl/list/ }

37

Kam vloit. Za zadan itertor.

KONTEJNER LIST UKZKA DOKUMENTACE

Co vloit. Stejn datov typ s jakm je instance ablony vytvoena.


Modifiktory, vod STL, 21.10.2013

Lze vloit i sekvence prvk zrove. Od itertoru first po dosaen itertoru last.
38

KONTEJNER LIST - UKZKA


std::list<int> myList; myList.push_back(1); myList.push_back(2); myList.push_back(3); myList.push_front(4); myList.push_front(5); cout << "List size: " << myList.size() << endl; // Use iterator to output all value in list std::list<int>::iterator iter; for (iter = myList.begin(); iter != myList.end(); iter++) { cout << *iter << endl; } iter = myList.begin(); // get iterator to begin iter++; // jump to next item myList.insert(iter, 10); // insert after this item myList.clear(); cout << "List size: " << myList.size() << endl;

39

Modifiktory, vod STL, 21.10.2013

DYNAMICK ALOKACE U KONTEJNER


//std::list<A&> myList; // wrong: Why? std::list<A*> myList; // list of pointers to A std::list<A*>::iterator iter; for (int i = 0; i < 10; i++) myList.push_back(new A(i)); // Memory leak, if not all A's deleted before // myList.clear() for (iter = mylist.begin(); iter != myList.end(); iter++) { // release dynamically allocated object A delete *iter; } myList.clear();

Modifiktory, vod STL, 21.10.2013

Musme uvolnit jednotliv poloky ped clear()

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

Pstup zadnm kle (jmno), obdrme asociovanou hodnotu (UO)

Modifiktory, vod STL, 21.10.2013

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; }

Kle mus bt uniktn


nelze vloit dv rzn hodnoty se stejnm klem pokud v aplikaci nastv, pouijte multimap

42

KONTEJNER MAP - UKZKA


// Key is string, value is integer std::map<std::string, int> myMap; // Insert key with associated value myMap.insert(std::make_pair<std::string, int>("Jan Prumerny", 3)); myMap.insert(std::make_pair<std::string, int>("Michal Vyborny", 1)); myMap.insert(std::make_pair<std::string, int>("Tonda Flakac", 5)); // C++11 adds additional possibility: myMap.insert( {"Karel", 12} );
Modifiktory, vod STL, 21.10.2013

// 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

POZNMKY K VYUIT KONTEJNER (1)


vector
pro rychl pstup indexem za konstantn as ast vkldn na konec
Modifiktory, vod STL, 21.10.2013

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

POZNMKY K VYUIT KONTEJNER (2)


Pro poet poloek v kontejneru je funkce size() Pro test na przdnost
Modifiktory, vod STL, 21.10.2013

pouijte empty() ne size() == 0 vpoet velikosti u konkrtnho kontejneru me trvat

Kontejnery e automaticky svoje zvtovn


pokud se u vkldan prvek nevejde, zvt se velikost (nkterch) kontejner o vce ne 1 prvek (nap. o 10)
to ale samozejm chvli trv

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>

Kad adaptor m piazen svj defaultn kontejner


pouije se, pokud nespecifikujeme jin meme zmnit na jin, pokud poskytuje poadovan metody (viz. dokumentace)

Kad adaptor m sadu podporovanch metod


nap. stack metody push(), top() a pop() (viz. dokumentace)

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)

Modifiktory, vod STL, 21.10.2013

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

Modifiktory, vod STL, 21.10.2013

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

Modifiktory, vod STL, 21.10.2013

Monost sekvennho prochzen Monost aplikace operace na oblast od do


nap. vypi od aktuln poloky do konce

Me bt mrn rychlej ne indexovn


http://stackoverflow.com/questions/776624/whats-fasteriterating-an-stl-vector-with-vectoriterator-or-with-at
49

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

Modifiktory, vod STL, 21.10.2013

ITERTORY ZSKN, TEST KONCE


Zskn itertoru
kontejner m metody begin() a end() (a dal) jako vsledek dalch metod nap. STL algoritmu find(hodnota)
Modifiktory, vod STL, 21.10.2013

Testovn na konec prochzen kontejneru


metoda end() vrac itertor na prvek za poslednm for(iter=vect.begin();iter!=vect.end();iter ++){} typicky jako if((iter = find())!=vect.end()){}

Testovn na przdnost kontejneru z hlediska itertor


splnno kdy begin() == end() pouijte ale metodu empty() nepouvejte size() me trvat

51

ITERTORY POSUN, PSTUP


Itertor petuje opertory pro posun a pstup Opertor ++ a -posun na dal resp. pedchoz prvek prefixov i postfixov verze

Modifiktory, vod STL, 21.10.2013

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

ITERTOR ILUSTRACE NA KONTEJNERU


VECTOR std::vector<int> v(7);
(v.begin())++ v[3] (hodnota) v.begin()+5
Modifiktory, vod STL, 21.10.2013

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

Umouj ukazatelovou aritmetiku


&vect[x] == &vect[0]+x

Nemus kontrolovat konec kontejneru!


stejn situace jako [] u pole hodnot hroz ten a zpis za koncem pole

Kontejner umoujc pm pstup typicky nabz i metodu s kontrolou


nap. vector::at() vyvol vjimku pi pstupu mimo

54

ITERTORY DAL VYUIT


Pouit pro oznaen pozice pro vybranou operaci
nap. specifikace pozice, kam se m vkldat prvek
Modifiktory, vod STL, 21.10.2013

insert(iterator, hodnota);

nap. specifikace prvku, kter se m odebrat


erase(iterator);

Pouit pro STL algoritmy (pozdji)


specifikace rozsahu pro vykonn algoritmu nap. tdn nebo koprovan sek

55

ITERTORY UKZKA VPIS KONTEJNERU VECTOR


pes index (opertor []) pes itertor (prochzen od zatku do konce)

// 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; }

Modifiktory, vod STL, 21.10.2013

TYPY ITERTOR
vstupn (istream_iterator)
jen ten (nemodifikuje kontejner)
Modifiktory, vod STL, 21.10.2013

vstupn (ostream_iterator)
jen zpis (neumouje ten, jen zpis)

dopedn (operace ++)


ten i zpis, posun mon pouze dopedu

zptn (operace --)


ten i zpis, posun mon pouze dozadu

57

TYPY ITERTOR (2)


obousmrn (list, map...)
nejpouvanj, obousmrn posun, ten i zmna
Modifiktory, vod STL, 21.10.2013

pm pstup (vector, deque)


umouje pstup pes index

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

Modifiktory, vod STL, 21.10.2013

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

Modifiktory, vod STL, 21.10.2013

Itertor nekontroluje meze kontejneru

me st/zapisovat za koncem vyhrazen pamti nkter implementace (nap. MSVS2012 debug) ale provdj

Itertor me bt zneplatnn, pokud se vrazn zmn obsah souvisejcho kontejneru (erase())

60

SHRNUT
Modifiktoru proud
umoujc zmnit dl vlastnosti proudu jednorzov vs. do dal zmny
Modifiktory, vod STL, 21.10.2013

Standard Template Library (STL)


pohodln a rozshl nutn umt hledat v dokumentaci Zvolte vhodn kontejner

Kontejnery + itertory (+ algoritmy)


uet hodn prce

61

You might also like