Nirvana Iterator?



  • Hallo,
    angenommen, ein vector v ist leer.
    Wohin zeigt dann v.begin() ? 😕



  • Auf v.end() .



  • undefiniert.

    hab auch eine frage:

    wenn vector mit new erzeugt wird und schon ein paar elemente hat - muss man vector.clear() machen oder reicht delete vector schon aus, wenn ich das programm beenden will? die elemente sind dann nirvana ja?



  • xBlackKnightx schrieb:

    undefiniert.

    Falsch.

    ISO/IEC14882 23.1/7 schrieb:

    begin() returns an iterator referring to the first element in the container. end() returns an iterator
    which is the past-the-end value for the container. If the container is empty, then begin() == end();

    wenn vector mit new erzeugt wird und schon ein paar elemente hat - muss man vector.clear() machen oder reicht delete vector schon aus, wenn ich das programm beenden will? die elemente sind dann nirvana ja?

    Es macht nicht viel Sinn einen std::vector mit new zu erzeugen.

    Falls du das doch machst, reicht ein delete aus, da die Elemente im vector ja automatisch verwaltet werden und somit spätestens beim zerstören des vectors ebenfalls zerstört werden.



  • xBlackKnightx schrieb:

    undefiniert.

    Richtig.

    ISO/IEC14882 23.1/7 schrieb:

    begin() returns an iterator referring to the first element in the container. end() returns an iterator
    which is the past-the-end value for the container. If the container is empty, then begin() == end();

    Und end() zu dereferenzieren, erzeugt undefiniertes Verhalten.



  • iterator vectorzeigtwohin schrieb:

    Hallo,
    angenommen, ein vector v ist leer.
    Wohin zeigt dann v.begin() ?

    Das ist ganz egal, weil Du das Ding nicht dereferenzieren darfst. Trotzdem bekommst Du ein gültiges Iterator-Objekt und kannst es mit dem von .end() vergleichen. Es ist also völlig in Ordnung so etwas zu schreiben:

    void foo(vector<int> * pv)
    {
      for(vector<int>::iterator bed = pv->begin(),
                                end = pv->end();
          beg != end; ++beg)
      {
        *beg *= 2;
      }
    }
    

    ...auch wenn der Vektor leer ist. *beg wird ja dann nicht ausgeführt, weil beg==end gilt.

    Gruß,
    SP



  • Badestrand schrieb:

    xBlackKnightx schrieb:

    undefiniert.

    Richtig.

    Wohin begin zeigt ist sehr wohl definiert.

    EDIT:
    OK, es ist nich definiert, wohin end zeigt. Aber der iterator ist auf jeden Fall gültig.



  • drakon schrieb:

    Wohin begin zeigt ist sehr wohl definiert.

    Wohin zeigt es denn, wenn begin()==end() 😕



  • xBlackKnightx schrieb:

    wenn vector mit new erzeugt wird und schon ein paar elemente hat - muss man vector.clear() machen oder reicht delete vector schon aus, wenn ich das programm beenden will? die elemente sind dann nirvana ja?

    Auch wenn Nirvana so ein cooler Ausdruck ist, wäre es gut, Sätze etwas präziser zu formulieren. Wenn du delete auf den std::vector anwendest, wird dessen Destruktor aufgerufen, was die Zerstörung der Elemente und Freigabe des Speichers auslöst. Weitere Zugriffe auf die Elemente resultieren somit in undefiniertem Verhalten.


Anmelden zum Antworten