<?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[Container durchsuchen und gleichzeitig löschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte die Elemente eines Containers durchsuchen und gleichzeitig auch bestimmte (bzw. im Beispiel unten alle) Elemente löschen.</p>
<p>Mit einer std::list (siehe //1) scheint mein Ansatz ja auch ganz gut zu funktionieren. Wenn ich den selben Code allerdings mit einer std::deque versuche, gibt es einen Coredump.</p>
<p>Ich dachte eigentlich immer dass die Container durch die Iteratoren gleich behandelt werden können und das Konstrukt</p>
<pre><code class="language-cpp">std::list&lt;int&gt;::iterator tmp_list_it = list_it++;
my_list.erase(tmp_list_it);
</code></pre>
<p>in einer Schleife zulässig ist. Anscheinend mag das die std::deque nicht so gerne.</p>
<p>Jetzt meine Frage:<br />
Ist mein Code a) für die List korrekt und für die Deque falsch (bitte Vorschlag, wie richtig und warum). b) komplett falsch/unzulässig und funktioniert für die List nur zufälligerweise. c) richtig und der Iterator für die Deque anscheinen falsch implementiert.</p>
<p>Danke schon mal für die Antworten.</p>
<p>Grüße,<br />
WissenMachtAh</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;deque&gt;

int main (int args, char **argv)
{
  // 1
  std::list&lt;int&gt; my_list;

  my_list.push_back(1);
  my_list.push_back(2);
  my_list.push_back(3);

  std::list&lt;int&gt;::iterator list_it = my_list.begin();
  while (list_it != my_list.end())
  {
    std::list&lt;int&gt;::iterator tmp_list_it = list_it++;
    my_list.erase(tmp_list_it);
    std::cout &lt;&lt; &quot;List size = &quot; &lt;&lt; my_list.size() &lt;&lt; std::endl;
  }

  // 2
  std::deque&lt;int&gt; my_deque;

  my_deque.push_back(1);
  my_deque.push_back(2);
  my_deque.push_back(3);

  std::deque&lt;int&gt;::iterator deque_it = my_deque.begin();
  while (deque_it != my_deque.end())
  {
    std::deque&lt;int&gt;::iterator tmp_deque_it = deque_it++;
    my_deque.erase(tmp_deque_it);
    std::cout &lt;&lt; &quot;deque size = &quot; &lt;&lt; my_deque.size() &lt;&lt; std::endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/208997/container-durchsuchen-und-gleichzeitig-löschen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 08:19:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208997.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Mar 2008 15:42:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 15:42:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte die Elemente eines Containers durchsuchen und gleichzeitig auch bestimmte (bzw. im Beispiel unten alle) Elemente löschen.</p>
<p>Mit einer std::list (siehe //1) scheint mein Ansatz ja auch ganz gut zu funktionieren. Wenn ich den selben Code allerdings mit einer std::deque versuche, gibt es einen Coredump.</p>
<p>Ich dachte eigentlich immer dass die Container durch die Iteratoren gleich behandelt werden können und das Konstrukt</p>
<pre><code class="language-cpp">std::list&lt;int&gt;::iterator tmp_list_it = list_it++;
my_list.erase(tmp_list_it);
</code></pre>
<p>in einer Schleife zulässig ist. Anscheinend mag das die std::deque nicht so gerne.</p>
<p>Jetzt meine Frage:<br />
Ist mein Code a) für die List korrekt und für die Deque falsch (bitte Vorschlag, wie richtig und warum). b) komplett falsch/unzulässig und funktioniert für die List nur zufälligerweise. c) richtig und der Iterator für die Deque anscheinen falsch implementiert.</p>
<p>Danke schon mal für die Antworten.</p>
<p>Grüße,<br />
WissenMachtAh</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;deque&gt;

int main (int args, char **argv)
{
  // 1
  std::list&lt;int&gt; my_list;

  my_list.push_back(1);
  my_list.push_back(2);
  my_list.push_back(3);

  std::list&lt;int&gt;::iterator list_it = my_list.begin();
  while (list_it != my_list.end())
  {
    std::list&lt;int&gt;::iterator tmp_list_it = list_it++;
    my_list.erase(tmp_list_it);
    std::cout &lt;&lt; &quot;List size = &quot; &lt;&lt; my_list.size() &lt;&lt; std::endl;
  }

  // 2
  std::deque&lt;int&gt; my_deque;

  my_deque.push_back(1);
  my_deque.push_back(2);
  my_deque.push_back(3);

  std::deque&lt;int&gt;::iterator deque_it = my_deque.begin();
  while (deque_it != my_deque.end())
  {
    std::deque&lt;int&gt;::iterator tmp_deque_it = deque_it++;
    my_deque.erase(tmp_deque_it);
    std::cout &lt;&lt; &quot;deque size = &quot; &lt;&lt; my_deque.size() &lt;&lt; std::endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1480140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480140</guid><dc:creator><![CDATA[WissenMachtAh]]></dc:creator><pubDate>Tue, 25 Mar 2008 15:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 15:48:22 GMT]]></title><description><![CDATA[<p>bei einer deque werden wahrscheinlich beim löschen eines elements alle iteratoren ungültig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480143</guid><dc:creator><![CDATA[invalid]]></dc:creator><pubDate>Tue, 25 Mar 2008 15:48:22 GMT</pubDate></item><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 15:52:38 GMT]]></title><description><![CDATA[<p>Richtig wäre:</p>
<pre><code class="language-cpp">my_deque.pop_front();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1480146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480146</guid><dc:creator><![CDATA[^^]]></dc:creator><pubDate>Tue, 25 Mar 2008 15:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 16:26:47 GMT]]></title><description><![CDATA[<p>^^ schrieb:</p>
<blockquote>
<p>Richtig wäre:</p>
<pre><code class="language-cpp">my_deque.pop_front();
</code></pre>
</blockquote>
<p>Leider nicht, da ich ja nicht unbedingt das erste Element löschen will. Wie oben beschrieben ist der Code nur ein Beispiel, es kann also durchaus sein, dass ich nur ein bestimmtes Element an irgendeiner Position des Container löschen möchte. Und ich bin mir darüber bewußt, dass die deque aus Performancegründen nicht unbedingt die erste Wahl dafür ist...</p>
<p>Gruß, WissenMachtAh.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480161</guid><dc:creator><![CDATA[WissenMachtAh]]></dc:creator><pubDate>Tue, 25 Mar 2008 16:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 16:52:37 GMT]]></title><description><![CDATA[<p>hm, remove_if?<br />
<a href="http://cppreference.com/cppalgorithm/remove_if.html" rel="nofollow">http://cppreference.com/cppalgorithm/remove_if.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480167</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Tue, 25 Mar 2008 16:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Container durchsuchen und gleichzeitig löschen on Tue, 25 Mar 2008 17:51:32 GMT]]></title><description><![CDATA[<p>tmp_list_it=my_list.erase(tmp_list_it);</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480205</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 25 Mar 2008 17:51:32 GMT</pubDate></item></channel></rss>