{{page>courses:b6b36pjc:styles#common&noheader&nofooter}} {{page>courses:b6b36pjc:styles#ukoly&noheader&nofooter}} ===== Trie 3 ===== Tento úkol navazuje na [[courses:b6b36pjc:ukoly:trie_2|předchozí domácí úkol]], kde jste převedli trii jakožto strukturu na trii jakožto třídu a přidali další užitečné metody. V tomto úkolu rozšíříte svoji trii o další funkcionalitu, jmenovitě * iterátory * kopírující konstruktor a přiřazení * přesouvající konstruktor a přiřazení * ''trie::swap'' -- Prohodí obsah obou listů * operátor ''|'' -- Sjednocení dvou trií * operátor ''&'' -- Průnik dvou trií * porovnávací operátory: ''=='', ''!='', ''<'', ''%%<=%%'', ''>'', ''>='' Potřebné hlavičkové soubory a testy jsou ke stažení {{:courses:b6b36pjc:ukoly:trie-3.zip|zde}}. ==== Co odevzdat? ==== Jeden nebo více ''.cpp'' souborů, které implementují funkce deklarované v souboru ''trie.hpp'' tak, aby testy procházely a neztrácela se paměť. Při práci na úkolu soubor ''trie.hpp'' neměňte a nemusíte ho ani odevzdávat. ===== Rady ===== * V inicializačním seznamu lze zavolat jiný konstruktor třídy. * Logika iterátoru je stejná, jako u třídy ''word_cursor'' v minulém úkolu ==== Průnik a sjednocení ==== Průnik a sjednocení nad trií se dají velmi snadno napsat rekurzivně a stále platí, že testovací vstupy jsou schválně nechané dostatečně malé, aby s tím nebyl problém. ==== Pořadí implementace ==== Pokud chytře zvolíte pořadí implementace nové funkcionality, značně si zjednodušíte práci. Nějakou představu o vhodném pořadí byste měli mít ze 7. cvičení, doplníme pouze, že si můžete v některých případech zjednodušit práci i za pomoci iterátorů. ==== Definice metod vnořených tříd ==== Metody vnořených tříd (například ''trie::iterator'') se definují stejně jako metody tříd, ale je potřeba si uvědomit, že k jejich plné identifikaci je potřeba zmínit i (všechny) vnější třídy. K této deklaraci class trie { class const_iterator { iterator& operator++(); }; }; tedy patří tato definice trie::const_iterator& trie::const_iterator::operator++() { ... } ==== Časově náročné testy ==== Mezi testy je i jeden časově náročný test, který je při normálním spuštění vypnutý. Pokud ho chcete spustit, musíte zavolat výslednou binárku s argumentem ''[.long]'': ''trie3 [.long]'' Silně doporučujeme ho spouštět pouze v optimalizované binárce, tj. stavět v //Release// módu nebo na příkazové řádce s parametrem ''-O3''. ==== Užitečné hlavičky ==== Implementaci relačních operací si můžete zjednodušit chytrým využitím hlavičky [[http://en.cppreference.com/w/cpp/header/algorithm|]].