Fragen zu: Vektoren und Zeiger in Klassen



  • Hi,
    mein Fragen:

    1.) Ich habe noch nicht all zu viel erfahrung bezüglich Vektoren. Anscheinend sind es sehr dynamische Arrays. Mit .push_back kann man ja ein neues Element am Ende des Vektors anhängen. Das ist mir doch etwas sehr dynamisch, deshalb wollte ich mich um die Laufzeitgeschwindigkeit bei Vektoren erkundigen, die demnach ja misserabel (im vergleich zu normalen arrays) sein muss.

    2.) In meinem C++ - Buch ("C++ von A bis Z" von Jürgen Wolf; Galileo Computing; ausgeliehen von nem Kumpel hehe :D) verwendet der Autor folgende Aufrufmöglichkeiten:
    Call-by-Value (kein zeiger, funktion arbeitet mit kopien der Argumente)
    Call-by-Reference (zeiger, veränderung der argumente-werte möglich)

    Bei Call-by-Value ist mir alles klar, nur by Call-by-Reference verwendet Jürgen Wolf einmal diese Methode:

    /*
    Definierung der Klasse "Mensch"
    ...
    */
    const char* get_name( void );
    /*
    Definition der Methoden in der externen .cpp Datei
    ...
    */
    const char* Mensch::get_name( void ) {
        return name;
    }
    

    Warum genau wird hier ein const char-Pointer verwendet?
    Um den Namen auszugeben verwendet er:

    cout << person.get_name() << endl;
    

    Würde hier nicht nur der Zeiger auf "name" ausgegeben? Müsste nicht

    cout << &peron.get_name() << endl;
    

    verwendet werden?
    Denn der rückgabe typ von get_name() ist doch const char*, also würde doch bei einer Ausgabe auch nur die Speicheraddresse ausgegeben werden.

    Was mich außerdem noch wundert: Warum ist der Rückgabe wert const, wenn es noch eine Methode gibt, die den Namen per set_name ändert?

    Bei den Alters und Geschlechtsmethoden der Klasse jedoch wird KEIN pointer verwendet. Das verwirrt mich, könnte mir das bitte jemand erlären?

    Noch eine Frage zu den Pointer in Methoden:

    void Mensch::set_name( const char* n ) {
    /*
    ....
    */
    

    Es wird das ganze jedoch mit person.set_name("Peter"); aufgerufen.
    -Warum ist der agumenten typ bei der deklaration "const"?
    -Warum ist der Typ auserdem noch char*? char n = "Peter"; ist doch noch kein Zeiger oder?

    Mfg Krauzi



    1. Oh Gott... 😃
      Das inperformante am vector ist tatsächlich das Vergrößern. Wenn du ein Array nimmst und es wird zu klein, hast du die selben Probleme, da musst du ein neues, größeres temporäres Array anlegen, das alte da rein kopieren und den neuen Wert anhängen. Das macht std::vector eben "versteckt".
      Du kannst einen vector aber auch genau so performant wie ein Array nutzen, wenn du einen passenden Kostruktor mit initialer Größe des Vectors wählst, oder mit reserve oder resize die Größe des Vectors vor dem Befüllen anpasst.
      http://cplusplus.com/reference/stl/vector/
      Ansonsten gibt es noch std::list. Das ist beim Vergößern und Einfügen in der Mitte sehr performant, du hast aber keinen Indexzugriff. Lässt sich mit std::advance() umgehen, ist aber nicht so performant wie der Indexzugriff bei std::vector.

    2. Der Codeausschnitt hat aber gar nichts mit Call-By-Reference zu tun!
      Call bei Reference hat was mit Funktionsargumenten zu tun, nicht mit Rückgabetypen. Ich denke das solltest du dir nochmal genauer durchlesen...
      Auch den Unterschied zwischen Zeiger und Referenz vllt. nochmal verinnerlichen.



  • Krauzi schrieb:

    Das ist mir doch etwas sehr dynamisch, deshalb wollte ich mich um die Laufzeitgeschwindigkeit bei Vektoren erkundigen, die demnach ja misserabel (im vergleich zu normalen arrays) sein muss.

    Nein! Langsam wirds nur, falls du den Vector vergrösserst, und selbst dann nur, wenn die Kapazität erschöpft ist und ein neuer Speicherblock angefordert werden muss. Oder natürlich beim Einfügen/Löschen in der Mitte oder am Anfang.

    Ich frage mich, wie manche Leute immer wieder zu solchen Schlussfolgerungen kommen. Es gibt keinen prinzipiellen Grund, wieso std::vector langsamer sein sollte als ein mit new angelegtes Array. Wie schon erwähnt, wird dir bei std::vector einfach die Handarbeit abgenommen.



  • hm eben aus dem grund, den du anfangs erwähnt hast. Aber eigentlich dürfte ich aus einem anderen Grund überhaupt keine Folgerungen ziehen: Ich hab keine ahnung von vektoren :D.


Anmelden zum Antworten