<?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[Liste durchgehen und Elemente löschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss zwei Vectoren durchgehen (VectorA und VectorB) und alle Elemente die von VectorA schon in VectorB vorkommen, löschen.<br />
Ich habe es so versucht:</p>
<pre><code class="language-cpp">vector&lt;CBitList&gt;::iterator iterA;
vector&lt;CBitList&gt;::iterator iterB;
for(iterA=VectorA.begin(); iterA&lt;VectorA.end(); ++iterA)
{
	for(iterB=VectorB.begin(); iterB&lt;VectorB.end(); ++iterB)
	{
		if(*iterA==*iterB)
		{
			moeglichkeiten.erase(iterB);
		}
	}
}
</code></pre>
<p>Jedes mal wenn aber ein Element gelöscht werden soll tritt ein Fehler auf.<br />
Was muss ich machen, dass der Fehler nicht mehr auftritt.<br />
Oder gibt es noch eine effizientere Lösung?<br />
Würde mich freuen wenn mir jemand helfen könnte.</p>
<p>Viele Grüße,<br />
Samuirai</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262064/liste-durchgehen-und-elemente-löschen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 22:46:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262064.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Feb 2010 16:03:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Sun, 28 Feb 2010 16:03:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss zwei Vectoren durchgehen (VectorA und VectorB) und alle Elemente die von VectorA schon in VectorB vorkommen, löschen.<br />
Ich habe es so versucht:</p>
<pre><code class="language-cpp">vector&lt;CBitList&gt;::iterator iterA;
vector&lt;CBitList&gt;::iterator iterB;
for(iterA=VectorA.begin(); iterA&lt;VectorA.end(); ++iterA)
{
	for(iterB=VectorB.begin(); iterB&lt;VectorB.end(); ++iterB)
	{
		if(*iterA==*iterB)
		{
			moeglichkeiten.erase(iterB);
		}
	}
}
</code></pre>
<p>Jedes mal wenn aber ein Element gelöscht werden soll tritt ein Fehler auf.<br />
Was muss ich machen, dass der Fehler nicht mehr auftritt.<br />
Oder gibt es noch eine effizientere Lösung?<br />
Würde mich freuen wenn mir jemand helfen könnte.</p>
<p>Viele Grüße,<br />
Samuirai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862356</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Sun, 28 Feb 2010 16:03:34 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Sun, 28 Feb 2010 16:18:36 GMT]]></title><description><![CDATA[<p>iterB ist ein Iterator auf ein Element aus VectorB. Damit kannst du natürlich kein Element aus (vector?) moeglichkeiten löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862359</guid><dc:creator><![CDATA[Chew-Z]]></dc:creator><pubDate>Sun, 28 Feb 2010 16:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Sun, 28 Feb 2010 18:28:18 GMT]]></title><description><![CDATA[<p>Was ist denn bei dir &quot;moeglichkeiten&quot;?<br />
Ich denke was du suchst ist sowas:</p>
<pre><code class="language-cpp">vector&lt;CBitList&gt;::iterator iterA;
vector&lt;CBitList&gt;::iterator iterB;
for(iterA=VectorA.begin(); iterA&lt;VectorA.end(); )
{
    CBitList current(*iterA);
    ++iterA;
    for(iterB=VectorB.begin(); iterB&lt;VectorB.end(); ++iterB)
    {
        if(current == *iterB)
        {
            VectorA.erase(current);
            break;
        }
    }
}
</code></pre>
<p>Das würde die doppelten Einträge in VectorA löschen. Der Trick ist, den Iterator zu erhöhen, bevor man das Element löscht, da der Iterator sonst nach dem Löschen auf das gelöschte Element zeigt, sodass dann der nächste Schritt schief geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862405</guid><dc:creator><![CDATA[crt32]]></dc:creator><pubDate>Sun, 28 Feb 2010 18:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Sun, 28 Feb 2010 18:38:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for(iterA = VectorA.begin(); iterA != VectorA.end(); ++iterA) {
  for(iterB = VectorB.begin(); iterB != VectorB.end();) {
    if(*iterA == *iterB) {
      iterB = VectorB.erase(iterB);
    }
    else {
       ++iterB;
    }
  }
}
</code></pre>
<p>Du solltest natürlich wissen, dass das löschen mitten in einem vector eine echt teure Sache ist! Vielleicht lohnt sich eine andere Datenstruktur oder ein besserer Algorithmus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862414</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 28 Feb 2010 18:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Sun, 28 Feb 2010 19:23:14 GMT]]></title><description><![CDATA[<p>Ups... moeglichkeiten = VectorA...<br />
Tut mir leid, hab ich vergessen zu ändern.<br />
Der Hauptteil meines Algorithmusses muss große Listen durchgehen und mit anderen Dingen vergleichen.<br />
Ich benutze ein vector&lt;myClass&gt; also sollte die Datenstruktur soetwas auch unterstützen.<br />
Und doppelte Einträge löschen ist eher weniger. Kommt aber in kürzeren Datenmengen häufig vor.<br />
Am Anfang muss ich auch viele Daten hinzufügen. Das benötigt auch schon eine Weile, aber wenn der Analyse Teil schneller läuft kann ich auch darauf verzichten.<br />
Für diesen Zweck, was würdet ihr mir empfehlen? Ich kenne mich damit nicht so aus.<br />
Ich kenn mich da nicht so genau aus.</p>
<p>Viele Grüße,<br />
Samuirai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862434</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Sun, 28 Feb 2010 19:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 08:27:19 GMT]]></title><description><![CDATA[<p>guck mal hier:<br />
<a href="http://www.cplusplus.com/reference/algorithm/remove_if/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/remove_if/</a><br />
<a href="http://www.cplusplus.com/reference/stl/vector/erase/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/erase/</a></p>
<pre><code class="language-cpp">vecA.erase(std::remove_if(vecA.begin(),vecA.end(),pred),vecA.end());
</code></pre>
<p>(wobei pred ein Funktor ist, welcher für die Elemente in A true liefert genau dann wenn die Elemente gelöscht werden sollen)</p>
<p>oder hier:<br />
<a href="http://www.cplusplus.com/reference/algorithm/sort/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/sort/</a><br />
<a href="http://www.cplusplus.com/reference/algorithm/set_difference/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/set_difference/</a><br />
<a href="http://www.cplusplus.com/reference/std/iterator/back_inserter/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/back_inserter/</a></p>
<p>Es lohnt sich allgemein, die &quot;Mengen&quot; zu sortieren. Wenn Du zB den 2. Vektor sortiert hast kann der Funktor für remove_if eine binäre Suche durchführen statt jedes Element von vecB anzufassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862543</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 01 Mar 2010 08:27:19 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 18:17:08 GMT]]></title><description><![CDATA[<p>Führt <em>remove_if</em> automatisch eine Binäre Suche durch, wenn der Vector sortiert ist?<br />
Ich versuche gerade remove_if zum laufen zu bringen, aber verstehe dieses pred noch nicht.<br />
Ich habe eine Methdoe IterB-&gt;CompareBit(IterA) (Ich kann sie aber beliebig überladen, ich weiß nur nicht wie ich Pred genau schreiben muss)<br />
Wie kann ich nun diese Methode anstatt Pred nutzen? Oder wie genau hat Pred auszusehen?</p>
<pre><code class="language-cpp">vecA.erase(std::remove_if(vecA.begin(),vecA.end(),pred),vecA.end());
</code></pre>
<p>Tut mir leid für diese elementaren Fragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Würde mich trotzdem sehr freuen, wenn mir jemand helfen könnte.</p>
<p>Viele Grüße,<br />
Samuirai</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862906</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Mon, 01 Mar 2010 18:17:08 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 18:46:13 GMT]]></title><description><![CDATA[<p>Samuirai schrieb:</p>
<blockquote>
<p>Führt <em>remove_if</em> automatisch eine Binäre Suche durch, wenn der Vector sortiert ist?</p>
</blockquote>
<p>remove_if kopiert einfach ein paar Elemente im Vektor um und liefert Dir einen Iterator, der hinter das letzte noch übrig gebliebene Element zeigt. Dahinter steht Datenmüll, welcher mit vector::erase beseitigt werden kann.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

struct IstUngerade {
  bool operator()(int x) const {
    unsigned y = static_cast&lt;unsigned&gt;(x);
    return (y &amp; 1);
  }
};

int main() {
  std::vector&lt;int&gt; foo;
  foo.push_back(1);
  foo.push_back(2);
  foo.push_back(3);
  foo.push_back(4);
  std::vector&lt;int&gt;::iterator xxx =
    std::remove_if(foo.begin(),foo.end(),IstUngerade());

  //
  //   +---+---+---+---+
  //   | 2 | 4 | 3 | 4 |
  //   +---+---+---+---+
  //   A       A       A
  //   |       |       |
  // begin    xxx     end

  foo.erase(xxx,foo.end());

  //
  //   +---+---+
  //   | 2 | 4 |
  //   +---+---+
  //   A       A
  //   |       | 
  // begin    end
}
</code></pre>
<p>Und das kann man auch gleich in eins machen -- also remove_if und erase schachteln. IstUngerade ist ein sogenannter &quot;Funktor&quot; -- ein Objekt, welches die Funktionsaufruf-Syntax unterstützt -- siehe operator(). Mit <code>IstUngerade()</code> wird ein anonymes Objekt der Klasse erzeugt, welches remove_if übergeben werden kann.</p>
<p>Die binäre Suche müsstest Du selbst in deinem Funktor erledigen. Dazu bräuchtest Du einen, der sich merken kann, in welchem vector gesucht werden muss. Das ist auch der Vorteil von Funktoren. Sie können sich Dinge merken, die remove_if überhaupt nicht interessiert. ZB so:</p>
<pre><code class="language-cpp">template&lt;typename Iterator&gt;
struct is_in_set {
   Iterator beg, end;

   is_in_set(Iterator b, Iterator e) : beg(b), end(e) {}

   template&lt;typename T&gt;
   bool operator()(T const&amp; value) {
      return std::binary_search(beg,end,value);
   }
};
</code></pre>
<p>Den könnte man das so benutzen:</p>
<pre><code class="language-cpp">void hau_wech_die_scheisse(vector&lt;int&gt; &amp; io, vector&lt;int&gt; const&amp; wech)
{
   is_in_set&lt;vector&lt;int&gt;::const_iterator&gt; pred ( wech.begin(), wech.end() );
   io.erase(
     std::remove_if(io.begin(), io.end(), pred),
     io.end()
   );
}
</code></pre>
<p>(alles ungetestet und eventuell fehlerhaft)</p>
<p>Wenn Du aber sowieso die Vektoren sortieren darfst, ist es wahrscheinlich am einfachsten, beide zu sortieren und dann einfach std::set_difference zu benutzen. Dafür sind die Algorithmen in <code>&lt;algorithm&gt;</code> ja da ... dass man sie benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862924</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 01 Mar 2010 18:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 19:45:39 GMT]]></title><description><![CDATA[<p>Was ist denn die schnellste Methode?<br />
Ich habe zwei Vectoren, einer mit über über 50 und einer mit über 1000 Elemente.<br />
Ist set_difference oder remove_if schneller?</p>
<p>Ich habe das hier versucht, aber wieso geht das nicht?</p>
<pre><code class="language-cpp">// set_difference example
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

int main () {
  vector&lt;int&gt; v;  

  vector&lt;int&gt; a; 
  a.push_back(5);
  a.push_back(10);
  a.push_back(15);
  a.push_back(20);
  a.push_back(25);

  vector&lt;int&gt; b; 
  b.push_back(50);
  b.push_back(40);
  b.push_back(30);
  b.push_back(20);
  b.push_back(10);

  sort (a.begin(), a.end()); 
  sort (b.begin(), b.end()); 

  set_difference (a.begin(), a.end(), b.begin(), b.end(), v.begin());

  for(int i=0; i&lt;v.size();++i)
	  cout &lt;&lt; v.at(i) &lt;&lt; &quot;,&quot;;
	cin.get();
	cin.get();
  return 0;
}
</code></pre>
<p>Es kommt kein Compiler Fehler, erst wenn das Programm läuft:<br />
Debug Assertion Failed! Expression: ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862955</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Mon, 01 Mar 2010 19:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 20:03:53 GMT]]></title><description><![CDATA[<p>Weil v zu klein ist.</p>
<p>Wenn Du aus <code>vector&lt;int&gt; v;</code> ein <code>vector&lt;int&gt; v(10);</code> machst, sollte es laufen. In Wirklichkeit natürlich checken, wie groß die anderen Vektoren sind, bevor Du sowas machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862963</guid><dc:creator><![CDATA[nman]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 20:16:13 GMT]]></title><description><![CDATA[<p>Oder du verwendest als Output-Iterator nicht</p>
<pre><code class="language-cpp">v.begin()
</code></pre>
<p>sondern</p>
<pre><code class="language-cpp">std::back_inserter(v)
</code></pre>
<p>Ebenfalls auf <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> nachzuschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862971</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:16:13 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 20:31:25 GMT]]></title><description><![CDATA[<p>Oh ich dachte das benötigt Vector nicht.<br />
Ich benutze statt <em>int</em> eine eigene Klasse <em>vector&lt;myClass&gt;</em> und nun kommt der Fehler:</p>
<blockquote>
<p>Fehler 1 error C2512: 'myClass::myClass': Kein geeigneter Standardkonstruktor verfügbar</p>
</blockquote>
<p>Ist denn set_difference schneller als das remove_if?</p>
<p>Viele Grüße</p>
<p>Edit:<br />
Oh, hab den Post über mir übersehen.<br />
Vielen vielen Dank für eure Mühe. Ich habe jetzt wieder einiges gelernt <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 noch eine letzte Frage.<br />
set_difference vs. remove_if bei vectoren mit ca. 1000-5000 Elementen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862979</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 20:40:44 GMT]]></title><description><![CDATA[<blockquote>
<p>aber noch eine letzte Frage.<br />
set_difference vs. remove_if bei vectoren mit ca. 1000-5000 Elementen</p>
</blockquote>
<p>Warum nicht einfach testen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862990</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 21:06:36 GMT]]></title><description><![CDATA[<p>Ich hab remove_if noch nicht zum laufen gebracht, und wollte dann einfach schnell nachfragen.</p>
<pre><code class="language-cpp">vector&lt;CBitList&gt; vecA;
vector&lt;CBitList&gt; vecB;
vector&lt;CBitList&gt;::iterator iterA;
vector&lt;CBitList&gt;::iterator iterB;

//[...]

for(iterB = vecB.begin(); iterB != vecB.end(); ++iterB) {
    vecA.erase(std::remove_if(vecA.begin(),vecA.end(),compareBit()),vecA.end());
}

//[...]

struct compareBit() {
  bool operator()(CBitList x) const {
    // Irgendwie x mit vecB, bzw iterB vergleichen
  }
};
</code></pre>
<p>Ich habe versucht compareBit(CBitList) zu machen, aber das scheint nicht zu funktionieren.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863004</guid><dc:creator><![CDATA[Samuirai]]></dc:creator><pubDate>Mon, 01 Mar 2010 21:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Liste durchgehen und Elemente löschen on Mon, 01 Mar 2010 22:46:29 GMT]]></title><description><![CDATA[<p>Samuirai schrieb:</p>
<blockquote>
<p>Ich hab remove_if noch nicht zum laufen gebracht</p>
</blockquote>
<p>Dann guck Dir nochmal genau meine Antwort von 19:46 Uhr durch. Ich hatte die Lösung mit remove_if skizziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863026</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 01 Mar 2010 22:46:29 GMT</pubDate></item></channel></rss>