Vega - Grieshaber 2018-04 Übung Donnerstagabend
Fortsetzung der Übung von Donnerstagmittag – Schritt 5 hier nochmals wiederholt.
(Falls in der letzten Praktikumsphase nicht abgeschlossen.)
Schritt 5:
Fügen Sie in die Klasse `vf_array` die folgenden (öffentlich sichtbaren) Typedefinitionen ein – gerne auch in der mit C++11 neu eingeführten `using`-Syntax:
typedef T value_type;
typedef std::size_t size_type;
typedef T* iterator;
typedef const T* const_iterator;
Welchen Zweck könnten diese Typ-Aliase haben bzw. wann könnten diese sich evtl. als nützlich erweisen?
Schritt 6:
Ergänzen Sie die folgenden Member-Funktionen. Die mit Auslassungspünktchen ("… ") versehenen Stellen sollten Sie dabei natürich sinnvoll füllen. Es gibt mehrere Möglichkeiten, dies zu tun, aber insgesamt sollte es darauf hinauslaufen, dass die Funktionen dieselbe Semantic haben wie beim `std::vector` – sehen Sie sich also ggf. dessen Beschreibung in `cppreference.com` an.
… begin() { … }
… begin() const { … }
… cbegin() … { … }
… end() { … }
… end() const { … }
… cend() … { … }
Denken Sie bitte auch darüber nach, wie Sie diese Funktionen testen können.
Tip: Verwenden Sie eine lokale `const`-Referenz, die Sie mit einem der beiden Container initialisieren:
Schreiben Sie zwei Hilfsfunktionen `is_const` mit unterschiedlichem Argumenttyp:
auto is_const(vf_vector::const_iterator) { return "is constant"; }
auto is_const(vf_vector::iterator) { return "is NOT constant"; }
Damit sollten Sie die Auswahl der konstanten und des nicht-kontanten Iterator-Variante fesstellen können:
PX_("is NOT constant", is_const(arr1.begin()));
PX_("is constant", is_const(arr1.cbegin()));
PX_("is NOT constant", is_const(arr1.end()));
PX_("is constant", is_const(arr1.cend()));
Für die unterschiedliche Auswahl der Iterator-Varianten mit `begin()` bzw. `end() abhängig davon, ob es sich um ein konstantes oder ein nicht-konstantes `vf_array` handelt, können Sie eine lokale Referenz als Hilfsvariable verwenden:
const auto& cr1{arr1};
PX_("is constant", is_const(cr1.begin()));
PX_("is constant", is_const(cr1.cbegin()));
PX_("is constant", is_const(cr1.end()));
PX_("is constant", is_const(cr1.cend()));
Schritt 7:
Bewerten Sie unter dem Aspekt des im letzten Schritt gelernten die "`const`-Correctness" ihrer bisher implementierten Member-Funktionen:
- Nehmen Sie alle ggf. erforderlichen Nachbesserungen vor.
- Wiederum inklusive der notwendigen Tests, versteht sich!
Striktes TDD (= Test-Driven-Development) würde so aussehen:
- zuerst Testall → dann Implementierung des Features
- (nicht "All Tests Passed" → Implementierung verbessern)
- nächster Testfall → nächste Implementierungen
- …
Schritt 8:
Implementieren Sie weitere Typ-Aliase und Member-Funktionen nach dem Vorbild des `std::vector`. Hier eine Liste von möglichen Kandidaten in alphabetischer Reihenfolge.
Über die Reihenfolge, in der Sie die einzelnen Implementierungen vornehmen entscheiden Sie selbst.
Typ-Alias | Verwendungs-Zweck |
---|---|
value_type | Element-Typ (wie als Template-Argument angegeben) |
reference | value_type& |
const_reference | const value_type& |
pointer | value_type* |
const_pointer | const value_type* |
Für die Details sehen Sie sich die Beschreibung dieser Member-Funktionen in `cppreference.com` an.
Member-Funktion | Schwierigkeitsgrad |
---|---|
operator[] | mittel |
at | mittel |
capacity | gering |
clear | gering |
data | gering |
erase | hoch |
front | gering |
insert | hoch |
pop_back | gering |
reserve | gering |
resize | mittel |
shrink_to_fit | gering |
Natürlich gehören zu jeder dieser Erweiterungen auch wieder entsprechende Testfälle!
Weitere Hinweise:
- In einigen Fällen muss es wieder eine`const` und eine nicht-`const`-Variante geben.
- Achten Sie auf eine "robuste" Implementierung, insbesondere:
- Im Release-Build kein undefiniertes Verhalten …
- … im Debug-Build aber gerne reichlich`assert`s.
Und wenn Sie gerade dabei sind: orientieren Sie sich auch hinsichtlich der Typ-Aliase `size_type` und `difference_type` am Vorbild der STL-Container.
Falls Sie mit der Übung momentan nicht ganz fertig werden – kein Problem!
Sie können die unbearbeitenden Schritte in der nächsten Praktikumsphase abschließen.
(Oder sie kopieren diese aus der Musterlösung.)