PROGRAMOVÁNÍ V C++ CV I ČENÍ Michal Brabec 11/5/2013
ARCHITECTURE
Input
11/5/2013
2 / 15
TASK • Vytvořte základní data pro filesystem (zatím v main) • Jednu autorizační autoritu • Jeden registr souborů • Cyklus který zpracovává vstup
• Vytvořte třídu pro práci se soubory (search engine) • Engine musí mít přístup k registru souborů a autorizační autoritě • Engine slouží jako rozhraní systému • Vstup překládá textové příkazy na metody enginu
• Přidejte engine k ostatním objektům a „připojte“ ho na input 11/5/2013
3 / 15
ITERÁTORY • • • •
Koncept standardní knihovny Nástroj pro práci s obsahem kontejneru Jednotný přístup pro všechny kontejnery Iterátory se mírně liší • Podle toho k čemu je možné je použít • Podle způsobu průchodu kontejnerem • Podle rozsahu platnosti
• Iterátory obsahují odkaz na prvky kontejneru • Chytrý ukazate na prvky kontejneru
11/5/2013
4 / 15
VSTUPNÍ A VÝSTUPNÍ ITERÁTORY • Vstupní iterátory je možné pouze číst • Výstupní je možné upravovat • Přiřazení int x = y; -> l-value = r-value • Iterátor je v podstatě ukazatel do kontejneru a omezení se vztahují na práci s prvky kontejneru • V praxi to vede k rozlišení konstantních a normálních iterátorů • Konstantní iterátory poskytují const value& operator*() • Normální iterátory poskytují value& operator*()
11/5/2013
5 / 15
FORWARD ITERÁTORY • Základní verze podporovaná všemi kontejnery • Umožňují jednosměrný průchod kontejnerem • Podporované operace • • • • •
operator* - dereference na l-value operator* - dereference na r-value operator++ - posun na dalsi prvek operator== - porovnání na rovnost operator!= - nerovnost
• Kontejnery - forward_list, unordered_map 11/5/2013
6 / 15
BIDIRECTIONAL ITERÁTORY • Obousměrný iterátor • Podporovaný většinou běžných kontejnerů • Podporované operace (navíc) • operator-- - posun na předchozí prvek
• Kontejnery – map, list, set
11/5/2013
7 / 15
RANDOM ACCESS ITERÁTORY • Nejsilnější verze iterátoru • Podporuje skoro stejné operace jako pointer • Podporované operace (navíc) • operator+ - posunutí o n prvků dopředu jednou operací • operator- - posunutí o n prvků zpět • operator<,<=,>=,> - porovnání
• Kontejnery – vector, array
11/5/2013
8 / 15
DEFINICE • Typy iterátorů jsou definovány v rámci třídy kontejneru • Jednoduché třídy definované v rámci kontejneru • Typy iterátorů • vector<>::iterator • vector<>::const_iterator • vector<>::reverse_iterator průchod • vector<>::const_reverse_iterator
- výstupní iterátor - vstupní iterátor - iterátor pro reverzní - vstupní reverzní iterátor
• Další důležité definice • vector<>::value_type • vector<>::reference • vector<>::const_reference reference 11/5/2013
- typ prvků v kontejneru - reference na prvky - konstantní
9 / 15
POUŽITÍ • Cyklus, průchod kontejneru od začátku do konce • begin() – iterátor ukazující na první prvek • end() – iterátor ukazující za poslední prvek
• Cyklus, průchod kontejneru od konce • rbegin() – iterátor ukazující na poslední prvek • rend() – iterátor ukazující před první prvek
11/5/2013
10 / 15
CYKLUS
for (std::vector
::iterator i = Files_.begin(); i != Files_.end(); ++i) { ... }
11/5/2013
11 / 15
POUŽITÍ • Použití • std::vector arr(10, 0); • std::vector::iterator iter = arr.begin();
• Vektor je vhodné přejmenovat • typedef std::vector IntVector; • IntVector arr(10, 0); • IntVector::iterator iter = arr.begin();
• Přejmenování známého typu – typedef • typedef known_type_name new_type_name; 11/5/2013
12 / 15
TASK • Přejmenujte vektor souborů v registru pomocí typedef konstrukce, aby se s ním snáze pracovalo • Přidejte registru metodu, která umožní bezpečný přístup k vektoru souborů (nejlépe bez kopírování)
11/5/2013
13 / 15
TASK • Vytvořte metodu login v search engine, která přihlásí uživatele • Engine zavolá příslušnou metodu na autrizační autoritě
• Vytvořte metodu list v search engine, která vypíše seznam souborů, které patří současnému uživateli • K získání souborů a uživatele použijte příslušné objekty • Vektor procházejte pomocí iterátorů
11/5/2013
14 / 15
PROBLÉMY • Iterátory nejsou absolutně bezpečné • Dva hlavní problémy • Iterátory dvou různých kontejnerů téhož typu • Je možné normálně porovnávat • Je možné předávat jako rozsah funkcím a cyklům • Vede ke kritickým chybám (práce s cizí pamětí, mezi kontejnery)
• Iterátory kontejnerů u kterých dochází k realokaci • Vzniká v důsledku změn v kontejneru (alokace většího prostoru) • Iterátory získané před realokací jsou nepoužitelné • Vede ke kritickým chybám (práce s cizí pamětí, dříve kontejner)
11/5/2013
15 / 15
DALŠÍ POUŽITÍ • Iterátory používají mnohé metody tříd ve standardní knihovně • Konstruktor vectoru – umožňuje naplnit nový vektor daty z jiného kontejneru • Funkce erase – maže vybraný prvek ve vektoru (posun dat)
• Iterátory je možné ukládat a předávat jako ukazatele (pozor na realokaci!) • Pole/vector iterátorů – index pro optimalizovaný přístup • Dvojice iterátorů – rozsah zpracovávaných dat (kontejner není potřeba)
• Algoritmy (později) 11/5/2013
16 / 15
TASK • Vytvořte konzolové příkazy (rozpoznávejte) • login USERNAME… - přihlášení uživatele do autorizační autority • ls - výpis seznamu souborů, které patří aktuálnímu uživateli
• logout – odhlášení uživatele • exit – ukončení systému • Napojte příkaz ls na metodu list • Napojte příkaz login/logout na metodu login/logout enginu
• Přidejte nástroje pro přidávání a mazání souborů • Metody se přidají do engine a budou volat metody registeru • Přidejte příkazy, které dané metody vyvolávají 11/5/2013
17 / 15