Problem A
Labb 1: Vektor
Gällande lydelse finns på kursens hemsida http://www.csc.kth.se/DD2387 (google: DD2387 cprog13). Nedan följer ett urdrag ur labblydelsen. Det är kod till den senare delen (1.5) som ska skickas in.
Filen som skickas in till kattis ska heta kth_cprog_vektor.cpp där ska all kod ligga. Deklaration och implementation vara åtskilda i filen vid redovisning.
Skapa en vektorklass Vector för positiva heltal (unsigned int). Du får inte använda klassen vector i STL i din lösning (däremot kan du, om du vill, implementera en referenslösning för att jämföra egna tester). Låt storleken vara fixerad och bestämmas av ett argument av typen (size_t) till konstruktorn. Även nollstora vektorer ska kunna skapas. Varje vektorelement ska initieras till 0.
Implementera tilldelningsoperator och kopieringskonstruktor. Tilldelning/kopiering av olika stora vektorer ska fungera. Implementera även move-konstruktor och move-operator så att std::move fungerar. Implementera en tilldelningsoperator som tar en initializer_list som parameter.
Vektorklassen ska även överlagra indexoperatorn [] för snabb åtkomst av elementen.
... int x = 2; int i = vektor[7]; vektor[3] = x; // OBS, ska fungera! Vector v2; v2 = {1, 2, 5};
Kontrollera att det är giltig åtkomst annnars ska std::out_of_range kastas! Generellt är det ofta en god idé att låta konstruktorer som tar ett argument deklareras som explicit, gör så även i denna klass. Varför? Ange ett exempel där det annars kan bli dumt. Prova din vektor med filen test_vec.cpp i kurskatalogen. Använd valgrind. Detta testprogram kontrollerar inte all funktionalitet. Du måste själv ansvara för att skriva ett bättre testprogram som testar randvillkoren ordentligt, t.ex. genom att använda ett testramverk som cxxtest.
Tips: Tänk på att operatorn [] måste vara en konstant medlemsfunktion i vissa fall. När och varför? Hur kopierar man vektorn?
Vector b = a; a[0] = 1; // b ska inte ändras av denna sats.
Tänk även på vad som händer i följande fall (dvs då vektorn förväntas kopiera sig själv):
Vector v; v = v;
1.5 (mallar) a) Modifiera din vektorklass Vector från uppgift 1.4 så att den kan lagra en godtycklig datatyp genom att använda mallar (templates). Din nya klass ska dessutom kunna ändra storlek efter den skapats. Klassen ska fortfarande kasta std::out_of_range vid ogiltig åtkomst. Exempel på instansiering:
class A; ... Vector<double> dvect; Vector<A *> apvect; Vector<int> ivect(10);
Defaultkonstruktorn ska skapa en tom vektor. Om man anger en storlek till konstruktorn ska elementen initieras till defaultvärdet för typen (tilldela värdet T() till elementen). Implementera även en konstruktor som tar två argument, dels en storlek och ett defaultvärde för alla element i vektorn.
b) Du ska också lägga till ny funktionalitet i din klass:
-
push_back(T) lägger till ett element sist i vektorn. Det ska för det mesta ske i konstant tid.
-
insert(size_t i, T) lägger till ett element före plats i. Om i är lika med antal element i vektorn fungerar metoden som push_back
-
erase(size_t i) tar bort ett element på plats i
-
clear() tar bort alla element
-
size() ger antal element i vektorn
-
sort(bool ascending = true) sorterar vektorn i angiven riktning på enklast möjliga sätt. Använd std::sort (datatyper som ska jämföras måste definiera operator<.)
-
unique_sort(bool ascending = true) Sorterar samt tar bort dubletter i vektorn. Använd std::unique. OBS! se till att vektorns storlek ändras om element tagits bort.
-
exists(const T &) Returnerar true om elementet finns i vektorn annars false. Använd std::find för att implemtera funktionen.
Se till att rena åtkomstfunktioner ( read only) är konstantdeklarerade.
Prova din nya vektorklass med filen test_template_vec.cpp. Detta testprogram kontrollerar inte all funktionalitet. Du måste själv ansvara för att skriva ett bättre testprogram som testar randvillkoren ordentligt. Ett minimum av test är att skriva ett test för varje medlemsfunktion man implementerar. Glöm inte använda valgrind.