PROGRAMOVÁNÍ V C++ CVIČENÍ Michal Brabec
ARCHITECTURE Input 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 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 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*() 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 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 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 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 - výstupní iterátor vector<>::const_iterator - vstupní iterátor vector<>::reverse_iterator - iterátor pro reverzní průchod vector<>::const_reverse_iterator - vstupní reverzní iterátor Další důležité definice vector<>::value_type vector<>::reference vector<>::const_reference reference - 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 10 / 15
CYKLUS for (std::vector<file>::iterator i = Files_.begin(); i!= Files_.end(); ++i) {... } 11 / 15
POUŽITÍ Použití std::vector<int> arr(10, 0); std::vector<int>::iterator iter = arr.begin(); Vektor je vhodné přejmenovat typedef std::vector<int> 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; 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í) 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ů 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) 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) 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í 17 / 15