std::vector - wie wurde er erstellt?



  • Der Trick dabei ist, dass man eben keine automatische Arrays (auf dem Stack) nimmt, sondern sie dynamisch anfordert (Heap) und dort kann die Grösse auch erst zur Laufzeit bekannt sein.
    Steht eigentlich alles in dem Link von volkard in Form von Code, aber das ist so das Prinzip.



  • Schaue dir mal den std::Allocator an, dann sollte alles etwas deutlicher werden.



  • volkard schrieb:

    Ungefähr so http://www.workgruppe.de/cpp/this__datei_vectorh.html könnte man es dynamisch hinkriegen. Ist aber nicht exceptionsicher und hat auch kein nettes push_back.

    Deutsche Parameternamen sollten generell Punkteabzug bringen 🙂

    MfG SideWinder



  • SideWinder schrieb:

    volkard schrieb:

    Ungefähr so http://www.workgruppe.de/cpp/this__datei_vectorh.html könnte man es dynamisch hinkriegen. Ist aber nicht exceptionsicher und hat auch kein nettes push_back.

    Deutsche Parameternamen sollten generell Punkteabzug bringen 🙂

    MfG SideWinder

    Sprache wäre ja egal, aber mischen geht gar nicht. 😃



  • Merci beaucoup!

    Gruß



  • Kóyaánasqatsi schrieb:

    Schaue dir mal den std::Allocator an, dann sollte alles etwas deutlicher werden.

    Wenn du Scherze machst solltest du wenigstens Smileys dranschreiben, damit man auch ne Chance hat sie als solche zu erkennen.



  • SideWinder schrieb:

    Deutsche Parameternamen sollten generell Punkteabzug bringen 🙂

    Englisch ist mir zwar auch lieber, aber viel schlimmer find ich beides gemischt.



  • @hustbaer
    Nanu, wo ist das Smiley... 😕



  • Kein Scherz, daher auch kein Smiley.

    Glaubst du dass dem OP damit geholfen ist, wenn du std::allocator (kleines a) erwähnst? Ich glaube nicht.



  • hustbaer schrieb:

    Glaubst du dass dem OP damit geholfen ist, wenn du std::allocator (kleines a) erwähnst? Ich glaube nicht.

    Doch, ich denke sehr wohl das es ihm hilft. Mir hat es enorm dabei geholfen zu raffen, wie ein std::vector funktioniert.



  • Naja ich kanns mir nicht vorstellen.

    So wie ich die ursprüngliche Frage verstehe, geht es dem OP nicht um "Feinheiten" wie dass erstmal "roher" Speicher angefordert wird, und die Elemente da Stück für Stück reinkonstruiert, oder dass man std::vector mit alternativen Allokatoren instanzieren könnte oder etwas in der Art. Bzw. wie das alles geht.

    Es fehlt hier schon am grundlegenden new T[sizeSpecifiedAtRuntime] .

    Und jemand der eine Frage auf dem Niveau stellt, hat IMO sicher nichts davon, wenn man ihm vorschlägt sich mal was zu std::allocator anzusehen.

    Falls der OP das anders sieht, möge er mich bitte korrigieren (falls er noch mitliest, was freilich fraglich ist).



  • Falls der OP das anders sieht, möge er mich bitte korrigieren (falls er noch mitliest, was freilich fraglich ist).

    Ich lese immer mit 😛

    Es fehlt hier schon am grundlegenden new T[sizeSpecifiedAtRuntime] .

    Eigentlich nicht, jedenfalls dachte ich das immer... wie soll denn new T funktionieren, wenn T zum Beispiel int* ist?
    Dann wäre die Compileraktion doch new int*[x] , und das geht doch sicherlich nicht. Deshalb auch die Frage, da ich nicht damit gerechnet habe, dass es doch so "simpel" ist.

    wenn man ihm vorschlägt sich mal was zu std::allocator anzusehen.

    Das stimmt wohl. Zwar lerne ich auch gerne an praktischen Beispielen, bei sowas sollte man aber (auch meiner Erfahrung nach) lieber nachfragen, denn es ist besser, es sich gleich richtig einzuprägen, anstatt den Code in einer (für mich sehr unübersichtlichen) Bibliothek falsch zu interpretieren.

    Edit: Ach ja, @ hustbaer: Wenn du Lust hast, würde ich mich freuen wenn du mir noch einmal helfen könntest. Du hast mir damals auf eine Frage zum Pluginsystem geantwortet und scheintest dich ganz gut damit auszukennen. Siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-264751.html (bitte nicht so auffassen als ob ich jetzt eine Antwort erwarte - ich weiß, dass das hier alles freiwillig ist ;))

    Gruß und Danke.



  • theliquidwave schrieb:

    Es fehlt hier schon am grundlegenden new T[sizeSpecifiedAtRuntime] .

    Eigentlich nicht, jedenfalls dachte ich das immer... wie soll denn new T funktionieren, wenn T zum Beispiel int* ist?

    Genauso wie in jedem anderen Fall. Ob du nun ein Array von Integern oder ein Array von Integerzeigern hast, ist ziemlich egal.



  • asc schrieb:

    theliquidwave schrieb:

    Es fehlt hier schon am grundlegenden new T[sizeSpecifiedAtRuntime] .

    Eigentlich nicht, jedenfalls dachte ich das immer... wie soll denn new T funktionieren, wenn T zum Beispiel int* ist?

    Genauso wie in jedem anderen Fall. Ob du nun ein Array von Integern oder ein Array von Integerzeigern hast, ist ziemlich egal.

    Genau. Viele machen den Fehler, dass sie Zeiger irgendwie als keine richtigen Typen anerkennen und immer Spezialfälle erwarten.

    Am besten macht man einfach mal das hier:

    typedef int* int_pointer;
    
    int_pointer a;
    

    Man stellt sich da einfach mal dumm und stellt sich am besten gar nichts mit Sternchen vor, sondern, dass das einfach eine Klasse ist, wo man halt ein paar Operationen drauf ausführen kann, wie -> oder *.

    Lediglich auf die Invarianz muss geachtet werden (von wegen 0 Pointer und so) und darf die Operationen nicht immer drauf anwenden. Ansonsten verhält sich int_pointer genau gleich, wie andere Typen auch.



  • Hi.
    Ok 😉

    Mal ne Frage... In dem Beispiel: http://www.workgruppe.de/cpp/this__datei_vectorh.html
    Ganz unten steht delete m_data; - das ist doch ein Memory Leak oder nicht? Weil der Kram mit new[] angelegt wird. Oder habe ich was falsch verstanden?

    Gruß



  • theliquidwave schrieb:

    Ganz unten steht delete m_data; - das ist doch ein Memory Leak oder nicht? Weil der Kram mit new[] angelegt wird.

    Schlimmer noch, das ist undefiniertes Verhalten. Man muss immer die entsprechenden Speicheranforderungs- und Freigabeoperatoren verwenden. Also new mit delete und new[] mit delete[] zusammen.


Anmelden zum Antworten