<?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[Assertion bei vector.erase()]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe diesen Code:</p>
<pre><code class="language-cpp">auto it    = mValues.begin();
auto itEnd = mValues.end();
while(it != itEnd) {
   if((*it).expired()) 
      it = mValues.erase(it);
   else
      ++it;
}
</code></pre>
<p>Leider kriege ich immer in der while Zeile eine Debug Assertion:</p>
<blockquote>
<p>vector iterators incompatible</p>
</blockquote>
<p>Wo is da das Problem? Und wie fixe ich das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290936/assertion-bei-vector-erase</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 04:43:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290936.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Aug 2011 11:19:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:19:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe diesen Code:</p>
<pre><code class="language-cpp">auto it    = mValues.begin();
auto itEnd = mValues.end();
while(it != itEnd) {
   if((*it).expired()) 
      it = mValues.erase(it);
   else
      ++it;
}
</code></pre>
<p>Leider kriege ich immer in der while Zeile eine Debug Assertion:</p>
<blockquote>
<p>vector iterators incompatible</p>
</blockquote>
<p>Wo is da das Problem? Und wie fixe ich das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102912</guid><dc:creator><![CDATA[Vectoror]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:40:29 GMT]]></title><description><![CDATA[<p>Mach es so:</p>
<pre><code class="language-cpp">mValues.erase(std::remove_if(mValues.begin(), mValues.end(), [&amp;](typename mValues::value_type const&amp; cur)
{
  return cur.expired();
}, mValues.end());
</code></pre>
<p>Google nach dem remove erase Idiom. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2102919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102919</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:44:13 GMT]]></title><description><![CDATA[<p>Ich weiß jetzt noch immer nicht, was das Problem ist.</p>
<p>Und den Code von dir will ich nicht benutzen, weil ich den ziemlich unleserlich (alias hässlich) finde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102921</guid><dc:creator><![CDATA[Vectoror]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:44:13 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:50:15 GMT]]></title><description><![CDATA[<p>Ethons Code ist sogar ziemlich elegant. Durch das remove-erase Idiom auch O(n)<br />
Die formatierung ist eigentlich okay. Wenn du schon viel mit der STL gearbeitet hast, sollte das kein Problem für dich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102923</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:52:54 GMT]]></title><description><![CDATA[<p>und es läuft nur unter C++0x. aber du benutzt ja schon auto. Und ich fidns auch hässlich.</p>
<p>Mach das:</p>
<pre><code class="language-cpp">auto it    = mValues.begin();
while(it != mValues.end()) {
   if((*it).expired())
      it = mValues.erase(it);
   else
      ++it;
}
</code></pre>
<p>itEnd verändert sich durch den Aufruf von Erase.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102924</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 11:59:50 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>und es läuft nur unter C++0x. aber du benutzt ja schon auto. Und ich fidns auch hässlich.</p>
<p>Mach das:</p>
<pre><code class="language-cpp">auto it    = mValues.begin();
while(it != mValues.end()) {
   if((*it).expired())
      it = mValues.erase(it);
   else
      ++it;
}
</code></pre>
<p>itEnd verändert sich durch den Aufruf von Erase.</p>
</blockquote>
<p>Funktioniert und ist übersichtlich. 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="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102928</guid><dc:creator><![CDATA[Vectoror]]></dc:creator><pubDate>Sun, 07 Aug 2011 11:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 12:16:20 GMT]]></title><description><![CDATA[<p>Vectoror schrieb:</p>
<blockquote>
<p>Und den Code von dir will ich nicht benutzen, weil ich den ziemlich unleserlich (alias hässlich) finde.</p>
</blockquote>
<p>Mein Problem war dass ich nicht weiß was in deinem Container steckt, denn du hast es uns nicht mitgeteilt.<br />
Deswegen habe ich dir einen Code geliefert, der auf jeden Fall funktioniert.</p>
<p>So unleserlich finde ich den Code nicht, aber du könntest ihn zb so umformatieren:</p>
<pre><code class="language-cpp">auto Compare = [&amp;](DEINTYP const&amp; cur) { return cur.expired(); }
auto begin = std::remove_if(mValues.begin(), mValues.end(), Compare);
mValues.erase(begin, mValues.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2102929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102929</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 07 Aug 2011 12:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 12:52:25 GMT]]></title><description><![CDATA[<p>Vectoror schrieb:</p>
<blockquote>
<p>Funktioniert und ist übersichtlich</p>
</blockquote>
<p>und elend langsam. O(n²) ist hier wirklich unnötig.</p>
<p>Nimm <code>std::remove_if()</code> , dafür ist es da. Statt eines Lambda-Ausdrucks kannst du <code>expired()</code> mit <code>std::mem_fn()</code> binden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102952</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Aug 2011 12:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 12:57:17 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Vectoror schrieb:</p>
<blockquote>
<p>Funktioniert und ist übersichtlich</p>
</blockquote>
<p>und elend langsam. O(n²) ist hier wirklich unnötig.</p>
<p>Nimm <code>std::remove_if()</code> , dafür ist es da. Statt eines Lambda-Ausdrucks kannst du <code>expired()</code> mit <code>std::mem_fn()</code> binden.</p>
</blockquote>
<p>Abgesehen davon, dass hier Geschwindigkeit keine Rolle spielt: Wieso n^2? Das sollte doch O(n) sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102954</guid><dc:creator><![CDATA[Vectoror]]></dc:creator><pubDate>Sun, 07 Aug 2011 12:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 13:01:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a> und Ethon,<br />
Das bringt nicht viel, was ihr da sagt. Ich glaube kaum, dass er verstehen wird, wieso hier O(n<sup>2</sup>) sein soll.</p>
<p>@Vectoror,<br />
Du solltest dir mal den Algorithmus von<a href="http://www.cplusplus.com/reference/algorithm/remove_if/" rel="nofollow"> <code>std::remove_if</code> </a>anschauen. Der Algorithmus kopiert jeweils nur das Element nach vorne, welches gültig bleiben wird und gibt dann einen Iterator auf das Element hinter dem letzten gültigen zurück. Wodurch man einfach den Rest dahinter löschen kann.<br />
Der Nachteil von <code>erase</code> ist, dass immer alle Objekte hinter der Position wo du löschst, nach vorne kopiert werden, auch diejenigen, welche du eigentlich löschen möchtest. Mit deinem Algorithmus kopierst du somit Objekte, welche du verwerfen möchtest. Diese unnötigen Kopien entstehen beim Erase-Remove Idiom nicht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102955</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 07 Aug 2011 13:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Assertion bei vector.erase() on Sun, 07 Aug 2011 13:03:44 GMT]]></title><description><![CDATA[<p>Vectoror schrieb:</p>
<blockquote>
<p>Abgesehen davon, dass hier Geschwindigkeit keine Rolle spielt</p>
</blockquote>
<p>Trotzdem darf man eine Lösung bevorzugen, die 1. mit weniger Code auskommt, 2. ohne irgendwelche Kosten schneller ist und 3. Standardmittel verwendet, statt sie schlecht nachzubauen.</p>
<p>Vectoror schrieb:</p>
<blockquote>
<p>Wieso n^2? Das sollte doch O(n) sein.</p>
</blockquote>
<p><code>std::vector::erase()</code> hat O(n), weil es nachfolgende Elemente verschieben muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102956</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Aug 2011 13:03:44 GMT</pubDate></item></channel></rss>