Warning
This page is located in archive.

Úkol 8

Tento úkol znovu navazuje na předchozí úkol s listem, kde jsme doplnili třídu list o iterátory, swap, kopírující a přesunující operace a metody split, merge a sort. V tomto úkolu se vrátíme k této verzi listu vrátíme a rozšíříme ji o podporu šablon.

Zadání

Očekáváný interface listu vychází z 5. úkolu, s několika přidanými metodami

  • remove_if, která bere predikát a smaže všechny prvky, pro které je predikát pravdivý.
  • sort a merge mají overload, který bere řadící predikát splňující SWO.
  • unique má overload, který bere predikát vracející true pokud je jeden prvek duplikát druhého.

Potřebné hlavičkové soubory a testy jsou ke stažení zde.

Co odevzdat?

Protože šablony musejí být uvnitř hlaviček1), tentokrát odevzdáváte pouze hlavičku list.hpp.

Rady

Závislá jména

Pokud se rozhodnete vepsat všechny metody do těla třídy (doporučujeme), na problém s tzv. závislými jmény nenarazíte.

Pokud se rozhodnete napsat metody mimo tělo třídy, na problém se závislými jmény narazíte i u všech metod listu, které vracejí iterátor (pozor, nejedná se o konstruktory) nebo pointer/reference. Návratovou hodnotu těchto metod pak musíte uvést klíčovým slovem typename.

template <typename T>
class list {
    // ...
    const_iterator begin() const;
};
 
// ...
 
template <typename T>
typename list<T>::const_iterator list<T>::begin() const {
    return {head, this};
}
// ...

Duplikace kódu

Řiďte se poučkou DRY – Don't Repeat Yourself. V zadání jsou metody (například přetížené varianty sort), které jsou prakticky identické, dají se tedy implementovat tak, že první opravdu implementujeme a druhá pak volá tu první.

Užitečné hlavičky

Doporučujeme se podívat na funkční objekty v hlavičce <functional>.

1)
Nemusejí být inline, ale je to jednodušší
courses/a7b36pjc/ukoly/ukol_8.txt · Last modified: 2016/12/13 16:04 by horenmar