Uebungen 9.12 - 9.14



  • David_pb schrieb:

    Ich seh hier nirgends etwas das der Speicher freigegeben werden muss. Darum sollte es zu 100% sicher sein über begin()+size() zu schreiben. Man schreibt ja nicht über den reservierten Speicherbereich hinaus.

    da steht auch nicht, dass er es nicht muss.



  • was der standard (bzw. die spezifikation) nicht ausdrücklich definiert, ist undefiniert. solange im standard weder steht, dass der speicher ausdrücklich freigegeben werden muss oder ausdrücklich reserviert bleiben muss, ist es einer implementierung frei überlassen, wie sie das umsetzt. die meisten werden bei so einer lockeren definition darauf verzichten, den speicher explizit freizugeben, aber eine andere macht es womöglich nicht.



  • Klar, aber eine Freigabe würde die Kompexität der Funktion verändern. Und die scheint ja vorgegeben zu sein. Naja, ein guter Gedanke sowas zu tun ist es trotzdem nicht.



  • David_pb schrieb:

    Klar, aber eine Freigabe würde die Kompexität der Funktion verändern. Und die scheint ja vorgegeben zu sein. Naja, ein guter Gedanke sowas zu tun ist es trotzdem nicht.

    es ist ein gedanke, den man gar nicht erst fassen sollte, weil er schlicht zu fehlerhaftem code führt.



  • Mag sein, aber kannst du das auch belegen?



  • und am ende ist noch zu beachten, dass der vector theoretisch den freien arrayplatz nutzen kann wie er lustig ist, zb zum speicherblockverschieben...



  • Wie wärs mit DevCPP ?
    Der ist kostenlos...

    www.bloodshed.net



  • Aaah, ich kann's mir nicht verkneifen …

    Wieso braucht man mehr als eine Zeile, um eine Zahl in einem Vektor zu suchen?!

    template <typename It>
    bool contains(It begin, It end, int num)
    {
        return begin != end and (*begin == num or contains(begin + 1, end, num));
    }
    


  • weil ich so eine funktion lieber nicht mit 500k elementen aufrufe *G



  • thordk schrieb:

    weil ich so eine funktion lieber nicht mit 500k elementen aufrufe *G

    Merde, der VC++ schafft es tatsächlich nicht, die Endrekursion zu erkenne. 😞 Schade.



  • Um mal die ganze Diskussion über die Speichernutzung des vector<>s abzukürzen: Die Kapazität des vector's verringert sich im Normalbetrieb nicht, die Größe schon. Und was im Bereich zwischen begin()+size() und begin()+capacity() steht, liegt ganz im Zuständigkeitsbereich des vector's (faktisch ist das Datenmüll, den der Anwender nicht nutzen sollte). Das bedeutet insbesondere, daß die überschüssigen Elemente beim Kopieren verloren gehen und bei der nächsten Größenänderung überschrieben werden können (der vector geht davon aus, daß sie nicht genutzt werden, also wird es sich auch nicht um sie kümmern). Bei einem vector<int> kann das tatsächlich gut gehen, aber z.B. bei einem vector<string> provozierst du mit sowas Access Violations.

    PS: Und wenn schon einen Einzeiler, dann lieber so:

    template<typename It,typename Val>
    bool contains(It begin,It end,const Val& v)
    {
      return std::find(begin,end,v) != end;
    }
    


  • CStoll schrieb:

    PS: Und wenn schon einen Einzeiler, dann lieber so:

    Das weiß bestimmt Konrad. Nur er hat in letzter Zeit immer so ein Einzeiler-Rekursiv-Tick 😃



  • CStoll schrieb:

    PS: Und wenn schon einen Einzeiler, dann lieber so:

    Na, es ging ja darum, es selber zu implementieren und nicht Bibliotheksfunktionen zu verwenden.



  • Konrad Rudolph schrieb:

    CStoll schrieb:

    PS: Und wenn schon einen Einzeiler, dann lieber so:

    Na, es ging ja darum, es selber zu implementieren und nicht Bibliotheksfunktionen zu verwenden.

    Also wenn die STL verboten ist, sollte man das auch dazusagen (aber dann würde es auch wenig Sinn machen, mit vector zu hantieren).



  • hallo,

    Ich wuerde nur gerne wissen ob nun der vector bei

    vector<int> vec(25, 3); //25 Elemente mit dem Wert(nur so als Beispiel:) 3
    vec.resize(100); // Hier kommen 75Elemente mit Wert 0 dazu
    vec.resize(10); // vec hat 10Elemente mit dem Wert 3
    

    der letzten Zeile auf 10Elemente mit dem Wert 3 gemacht wurde oder nicht 😉

    Bitte korrigiert meine Beispiele 🙂

    Beispiel 9.20:

    Schreiben Sie ein Programm, das die Elemente eines Vektors aus Integerwerten mit den Elementen einer Liste aus Integerwerten auf Gleichheit ueberprueft.

    Mein Code:

    vector<int> xvec(10, 5);
    list<int> xlist(10, 5);
    if (xvec == xlist)
    {
    cout << "True" << endl;
    } else {
    cout << "False" << endl;
    }
    

    Uebung 9.22:

    Gegeben ist vec, das 25Elemente enthaelt. Welche Auswirkung hat der Befehl vec.resize(100)? Was passiert, wenn wir als naechstes den Befehl vec.resize(10) ausfuehren wuerden?

    Mein Code:

    vector<int> vec(25, 3); //25 Elemente mit dem Wert(nur so als Beispiel:) 3
    vec.resize(100); // Hier kommen 75Elemente mit Wert 0 dazu
    vec.resize(10); // vec hat 10Elemente mit dem Wert 3
    

    Mit freundlichen Gruessen - Roland



  • <wWw> schrieb:

    hallo,

    Ich wuerde nur gerne wissen ob nun der vector bei

    vector<int> vec(25, 3); //25 Elemente mit dem Wert(nur so als Beispiel:) 3
    vec.resize(100); // Hier kommen 75Elemente mit Wert 0 dazu
    vec.resize(10); // vec hat 10Elemente mit dem Wert 3
    

    der letzten Zeile auf 10Elemente mit dem Wert 3 gemacht wurde oder nicht 😉

    Ja, alle Elemente die über 10 liegen werden gelöscht.

    <wWw> schrieb:

    Beispiel 9.20:

    Schreiben Sie ein Programm, das die Elemente eines Vektors aus Integerwerten mit den Elementen einer Liste aus Integerwerten auf Gleichheit ueberprueft.

    Mein Code:

    vector<int> xvec(10, 5);
    list<int> xlist(10, 5);
    if (xvec == xlist)
    {
    cout << "True" << endl;
    } else {
    cout << "False" << endl;
    }
    

    Ne das geht so nicht.
    Du hast folgende Möglichkeiten:

    //1.
    vector<int> xvec(10, 5);
    list<int> xlist(10, 5);
    
    if(vector<int>(xlist.begin(),xlist.end()) == xvec)
         cout << "true" << endl;
    else cout << "false" << endl;
    
    //2.
    // xvec oder xlist durchlaufen und mt den Elementen von 
    // xvec bzw xlist vergleichen, darauf achten das beide gleich groß sind ;)
    

    [/quote]



  • KasF schrieb:

    <wWw> schrieb:

    hallo,

    Ich wuerde nur gerne wissen ob nun der vector bei

    vector<int> vec(25, 3); //25 Elemente mit dem Wert(nur so als Beispiel:) 3
    vec.resize(100); // Hier kommen 75Elemente mit Wert 0 dazu
    vec.resize(10); // vec hat 10Elemente mit dem Wert 3
    

    der letzten Zeile auf 10Elemente mit dem Wert 3 gemacht wurde oder nicht 😉

    Ja, alle Elemente die über 10 liegen werden gelöscht.

    Das stimmt nur wenn die Frage sich auf die Elemente bezieht die tatsächlich- und nicht die Elemente die theoretisch, ohne neu speicher zu reservieren, zur verfügung stehen.



  • David_pb schrieb:

    Das stimmt nur wenn die Frage sich auf die Elemente bezieht die tatsächlich- und nicht die Elemente die theoretisch, ohne neu speicher zu reservieren, zur verfügung stehen.

    Das will mir gerade irgendwie nicht in den Kopf gehen. Kannst du bissl erläutern :).



  • Weil beim löschen der Elemente nicht die Kapazität des vectors kleiner wird sondern lediglich die Objekte zerstört werden und der end-Iterator neu gesetzt wird. Zumindest kenn ich keine Implementation von C++ die das anders löst. 🙂



  • David_pb schrieb:

    Weil beim löschen der Elemente nicht die Kapazität des vectors kleiner wird sondern lediglich die Objekte zerstört werden und der end-Iterator neu gesetzt wird. Zumindest kenn ich keine Implementation von C++ die das anders löst. 🙂

    Ja das ist mir schon klar: http://c-plusplus.net/forum/viewtopic-var-p-is-1322937.html#1322937

    Aber alles andere momentan nicht ... Ich mach jetzt die Kiste aus 😉


Anmelden zum Antworten