Programování v C++

Demonstrace: Co se bude hodit ...

  • Operátor <<
    
    std::ostream& operator<<(std::ostream& stream, const ElasticArray& container);
          
  • Klíčové slovo friend
  • Iterátory

Cvičení: Gumové pole

Umístění: ./labs/11-vector/

Čas: 60 minut

Použijte řešení pro gumové pole z minulé hodiny. Implementaci rozšiřte o následující funkcionalitu, není nutné dodržovat pořadí:

  • Implementujte move konstruktor a operator=(&&) s příznakem noexcept.
  • Operátor << pro zápis do std::ostream. Výstupem jsou prvky zapsané do std::ostream oddělené čárkou.
  • Jednoduchý dopředný iterátor.
    Neuvažujte (iterator_category, difference_type, ...).

Detaily pro vybranou funkcionalitu jsou na dalším slajdu.

Iterátor

Kontejner musí implementovat následující metody.


template<typename T, size_t chunk_size> class ElasticArray {
  class iterator;
  iterator begin() { ... }
  iterator end() { ... }
}
    

Neb jde o jednoduchý iterátor stačí nám níže uvedené základní metody.


template<typename T, size_t chunk_size> class ElasticArray::iterator {
  // constructor
  iterator(ElasticArray<T, chunk_size>& container, size_t index) { ... }
  // return reference to the current value
  T& operator*() { ... }
  // compare two iterators
  bool operator!=(const iterator& other) const { ... }
  // move iterator to next position
  iterator& operator++() { ... }
}
    

Iterátor - bude to fungovat?


// :)
for (auto iter = container.begin(); iter != container.end(); ++iter)  { std::cout << *iter << std::endl; }

// :)
for (auto&& item : container) { std::cout << item << std::endl; }

// Not enough :(
std::sort(container.begin(), container.end());
    

Demonstrace: Compile time concepts

Naše implementace ...

Implementace je hodně daleko od toho, co bychom čekali od kontejneru.

  • Invariants
  • Exceptions
  • Atomicity / Rollbacks
    ? noexcept
  • Memory leaks
  • Growing policy
  • Remove from a random location