<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Einträge aus STL Container löschen]]></title><description><![CDATA[<p>Hallo NG,</p>
<p>ich würde gerne wissen wohin ein Iterator zeigt, wenn ich das Element aus dem STL Container lösche, auf das der Iterator zeigt. Ich habe eigentlich erwartet, daß der Iterator entweder auf das vorherige oder auf das nachfolgende Element zeigt. Aber das scheint nicht so zu sein und eine Spezifikation dazu hab ich auch nicht gefunden. Als Beispiel dient folgender Sourcecode:</p>
<pre><code class="language-cpp">multimap&lt;unsigned int, Example *&gt; aLotOfExamples;
  multimap&lt;unsigned int, Example *&gt;::iterator firstExample;
  pair&lt;std::multimap&lt;unsigned int, Example *&gt;::iterator,
            std::multimap&lt;unsigned int, Example *&gt;::iterator&gt; listOfDoublets;
  const unsigned int LIMIT    = 10;
  const unsigned int AMOUNT   = 10000000;
  unsigned int index          = 0;
  unsigned int key            = 0;
  unsigned int doomedExample  = 0;
  unsigned int doublets       = 0;
  unsigned int indexDoublets  = 0;

  srand(static_cast&lt;unsigned int&gt;(time(NULL)));

  for (index = 0; index &lt; LIMIT; index++){
    firstExample = aLotOfExamples.insert(std::pair&lt;unsigned int,
      Example *&gt;(rand() % LIMIT, new Example()));
  }

  for (index = 0; index &lt; LIMIT; index++){
    key = rand() % LIMIT;
    doublets = aLotOfExamples.count(key);
    if (0 &lt; doublets){
      listOfDoublets = aLotOfExamples.equal_range(key);
      firstExample = listOfDoublets.first;
      indexDoublets = 0;
      doomedExample = rand() % doublets;
      while (indexDoublets &lt; doomedExample){
        firstExample++;
        indexDoublets++;
      }
      delete firstExample-&gt;second;
      aLotOfExamples.erase(firstExample);

      // Whereto points firstExample now????
    }
  }

  for (firstExample = aLotOfExamples.begin();
    firstExample != aLotOfExamples.end(); firstExample++){
    delete firstExample-&gt;second;
  }
  aLotOfExamples.clear();
</code></pre>
<p>Grüße, M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195980/einträge-aus-stl-container-löschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 07:05:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195980.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Oct 2007 08:18:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:18:09 GMT]]></title><description><![CDATA[<p>Hallo NG,</p>
<p>ich würde gerne wissen wohin ein Iterator zeigt, wenn ich das Element aus dem STL Container lösche, auf das der Iterator zeigt. Ich habe eigentlich erwartet, daß der Iterator entweder auf das vorherige oder auf das nachfolgende Element zeigt. Aber das scheint nicht so zu sein und eine Spezifikation dazu hab ich auch nicht gefunden. Als Beispiel dient folgender Sourcecode:</p>
<pre><code class="language-cpp">multimap&lt;unsigned int, Example *&gt; aLotOfExamples;
  multimap&lt;unsigned int, Example *&gt;::iterator firstExample;
  pair&lt;std::multimap&lt;unsigned int, Example *&gt;::iterator,
            std::multimap&lt;unsigned int, Example *&gt;::iterator&gt; listOfDoublets;
  const unsigned int LIMIT    = 10;
  const unsigned int AMOUNT   = 10000000;
  unsigned int index          = 0;
  unsigned int key            = 0;
  unsigned int doomedExample  = 0;
  unsigned int doublets       = 0;
  unsigned int indexDoublets  = 0;

  srand(static_cast&lt;unsigned int&gt;(time(NULL)));

  for (index = 0; index &lt; LIMIT; index++){
    firstExample = aLotOfExamples.insert(std::pair&lt;unsigned int,
      Example *&gt;(rand() % LIMIT, new Example()));
  }

  for (index = 0; index &lt; LIMIT; index++){
    key = rand() % LIMIT;
    doublets = aLotOfExamples.count(key);
    if (0 &lt; doublets){
      listOfDoublets = aLotOfExamples.equal_range(key);
      firstExample = listOfDoublets.first;
      indexDoublets = 0;
      doomedExample = rand() % doublets;
      while (indexDoublets &lt; doomedExample){
        firstExample++;
        indexDoublets++;
      }
      delete firstExample-&gt;second;
      aLotOfExamples.erase(firstExample);

      // Whereto points firstExample now????
    }
  }

  for (firstExample = aLotOfExamples.begin();
    firstExample != aLotOfExamples.end(); firstExample++){
    delete firstExample-&gt;second;
  }
  aLotOfExamples.clear();
</code></pre>
<p>Grüße, M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391000</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:26:14 GMT]]></title><description><![CDATA[<p>BlackPepper schrieb:</p>
<blockquote>
<p>...<br />
ich würde gerne wissen wohin ein Iterator zeigt, wenn ich das Element aus dem STL Container lösche, auf das der Iterator zeigt. ...</p>
</blockquote>
<p>Ganz einfach: Undefiniert !</p>
<p>Löschen macht alle iteratoren auf gelöschte Elemente ungültig.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391004</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:36:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn ich einen Container mit einer entsprechenden Operation zur Verfügung stellen würde, würde ich nach dem Löschen auf das darauf folgende Element zeigen, beziehungswese auf das vorherige wenn ich schon am Ende gewesen wäre. Nur wenn ich das einzige Element gelöscht hätte, hätte ich auf NULL verwiesen. Wenn das dem Anwender nicht passt, kann er immer noch von vorne beginnen. Etwas ähnliches hab ich auch bei den STL Containern erwartet und gemerkt, das es nicht so ist. Nur ist nichts dokumentiert. Zumindest habs ich nicht gefunden.</p>
<p>Grüße M. Incani</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>BlackPepper schrieb:</p>
<blockquote>
<p>...<br />
ich würde gerne wissen wohin ein Iterator zeigt, wenn ich das Element aus dem STL Container lösche, auf das der Iterator zeigt. ...</p>
</blockquote>
<p>Ganz einfach: Undefiniert !</p>
<p>Löschen macht alle iteratoren auf gelöschte Elemente ungültig.</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1391012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391012</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:44:26 GMT]]></title><description><![CDATA[<p>BlackPepper schrieb:</p>
<blockquote>
<p>wenn ich einen Container mit einer entsprechenden Operation zur Verfügung stellen würde, würde ich nach dem Löschen auf das darauf folgende Element zeigen, beziehungswese auf das vorherige wenn ich schon am Ende gewesen wäre. Nur wenn ich das einzige Element gelöscht hätte, hätte ich auf NULL verwiesen. Wenn das dem Anwender nicht passt, kann er immer noch von vorne beginnen. Etwas ähnliches hab ich auch bei den STL Containern erwartet und gemerkt, das es nicht so ist. Nur ist nichts dokumentiert. Zumindest habs ich nicht gefunden.</p>
</blockquote>
<p>(ad Ändern) By Design werden Iteratoren eigentlich immer als Wert übergeben. Damit haben die entsprechenden Funktionen garnicht die Möglichkeit ihn zu ändern.</p>
<p>(ad Doku) Hast Du Dir schonmal die Dokumentation zu erase angeschaut? Bzw. was diese Funktion zurückliefert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391021</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:47:45 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich habe nachgesehen in <a href="http://www.amazon.de/Die-Standardbibliothek-Einf%C3%BChrung-Nachschlagewerk-Einfuhrung/dp/3540256938/" rel="nofollow">Kuhlins/Schrader: Die C++-Standardbibliothek</a> (allerdings nur die 2 Auflage).</p>
<p>Wieso das im Standard so definiert, weiß ich jetzt auch nicht (bei vectoren ist mir das klar, aber hier (wo es nur die gelöschten Elemente betrifft) nicht).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391027</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:51:01 GMT]]></title><description><![CDATA[<p>Ja, hab ich. Dort steht nur, was erase mit dem Element im container macht. Zumindest in der Doku die ich benutzt hab (<a href="http://www.cppreference.com" rel="nofollow">http://www.cppreference.com</a>, Ein Buch über die STL von Addison-Wesley). Ansonsten laß mich wissen wo Du nachschaust.</p>
<p>Grüße M. Incani</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>(ad Ändern) By Design werden Iteratoren eigentlich immer als Wert übergeben. Damit haben die entsprechenden Funktionen garnicht die Möglichkeit ihn zu ändern.</p>
<p>(ad Doku) Hast Du Dir schonmal die Dokumentation zu erase angeschaut? Bzw. was diese Funktion zurückliefert?</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1391028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391028</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:52:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>leider hab ich das Buch nicht. Was steht denn dort?</p>
<p>Grüße M. Incani</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>also ich habe nachgesehen in <a href="http://www.amazon.de/Die-Standardbibliothek-Einf%C3%BChrung-Nachschlagewerk-Einfuhrung/dp/3540256938/" rel="nofollow">Kuhlins/Schrader: Die C++-Standardbibliothek</a> (allerdings nur die 2 Auflage).</p>
<p>Wieso das im Standard so definiert, weiß ich jetzt auch nicht (bei vectoren ist mir das klar, aber hier (wo es nur die gelöschten Elemente betrifft) nicht).</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1391029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391029</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 08:53:31 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>...<br />
(ad Doku) Hast Du Dir schonmal die Dokumentation zu erase angeschaut? Bzw. was diese Funktion zurückliefert?</p>
</blockquote>
<pre><code class="language-cpp">void multimap::erase( iterator pos );
size_type multimap::erase( const key_type&amp; key );
</code></pre>
<p>helfen da nicht wirklich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391031</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:10:29 GMT]]></title><description><![CDATA[<p>BlackPepper schrieb:</p>
<blockquote>
<p>Hallo,<br />
leider hab ich das Buch nicht. Was steht denn dort?<br />
...</p>
</blockquote>
<p>Naja. insgesamt hat es 400 Seiten und das Kapitel über Container immerhin auch fast 60. Du verzeihst mir, wenn ich das jetzt nicht abtippe, hoffe ich ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber das Entscheidende ist:</p>
<p>Seite 105 (Kap. 7.2) schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void erase(iterator position);
</code></pre>
<p>[...]<br />
Der Wert des Iterators ist nach dem Aufruf von erase nicht mehr definiert, weil der Element auf das er verwies, gelöscht wurde. erase(end()) hat keinen Effekt.<br />
[...]<br />
Bei allen drei Versionen der Elementfunktion erase verlieren nur Referenzen, Zeiger und Iteratoren auf gelöschte Containerelemente ihre Gültigkeit. Im Gegensatz zu den entsprechenden Funktionen sequentieller Container ist der Rückgabetyp für die beiden letzten Elementfunktionen void statt iterator [...], weil so die unter Umständen recht aufwändige BEstimmung des nachfolgenden Containerelements entfällt.</p>
</blockquote>
<p>Übrigens:</p>
<p>BlackPepper schrieb:</p>
<blockquote>
<p>...würde ich nach dem Löschen auf das darauf folgende Element zeigen, beziehungswese auf das vorherige wenn ich schon am Ende gewesen wäre. Nur wenn ich das einzige Element gelöscht hätte, hätte ich auf NULL verwiesen....</p>
</blockquote>
<p>Ersteres fände ich &quot;kernschlecht&quot;: &quot;Mal auf das folgende, mal auf das vorherige verweisen&quot; ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Sorry, das ist total unbrauchbar. Außerdem wäre das Verhalten komplett anders als bei andern Containern, was den Umgang nicht einfacher machen würde (und einen Containertausch quasi unmöglich).</p>
<p>Zweiteres ist nicht nur wegen der &quot;CopyÜbergabe&quot; (s. LordJaxom) unmöglich (könnte man ja ändern), sondern deswegen weil es gar kein &quot;NULL&quot; bei Iteratoren gibt. Anders ausgedrückt: Du müsstest nicht nur den Container ändern, sondern auch die komplette Semantik von Iteratoren - und spätestens da, wo Iteratoren zu simplen Zeigern degenerieren, hättest Du den Bruch.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391034</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:06:39 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Naja. insgesamt hat es 400 Seiten und das Kapitel über Container immerhin auch fast 60. Du verzeihst mir, wenn ich das jetzt nicht abtippe, hoffe ich ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Ausnahmsweise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber das Entscheidende ist:</p>
<p>Seite 105 (Kap. 7.2) schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void erase(iterator position);
</code></pre>
<p>[...]<br />
Der Wert des Iterators ist nach dem Aufruf von erase nicht mehr definiert, weil der Element auf das er verwies, gelöscht wurde. erase(end()) hat keinen Effekt.<br />
[...]<br />
Bei allen drei Versionen der Elementfunktion erase verlieren nur Referenzen, Zeiger und Iteratoren auf gelöschte Containerelemente ihre Gültigkeit. Im Gegensatz zu den entsprechenden Funktionen sequentieller Container ist der Rückgabetyp für die beiden letzten Elementfunktionen void statt iterator [...], weil so die unter Umständen recht aufwändige BEstimmung des nachfolgenden Containerelements entfällt.</p>
</blockquote>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Danke, das wollte ich wissen. Dein Buch scheint besser zu sein als meins. Muß ich mal unserer Bücherei sagen.</p>
<p>Grüße M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391036</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:08:05 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void multimap::erase( iterator pos );
size_type multimap::erase( const key_type&amp; key );
</code></pre>
<p>helfen da nicht wirklich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Ups. Tatsache. Da ist Dinkumware (meine Onlinereferenz) doch tatsächlich mal nicht 100% standardkonform, deren erase Methoden liefern den nächsten Iterator zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391037</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:09:07 GMT]]></title><description><![CDATA[<p>BlackPepper schrieb:</p>
<blockquote>
<p>...<br />
Ausnahmsweise :-)...</p>
</blockquote>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Welches Buch hast Du denn ?<br />
Zur Info: Ich habe mein letztes Post nochmal um Kommentare zu Deinem Containervorschlag erweitert.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391038</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:12:05 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>...<br />
Ups. Tatsache. Da ist Dinkumware (meine Onlinereferenz) doch tatsächlich mal nicht 100% standardkonform, deren erase Methoden liefern den nächsten Iterator zurück.</p>
</blockquote>
<p>Das Gemeine ist ja, dass Du für andere Container Recht gehabt hättest !! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Finde ich nicht gerade optimal von den STL-Entwicklern ... bestimmt wieder ein Kompromiss oder &quot;historisch gewachsen&quot;.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391042</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:19:12 GMT]]></title><description><![CDATA[<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#130" rel="nofollow">Ein bekanntes Problem</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391048</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:20:07 GMT]]></title><description><![CDATA[<p>Hallo,<br />
für Zweifelsfragen sollte man Zugriff auf die ISO Norm haben.</p>
<p>BlackPepper schrieb:</p>
<blockquote>
<p>Nur ist nichts dokumentiert. Zumindest habs ich nicht gefunden.</p>
</blockquote>
<p>In der ISO Norm steht genau drin, was bei erase passiert.<br />
Für Sequenzen (siehe §23.1.1 Absatz 7 bzw. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="8)"
      alt="😎"
    /> gilt genau das was Du beschreibst, S.erase(q) setzt q auf den Nachfolger von q. Im Zweifelsfall ist das S.end().<br />
Für assoziative Container gilt dagegen § 23.1.2 Absatz 8. Nur die Iteratoren auf die gelöschten Elemente werden ungültig, alle anderen bleiben gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391049</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:24:28 GMT]]></title><description><![CDATA[<p>Also zu dem &quot;mal nachfolgenden, mal vorherigen Element&quot; - man kann immer einen nachfolgenden Iterator zurueckgeben, der nachfolgende des letzten Elements waeere dann end(). Meinen Vorpostern glaube ich entnehmen zu duerfen, dass das bei sequentiellen Containern (vector, deque &amp;Co.) im Standard auch so gemacht wird, bei den anderen Containern ists nicht vorgeschrieben, aber die eine oder andere Bilbiothek (z.B. Dinkumware) machts trotzdem (ist aber dann nicht Standard =&gt; nicht portabel).<br />
Folgendes sollte aber eigentlich fuer alle Container gehn:</p>
<pre><code class="language-cpp">MyContainer::iterator pos;
/* ... */
mycont.erase(pos++);
</code></pre>
<p>Dazu:<br />
Vermutlich ist fuer sequentielle Container der Ausdruck</p>
<pre><code class="language-cpp">pos = mycont.erase(pos);
</code></pre>
<p>mindestens so effizient. Wie gross da die Unterschiede sind weiss ich nicht. Semantisch sehe ich keine Unterschiede, und fuer den Fall dass man sich spaeter noch fuer einen anderen, nicht-sequentiellen Container entscheidet, kann mans auf jeden Fall erstmal bei der ersten Version belassen (Optimierungen sollten ja sowieso immer erst gegen Ende der Entwicklung stattfinden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391050</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 09:29:32 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>BlackPepper schrieb:</p>
<blockquote>
<p>...<br />
Ausnahmsweise :-)...</p>
</blockquote>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Welches Buch hast Du denn ?<br />
Zur Info: Ich habe mein letztes Post nochmal um Kommentare zu Deinem Containervorschlag erweitert.</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Unsere Bücherei hat mehrere STL Bücher. Ich hab ISBN 0-321-41299-0</p>
<p>Grüße M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391053</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:29:32 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 10:26:40 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Also zu dem &quot;mal nachfolgenden, mal vorherigen Element&quot; - man kann immer einen nachfolgenden Iterator zurueckgeben, der nachfolgende des letzten Elements waeere dann end(). Meinen Vorpostern glaube ich entnehmen zu duerfen, dass das bei sequentiellen Containern (vector, deque &amp;Co.) im Standard auch so gemacht wird, bei den anderen Containern ists nicht vorgeschrieben, aber die eine oder andere Bilbiothek (z.B. Dinkumware) machts trotzdem (ist aber dann nicht Standard =&gt; nicht portabel).</p>
</blockquote>
<p>Das Problem dabei ist, daß mehrere Iteratoren auf das selbe Element zeigen könnten - erase() könnte aber nur bestenfalls den Iterator berichtigen, den du übergeben hast (und alle eventuell von dem erase() betroffenen Iteratoren zu finden dürfte wohl jede Laufzeit-Anforderung sprengen).</p>
<blockquote>
<p>Folgendes sollte aber eigentlich fuer alle Container gehn:</p>
<pre><code class="language-cpp">MyContainer::iterator pos;
/* ... */
mycont.erase(pos++);
</code></pre>
</blockquote>
<p>Nein, das fliegt dir bei vector&lt;&gt; (erase() macht alle Iteratoren ab der Löschposition ungültig) und deque&lt;&gt; (erase() könnte alle Iteratoren ungültig machen) vermutlich um die Ohren (oder liefert zumindest nicht das erwartete Ergebnis).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391080</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 24 Oct 2007 10:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 11:15:06 GMT]]></title><description><![CDATA[<p>hm gut... dann sollte auch ich mich mal etwas doller mit den spezifikationen auseinandersetzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391112</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 24 Oct 2007 11:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 12:50:45 GMT]]></title><description><![CDATA[<p>deswegen isses auch bei nichtassiozativen containern vorgeschrieben, das erase() nen wert zurueckliefern muss. Bei assiozativen (map, set) kann mans halt allein neu suchen ... bei nichtassoziativen hat man eher da eher weniger möglichkeiten.</p>
<p>in meinem schlauen buch(die C++ Standardbiblothek) steht das bei allen container bei jeglicher einfuege / loeschoperation alle iteratoren des containers ungueltig werden können.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391194</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 24 Oct 2007 12:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 12:59:25 GMT]]></title><description><![CDATA[<p>Aus der Hilfe von DevStudio 2005:<br />
Da steht auch was mit dem Return-Value passiert.</p>
<p>Für eine multimap gibt es die folgenden erase Funktionen.</p>
<p>iterator erase(<br />
iterator _Where<br />
);<br />
iterator erase(<br />
iterator _First,<br />
iterator _Last<br />
);<br />
size_type erase(<br />
const key_type&amp; _Key<br />
);</p>
<p>Return Value:<br />
For the first two member functions, a bidirectional iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the multimap if no such element exists.</p>
<p>Note that this return type does not conform to the C++ standard.</p>
<p>For the third member function, returns the number of elements that have been removed from the multimap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391202</guid><dc:creator><![CDATA[schokomann]]></dc:creator><pubDate>Wed, 24 Oct 2007 12:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 13:14:10 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>...in meinem schlauen buch(die C++ Standardbiblothek) steht das bei allen container bei jeglicher einfuege / loeschoperation alle iteratoren des containers ungueltig werden ...</p>
</blockquote>
<p>So hatte ich es auch in Erinnerung (und sogar zuerst geschrieben), dann aber nach genauerem Nachschlagen korrigiert.</p>
<p>Und mit</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>...können. ...</p>
</blockquote>
<p>kann man ja alles relativieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Aber mal in den Standard geschaut, ergibt:</p>
<p>23.1.2 Associative Containers Pkt 8 schrieb:</p>
<blockquote>
<p>...The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to te erased elements...</p>
</blockquote>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391208</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 24 Oct 2007 13:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 13:13:58 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>in meinem schlauen buch(die C++ Standardbiblothek) steht das bei allen container bei jeglicher einfuege / loeschoperation alle iteratoren des containers ungueltig werden können.</p>
</blockquote>
<p>Das ist definitiv falsch. Alle Node-basierenden Container (list,map,set) haben naturgemäß stabile Iteratoren und Referenzen, die im Allgemeinen nur ungültig werden, wenn das betreffende Element zerstört wird. Und selbst für vector werden bei erase tatsächlich nur die letzten n (=Anzahl der gelöschten Elemente) Referenzen ungültig - da erase niemals zu Reallokationen führt und das Speicherlayout feststeht; der dem entgegenstehende Text im Standard dürfte ein Relikt von c++98 sein: dort war noch nicht festgelegt, dass die Elemente von vector ein Array bilden. Damit bleibt hier nur noch deque übrig: bei diesem Container ist diese Festlegung tatsächlich sinnvoll, es gibt mehre Möglichkeiten - mit unterschiedlichen Stabilitätsgarantien - um diesen Container zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391212</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Oct 2007 13:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Wed, 24 Oct 2007 16:01:22 GMT]]></title><description><![CDATA[<p>Also hab auch noch mal genauer nachgeschaut, naja fachbuecher sind manchmal seltsam literarische Werke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Im allgemeinen Teil ueber iteratoren und container steht, dass bei einfuege und loeschoperationen die Zeiger / iteratoren etc die noch auf dem container sind, ungueltig werden <strong>können</strong></p>
<p>bei der genauren beschreibung der einzelnen container steht dann:</p>
<p>liste: besonderheit beim insert, push_irgendwas etc bleiben alle iteratoren gueltig und bleiben auch auf den gleichen elementen.<br />
beim erase() werden nur die Zeiger / iteratoren ungueltig, die auf das geloeschte Element gezeigt haben.</p>
<p>assoziative container: besonderheit beim insert, push_irgendwas etc bleiben alle iteratoren gueltig und bleiben auch auf den gleichen elementen.<br />
beim erase() werden nur die Zeiger / iteratoren ungueltig, die auf das geloeschte Element gezeigt haben.</p>
<p>Also der einzige der seine Iteratoren versaubeutelt ist der vector <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Die schreibweisse (3.Auflage) laesst aber schon den verdacht zu, dass da nachtraeglich kleinigkeiten veraendert wurden ... naja die STL ist besitmmt auch irgendwie gewachsen.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391349</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 24 Oct 2007 16:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Thu, 25 Oct 2007 05:46:48 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Also der einzige der seine Iteratoren versaubeutelt ist der vector <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
</blockquote>
<p>Nicht ganz - die deque geht auch etwas rabiater mit ihren Iteratoren um.</p>
<p>vector: Einfüge-Operationen können ALLE Iteratoren vernichten (wenn der vector dabei seine Kapazität überschreitet - im Regelfall werden nur die Iteratoren hinter das Ziel ungültig), Lösch-Operationen nur Iteratoren auf oder hinter das Ziel.<br />
deque: Einfüge- und Lösch-Operationen können alle Iteratoren ungültig machen (abgesehen von push_back(), push_front(), pop_back(), pop_front() - die sind &quot;sicher&quot;) - idR betreffen sie nur den Bereich zwischen dem Ziel und dem näherliegenden Ende der deque.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391591</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 25 Oct 2007 05:46:48 GMT</pubDate></item><item><title><![CDATA[Reply to Einträge aus STL Container löschen on Thu, 25 Oct 2007 10:05:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Lösch-Operationen nur Iteratoren auf oder hinter das Ziel.</p>
</blockquote>
<p>Beim vector referenziert der iterator doch die position, also den Index ?</p>
<p>wenn ich da das 1. element loesche, rutscht doch alles andere nach ? Damit sind die iteratoren ja vielleicht noch gueltig, aber zeigen nimmer auf die urspruenglichen elemente ?</p>
<p>und im schlimmsten fall ist es doch der STL Impl ned verboten, bei nem loeschen auf dem 1. element den kompletten vector neu zu bauen ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391713</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 25 Oct 2007 10:05:39 GMT</pubDate></item></channel></rss>