termín: středa :59 vytvořit kontejner – dvourozměrná matice dopředné (forward) iterátory přes sloupce i řádky velikost fixní, určená parametry konstruktoru kopie kontejneru včetně změny rozměrů neřešit metody pro zvětšování a zmenšování nutná podpora move (move konstruktory / rvalue reference) bonus (max +2 body): správné řešení const kontejneru bonus (max +1 body): indexace přes řádky i sloupce ◦ a[x][y] (a.rows()[x][y] a.cols()[x][y]) bonus (max +1 body): bezpečné řešení v debug módu ◦ odchytávat všechny nedefinované akce
typedef matrix my_matrix; int cnt = 100; void f1( my_matrix::cols_t::value_type::reference x) { x = ++cnt; } void f2( my_matrix::cols_t::reference r) { for_each( r.begin(), r.end(), f1); } void f3( my_matrix::rows_t::value_type::reference x) { cout << x << " "; } void f4( my_matrix::rows_t::reference r) { for_each( r.begin(), r.end(), f3); cout << endl; } int main( int argc, char ** argv) { my_matrix a( 3, 4, 0); for_each( a.cols().begin(), a.cols().end(), f2); for_each( a.rows().begin(), a.rows().end(), f4); } procházení po sloupcích procházení po řádkách procházení prvků sloupce
vytvořené třídy musí být kompatibilní s STL kontejnery a algoritmy ◦ všechny vyžadující forward iterator - for_each ◦ pro pomocné třídy cols/rows vytvořit: typy: iterator, reference, value_type metody: begin(), end(), size(), bonus: op[] iterátory: ◦ 5 typů, *, ->, ++, =, == celkem 4 pomocné kvazi-kontejnery: ◦ řádky, sloupce, prvky v řádku, prvky v sloupci ◦ to celé znásobeno podporou const (bonus)
problém: ◦ kvazikontejner vrací iterátor, ten má svoji hvězdičkou zpřístupnit něco, co v té matici nemusí být (typicky sloupec) možné řešení: ◦ * na iterátoru vrátí hodnotou pomocnou na na místě sestrojenou třídu normálně * vrací T& ◦ tady nás k tomu sice nic nenutí ◦ musí se to ale chovat podobně pozor: ◦ na iterátoru musí být -> (požadavek normy) ◦ běžné řešení: vrátí ukazatel na typ s příslušnými metodami není ale na co vrátit * ◦ nebo: vrátí jinou třídu s přetíženým operátorem -> jiná třída - proxy na sloupec
včasnost ◦ za nedodržení termínu body prudce dolů přeložitelnost ◦ přeložitelné bez chyb a (pokud možno) warningů ◦ kompatibilní s vzorem použití (rozhraní je pevné) multiplatformnost ◦ nezávislost na OS, bitovosti, překladači - vyzkoušejte i gcc32/VS64 stabilita ◦ rozhodně vyzkoušejte všechna možná přípustná data a typy kultura kódu ◦ pravidla, moudra, dobré zvyky, udržovatelnost, estetika, čitelnost odevzdávací formality a konvence ◦ názvy a struktura souborů, komentáře
indexace přes řádky i sloupce ◦ max +1 body ◦ a[x][y] ◦ (a.rows()[x][y]) ◦ a.cols()[x][y] bezpečné řešení v debug módu ◦ max +1 body ◦ odchytávat všechny nedefinované akce ◦ du_assert(e) if( e == 0) chyba ◦ v debug verzi du_assert vypíše lokaci a skončí ◦ v release verzi (definováno makro DU_NDEBUG) nedělá nic - odletí
v du1.zip najdete 4 soubory ◦ du1test.cpp kód používající vaše řešení - neměňte - zachovat rozhraní! můžete (velmi doporučeno!) přidat vlastní testy ◦ du1debug.hpp definice pro bonus - du_assert ◦ du1matrix.cpp, du1matrix.hpp sem doplňte kód a hlavičkový soubor vašeho řešení soubory nepřejmenovávejte ◦ na začátek každého souboru vložte komentář typu // DU1matrix.cpp // Karel Vomacka NPRG /2015 vaše řešení vložte do Grupíčku - neposílejte em! ◦ správné soubory do správných sloupečků!