Container, Vecor, Templates < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 13:50 Do 04.02.2010 | Autor: | nana |
Hallo!!
Ich habe ein paar Fragen zu generischen Klassen und Prozeduren, sowie zu Containern...
Also im Grunde ist mir klar warum man Templates verwendet: um eine Prozedur oder eine Klasse unabhängig von best Datentypen zu machen, oder?
Bei einer Prozedur wird das dann so geschrieben:
template< class T> void tausche (T& a, T& b)
kann ich jetzt die Methode tausche einfach ganz normal aufrufen? also zB
tausche (5,6)
oder muss das so aufgerufen werden?:
void tausche<int> (int& a, int& b)
was ist der Unterschied?
Bei einer Klasse:
template<class T> class SimpleArray
(muss es eig T sein oder kann es auch ein anderer Buchstabe sein oder sogar kleingeschrieben und mit mehreren Zeichen??)
In der Folie der Vorlesung steht:
"In dem Template ist der Klassenname SimpleArray<T> zu verwenden.(Aber nicht für Operationsnamen für Konstruktor und Destruktor.)" -> was bedeutet denn eig template, bzw was genau ist das Template?? die generische Klasse, oder was genau?? das bsp ist jedenfalls so:
template <class T> SimpleArray<T>::SimpleArray (int r, T f)
dh man muss anstatt SimpleArray immer SimpleArray<T> schreiben, oder??
auch hier wieder die gleiche Fragestellung wie oben:
SimpleArray<int> g (3,4) muss man das so machen oder reicht nicht SimpleArray g(3,4) ???
Soo...jetzt zu den Containern...
Was ist eig ein Container?? Ist das eine Art Datentyp wie Liste (meine mal sowas gelesen zu haben) ???
und was ist dann ein Vector bzw eine map??
Mir ist das in den Erklärungen bis jetzt immer ein wenig zu abstrakt gewesen...
Vielen Dank für alle ANtworten!!!
LG, nana
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 07:18 Fr 05.02.2010 | Autor: | felixf |
Hallo nana!
> Ich habe ein paar Fragen zu generischen Klassen und
> Prozeduren, sowie zu Containern...
> Also im Grunde ist mir klar warum man Templates verwendet:
> um eine Prozedur oder eine Klasse unabhängig von best
> Datentypen zu machen, oder?
Genau.
> Bei einer Prozedur wird das dann so geschrieben:
> template< class T> void tausche (T& a, T& b)
> kann ich jetzt die Methode tausche einfach ganz normal
> aufrufen? also zB
> tausche (5,6)
So sicher nicht: es gibt keine Moeglichkeit T so zu waehlen, dass 5 und 6 vom Typ T & sind.
Eher sowas wie:
1: | int & a, b;
| 2: | tausche(a, b); |
> oder muss das so aufgerufen werden?:
> void tausche<int> (int& a, int& b)
Nein, so kannst du es nicht aufrufen. Entweder tausche(a, b) oder tausche<int>(a, b).
Das zweite ist z.B. hier wichtig:
1: | template<class T> T summe(T a, T b) { return a + b; }
| 2: | summe<int>(1, 1.5); |
Wenn man nur summe(1, 1.5) schreibt, weiss der Compiler nicht, ob T nun ein int oder ein float/double ist. Wenn man aber T = int explizit vorgibt, weiss der Compiler dass ein int gemeint ist. Das Argument 1.5 wird nun erst automatisch zu einem int konvertiert (also zu 1), bevor 1 und 1 addiert werden und 2 (als int) zurueckgegeben wird.
> was ist der Unterschied?
Ich hoffe das ist jetzt etwas klarer.
> Bei einer Klasse:
> template<class T> class SimpleArray
> (muss es eig T sein oder kann es auch ein anderer
> Buchstabe sein oder sogar kleingeschrieben und mit mehreren
> Zeichen??)
Es kann irgendein Bezeichner sein, der nicht innerhalb der Klasse anders verwendet werden soll
Zum Beispiel kann man auch sowas wie
template<class Skalar> class Vektor { ... }
machen.
> In der Folie der Vorlesung steht:
> "In dem Template ist der Klassenname SimpleArray<T> zu
> verwenden.(Aber nicht für Operationsnamen für Konstruktor
> und Destruktor.)" -> was bedeutet denn eig template, bzw
> was genau ist das Template?? die generische Klasse, oder
> was genau?? das bsp ist jedenfalls so:
> template <class T> SimpleArray<T>::SimpleArray (int r, T
> f)
> dh man muss anstatt SimpleArray immer SimpleArray<T>
> schreiben, oder??
Ja. (Eventuell gibt's ein paar Aussagen, da bin ich mir gerade nicht 100%ig sicher, aber im Zweifelsfall ist das <T> da immer besser.)
> auch hier wieder die gleiche Fragestellung wie oben:
> SimpleArray<int> g (3,4) muss man das so machen oder
> reicht nicht SimpleArray g(3,4) ???
Bei der Deklaration von g vom Typ SimpleArray<int> musst du das <int> schon angeben.
> Soo...jetzt zu den Containern...
> Was ist eig ein Container?? Ist das eine Art Datentyp wie
> Liste (meine mal sowas gelesen zu haben) ???
Ja, wobei es etwas abstrakter ist. Ob der Container nun im Endeffekt eine (verkettete) Liste, ein Array, ein Baum, eine Hashtabelle oder sonstwas ist, ist voellig egal. Ein Container ist einfach etwas abstraktes, wo man Objekte reinstecken und wieder rausholen kann. Es ist sozuagen ein Konzept, und eine generische Klasse kann eine spezielle Art von Container "implementieren" (die wiederum unabhaengig vom Datentyp ist, weil generisch).
> und was ist dann ein Vector bzw eine map??
Das sind jeweils Container, bzw. verschiedene Realisierungen des Konzeptes Container.
> Mir ist das in den Erklärungen bis jetzt immer ein wenig
> zu abstrakt gewesen...
Es ist auch sehr Abstrakt
Aber irgendwann gewoehnt man sich dran. Mal ein Beispiel. Wenn du eine einfache Sortierroutine schreiben willst (die nur mit zwei benachbarten Elementen schreibst), brauchst du ja nur eine Datenstruktur wo du zum naechsten/vorherigen Element kommen kannst und weisst ob du beim letzten oder ersten Element bist. Ob die Elemente nun als Array oder Liste gespeichert werden ist dir ziemlich egal. Also schaust du nach, ob es ein Konzept gibt, welches gerade das bedient (z.B. ein (spezieller) Container) und schreibst deine Sortierungs-Routine so, dass sie mit allen Containern (oder allen Containern eines bestimmten Types, wie etwa vector und list, aber nicht map) zusammenarbeitet.
(Falls du mal mit Java gearbeitet hast: Interfaces dort sind sozusagen formalisierte Versionen eines Konzeptes wie Container: sie sagen genau was ein Container koennen soll. In C++ ist ein solches Konzept nicht umbedingt formal fixiert.)
LG Felix
|
|
|
|