<?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[Probleme mit löschen bestimmter std::list Elemente]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p><strong>Ausgangssituation:</strong><br />
ich habe eine std::list meiner eigenen Klasse<br />
ich will einen bestimmtes Element aus der Liste entfernen<br />
dazu bekomme ich einen integerwert -&gt; die Stelle soll gelöscht werden<br />
-&gt; also nicht von Anfang bis Ende löschen, sondern nur den einen Wert</p>
<p><strong>Versuche:</strong><br />
ich habe einen Iterator dazu erstellt<br />
bsp.:</p>
<pre><code class="language-cpp">int pos;
std::list &lt;Klasse&gt;::iterator KlassenIterator = Klasse.begin();
KlassenIterator += pos;  //ich meine so in der Art müsste es Funktionieren
</code></pre>
<p><strong>Problem:</strong><br />
die Zuweisungen für den Iterator, dass er genau auf das eine Element zeigt,<br />
dass ich dann löschen kann, bekomme ich nicht hin</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239196/probleme-mit-löschen-bestimmter-std-list-elemente</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 10:30:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239196.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Apr 2009 14:48:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Mon, 20 Apr 2009 14:48:26 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p><strong>Ausgangssituation:</strong><br />
ich habe eine std::list meiner eigenen Klasse<br />
ich will einen bestimmtes Element aus der Liste entfernen<br />
dazu bekomme ich einen integerwert -&gt; die Stelle soll gelöscht werden<br />
-&gt; also nicht von Anfang bis Ende löschen, sondern nur den einen Wert</p>
<p><strong>Versuche:</strong><br />
ich habe einen Iterator dazu erstellt<br />
bsp.:</p>
<pre><code class="language-cpp">int pos;
std::list &lt;Klasse&gt;::iterator KlassenIterator = Klasse.begin();
KlassenIterator += pos;  //ich meine so in der Art müsste es Funktionieren
</code></pre>
<p><strong>Problem:</strong><br />
die Zuweisungen für den Iterator, dass er genau auf das eine Element zeigt,<br />
dass ich dann löschen kann, bekomme ich nicht hin</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698705</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Mon, 20 Apr 2009 14:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Mon, 20 Apr 2009 15:00:48 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/std/iterator/advance/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/advance/</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698718</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 20 Apr 2009 15:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Mon, 20 Apr 2009 15:03:18 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p><strong>Versuche:</strong><br />
ich habe einen Iterator dazu erstellt<br />
bsp.:</p>
<pre><code class="language-cpp">int pos;
std::list &lt;Klasse&gt;::iterator KlassenIterator = Klasse.begin();
KlassenIterator += pos;  //ich meine so in der Art müsste es Funktionieren
</code></pre>
</blockquote>
<p>Das Problem ist, dass std::list&lt;&gt;::iteratoren keine RadomAccess-Iteratoren sind und deshalb das += nicht unterstützen. Lies dazu im Buch deine Wahl das entsprechende Kapitel, Infos gibts auch unter <a href="http://www.cplusplus.com/reference/std/iterator/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/</a><br />
Was du evtl. suchst heißt <a href="http://www.cplusplus.com/reference/std/iterator/advance/" rel="nofollow">std::advance</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698720</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Apr 2009 15:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Mon, 20 Apr 2009 15:03:55 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Hilfe.</p>
<p>Ich hatte auch schon gesucht, aber immer nur sowas mit ner Schleife gefunden, die dann von Anfang bis Ende durchgeht ...</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698721</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Mon, 20 Apr 2009 15:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Mon, 20 Apr 2009 22:26:19 GMT]]></title><description><![CDATA[<p><code>std::advance()</code> benutzt intern auch eine Schleife. Du solltest dir vor Augen halten, dass sich der Rechenaufwand proportional zum Offset verhält (O(n)). Wenn du also 243055 als Argument übergibst, muss der Iterator 243055 Mal inkrementiert werden. Im Gegensatz zu <code>operator+=</code> bei Random-Access-Iteratoren, wo das in konstanter Zeit läuft.</p>
<p>Von daher solltest du dir auch überlegen, wenn du oft mittels Index auf eine Liste zugreifen willst, eher einen anderen Containertypen, zum Beispiel Vector oder Deque zu nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698903</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 20 Apr 2009 22:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 06:14:45 GMT]]></title><description><![CDATA[<p>Danke für die Antworten,</p>
<p>der Grund warum ich std::list verwende ist, weil ich eine Liste brauche, in der ich auch Elemente aus der Mitte löschen kann und dass dann die Liste verkleinert wird.</p>
<p>Eigentlich könnte ich es auch mit std::vector machen und dann die Elemente verschieben, weil es ist mir egal, in welcher Reihenfolge die Elemente vorkommen.</p>
<p>Oder habt ihr einen anderen Lösungsvorschlag?</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1699984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1699984</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 23 Apr 2009 06:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 07:02:03 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/stl/vector/erase/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/erase/</a></p>
<p>std::vector verschiebt seine elemente automatisch sobald du in der Mitte rauslöschst.</p>
<p>C++ Referenz schrieb:</p>
<blockquote>
<p>Because vectors keep an array format, erasing on positions other than the vector end also moves all the elements after the segment erased to their new positions, which may not be a method as efficient as erasing in other kinds of sequence containers (deque, list).</p>
<p>This invalidates all iterator and references to elements after position or first.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1699998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1699998</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 23 Apr 2009 07:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 07:21:48 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p>Eigentlich könnte ich es auch mit std::vector machen und dann die Elemente verschieben, weil es ist mir egal, in welcher Reihenfolge die Elemente vorkommen.</p>
</blockquote>
<p>Wenn das wirklich egal ist es nicht weiter schwer, Elemente aus einem vector in konstanter Zeit zu löschen:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;

template &lt;class T&gt;
typename std::vector&lt;T&gt;::iterator unrodered_erase(std::vector&lt;T&gt;&amp; vec, typename std::vector&lt;T&gt;::iterator pos)
{
  std::vector&lt;T&gt;::iterator back = end()-1;
  if(pos == back)
  {
    vec.pop_back();
    return vec.end();
  }
  std::iter_swap(pos, back);
  vec.pop_back();
  return ++pos;
}

template &lt;class T&gt;
typename std::vector&lt;T&gt;::iterator unrodered_erase(std::vector&lt;T&gt;&amp; vec, 
    typename std::vector&lt;T&gt;::iterator first, typename std::vector&lt;T&gt;::iterator last)
{
  while (first != last &amp;&amp; last != vec.end())
    first = unordered_erase(vec, first);
  if (first != last)
  {
    vec.erase(first, last);
    return vec.end();
  }
  return last;
}
</code></pre>
<p><strong>(ungetestet)</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700002</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Apr 2009 07:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 08:06:14 GMT]]></title><description><![CDATA[<p>Danke für die weiteren Antworten,</p>
<p>ich habe nicht gewusst (und auch garnicht darüber nachgedacht), dass die Elemente bei std::vector dann einfach verschoben werden.</p>
<p>Was währe eigentlich schneller, den Iterator hochzählen, oder die Vektor-Elemente verschieben?</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700026</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 23 Apr 2009 08:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 08:54:13 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p>Was währe eigentlich schneller, den Iterator hochzählen, oder die Vektor-Elemente verschieben?</p>
</blockquote>
<p>Ich weiß nicht, ob ich die Frage richtig verstehe, aber einen Iterator hochzuzählen ist selbstverständlich schneller als N Elemente um eine Position nach vorne zu verschieben. Mit Iteratorhochzählen ists aber nicht getan, da dann ein Loch im vector entstehen würde. Bei der von mir geposteten Lösung wird das zu löschende Element mit dem letzten vertauscht, das geht in konstanter Zeit, danach wird das dann letzte Element gelöscht - auch konstante Zeit. Allerdings weiß ich nicht ob das so sinnvoll für deine Anwendung ist. Du hast zwar gesagt dass die Ordnung deiner Elemente egal ist, andererseits willst du indizierten Zugriff. Das beißt sich, denn du weißt ja dann nicht unbedingt was sich am gegebenen Index befindet. Wenn du vorher immer suchen musst, um den Index herauszufinden ist vector wiederum auch nicht gut geeignet, da die Suche dort O(n) dauert. Wenn dein Suchkritetrium immer nach den selben Attributen geht wäre evtl. set noch eine Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700040</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Apr 2009 08:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 10:49:54 GMT]]></title><description><![CDATA[<p>Hallo pumuckl,</p>
<p>danke für die erneute Antwort,<br />
in meinem Programm wird folgendes gemacht:</p>
<p>Schleife, die alle Elemente einer Liste (std::vector oder halt std::list) durchgeht und Funktionen mit ihnen aufruft ...<br />
Wenn die Funktion dann halt einen bestimmten Wert zurückgibt, dann soll dieses Element aus der Liste entfernt werden (was mir grad auffält: evtl. gibts dann Probleme beim zählen, aber darum kümmere ich mich später)</p>
<p>Also ist es eigentlich egal, in welcher Reihenfolge die Elemente stehen.</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1700093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700093</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 23 Apr 2009 10:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 11:12:31 GMT]]></title><description><![CDATA[<p>Sowas macht man eigentlich mit erase() und remove_if():</p>
<p>Instruktives Beispiel (ungetestet):</p>
<pre><code>struct odd : public std::unary_function&lt;int, bool&gt; // für not1(),...
{
    bool operator() (int i) {return i % 2 != 0;}
}

int main()
{
  ...
  vector&lt;int&gt; vi;
  ...
  // alle ungeraden entfernen
  vi.erase(remove_if(vi.begin(), vi.end(), odd()), vi.end()); 
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1700106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700106</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Thu, 23 Apr 2009 11:12:31 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Thu, 23 Apr 2009 12:18:47 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p>Schleife, die alle Elemente einer Liste (std::vector oder halt std::list) durchgeht und Funktionen mit ihnen aufruft ...<br />
Wenn die Funktion dann halt einen bestimmten Wert zurückgibt, dann soll dieses Element aus der Liste entfernt werden (was mir grad auffält: evtl. gibts dann Probleme beim zählen, aber darum kümmere ich mich später)</p>
</blockquote>
<p>Dafür brauchst du aber dein += das du am Anfng erwähnt hast überhaupt nicht. Du kannst mit einem Iterator durchgehen und die Elemente bei Bedarf löschen. Die erase()-Methoden der list&lt;&gt;-Container liefern einen iterator der auf das jeweils nächste Element zeigt. Also sinngemäß:</p>
<pre><code class="language-cpp">std::list&lt;AskMe&gt;::iterator iter = askMeList.begin();
std::list&lt;AskMe&gt;::iterator enditer = askMeList.end();
while (iter != enditer)
{
  if (iter-&gt;mustBeDeleted())
    iter = askMeList.erase(iter);
  else
    ++iter;
}
</code></pre>
<p>Du solltest dir allerdings auch mal std::erase_if anschauen.</p>
<pre><code class="language-cpp">void removeAllThatMustBeDeleted()
{
  struct MustBeDeleted 
  { 
    bool operator() (AskMe&amp; askme) {return askme.mustBeDeleted();} 
  };

  askMeList.erase(
    std::remove_if(askMeList.begin(), askMeList.end()), 
    askMeList.end()
  );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1700154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700154</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Apr 2009 12:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit löschen bestimmter std::list Elemente on Sat, 25 Apr 2009 00:06:54 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Du solltest dir allerdings auch mal std::erase_if anschauen.</p>
</blockquote>
<p>Jetzt hatte ich schon Angst, ich hätte eine wichtige Funktion der Standardbibliothek nicht gekannt. <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="😉"
    /><br />
Aber anfangs war ich auch ein wenig verwirrt. Remove, Erase, Delete... Man gewöhnt sich dran. Schlimmer finde ich die Inkonsistenzen bei Find, Search und deren STL-Algorithmen-Derivaten (sorry für OffTopic).</p>
<p><code>std::remove_if()</code> würde ich aber bei Listen nicht unbedingt verwenden. Mit Listen will man teilweise Kopien vermeiden, die aber durch Iterator-Algorithmen wie <code>remove_if()</code> wieder nötig werden. Natürlich ist das eher allgemein gesehen, aber oft sprechen die Gründe für eine Liste dagegen. Ich habe mir vor Kurzem zwei Templates geschrieben, da bei mir oft die Situation vorlag, dass Objekte in Listen aufgrund von gewissen Memberfunktionen entfernt werden sollten. Natürlich könnte man das ein wenig einengen, zum Beispiel auf <code>const</code> -Memberfunktionen mit Rückgabetyp <code>bool</code> und keinen Parametern. Oder ausweiten auf freie Funktionen und Funktionsobjekte. <code>boost::bind</code> hilft einem da sicher.</p>
<pre><code class="language-cpp">// vor allem std::deque und std::vector
template &lt;typename Container, typename MemberFn&gt;
void RemoveIf(Container&amp; Ctr, MemberFn Condition)
{
	Ctr.erase(std::remove_if(Ctr.begin(), Ctr.end(), boost::mem_fn(Condition)), Ctr.end());
}

// Überladung für std::list
template &lt;typename ElementType, typename MemberFn&gt;
void RemoveIf(std::list&lt;ElementType&gt;&amp; Ctr, MemberFn Condition)
{
	for (std::list&lt;ElementType&gt;::iterator i = Ctr.begin(); i != Ctr.end(); )
	{
		if ( ((*i).*Condition)() )	// Memberfunktionsaufruf für vom Iterator referenziertes Element
			i = Ctr.erase(i);
		else
			++i;
	}
}
</code></pre>
<p>Und diese funktionale Programmierung erlaubt eine sehr elegante Anwendung. Keine Iterationen mehr im Code, keine mühsamen Schleifen. <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>
<pre><code class="language-cpp">RemoveIf(Cars, &amp;Car::IsDemolished);
</code></pre>
<p>Ich hatte letztens auch einen Fall, an dem ich relativ lange debuggen musste. Es kam in meinem Projekt eine <code>std::list</code> vor. Ich hatte nicht eine Liste gewählt, weil ich die typische Eigenschaft des konstanten Einfügens/Löschens in der Mitte benötigte, sondern weil Zeiger auf die Listen gültig bleiben mussten. Es dauerte eine entsprechende Zeit, bis ich gemerkt hatte, dass <code>remove_if()</code> das Konzept über den Haufen warf. Seit da habe ich die Überladung. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1700986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1700986</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 25 Apr 2009 00:06:54 GMT</pubDate></item></channel></rss>