<?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[Beliebige Vectorelemente löschen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich suche eine effizient Möglichkeit folgendes Szenario umzusetzen:</p>
<p>Sei vec ein beliebiger Vector.</p>
<pre><code>foreach v Element vec {
	do something with v;
	del(vec);
}

del(vector&lt;T&gt; &amp;vec) {
	löschen von beliebig vielen Elementen.
	Es könnten alle oder kein Element gelöscht werden.
}
</code></pre>
<p>Ich hab schon vesucht den Iterator von vec der del-Metzhode mitzugeben, um ihn beim Löschen zu aktuallisieren. Ohne Erfolg.</p>
<p>In meiner jetzigen Implementierung lösche ich nicht, sonder merke mir die Elemente in einem Hilfsvektor und mache ein continue in der for-Schleife. Das dauert aber alles zu lange, da keine vec keine trivialen Datenstruktruren hält und alleine die Checks sehr lange dauern.</p>
<p>Ich brauche also eine funktionierende foreach-Schleife, auch wenn innerhalb einer Iteration beliebige Elemente gelöscht werden können.</p>
<p>Vielen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/223299/beliebige-vectorelemente-löschen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 22:08:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/223299.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Sep 2008 12:49:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 12:49:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich suche eine effizient Möglichkeit folgendes Szenario umzusetzen:</p>
<p>Sei vec ein beliebiger Vector.</p>
<pre><code>foreach v Element vec {
	do something with v;
	del(vec);
}

del(vector&lt;T&gt; &amp;vec) {
	löschen von beliebig vielen Elementen.
	Es könnten alle oder kein Element gelöscht werden.
}
</code></pre>
<p>Ich hab schon vesucht den Iterator von vec der del-Metzhode mitzugeben, um ihn beim Löschen zu aktuallisieren. Ohne Erfolg.</p>
<p>In meiner jetzigen Implementierung lösche ich nicht, sonder merke mir die Elemente in einem Hilfsvektor und mache ein continue in der for-Schleife. Das dauert aber alles zu lange, da keine vec keine trivialen Datenstruktruren hält und alleine die Checks sehr lange dauern.</p>
<p>Ich brauche also eine funktionierende foreach-Schleife, auch wenn innerhalb einer Iteration beliebige Elemente gelöscht werden können.</p>
<p>Vielen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587307</guid><dc:creator><![CDATA[HugoEgon]]></dc:creator><pubDate>Wed, 24 Sep 2008 12:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 12:55:31 GMT]]></title><description><![CDATA[<p>Iteratoren auf den vector können ungültig werden, sobald Du den vector veränderst. Welches Element, ist hierbei egal.</p>
<p>Wenn Du den Iterator mitgibst, um ihn zu aktualisieren (ich nehme an, durch den Rückgabewert von vector::erase), hast Du da eine Referenz übergeben?</p>
<p>Am gängigsten ist die Methode, die zu löschenden Elemente nach hinten zu sortieren, und dann den Range-Erase aufzurufen:</p>
<pre><code class="language-cpp">vec.erase( std::remove_if( vec.begin(), vec.end(), BEDINGUNG ), vec.end() );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1587316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587316</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 24 Sep 2008 12:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 12:57:15 GMT]]></title><description><![CDATA[<p>Sorry, ich verstehe nicht ganz, was du meinst. Soll <code>del()</code> willkürlich viele Elemente löschen? Was planst du genau?</p>
<p>Falls du einfach durchiterieren willst und bei gewissen Bedingungen das aktuelle Element entfernen willst, kannst du folgendes tun:</p>
<pre><code class="language-cpp">std::vector&lt;Type&gt; Vec;
// Vec füllen

for (std::vector&lt;Type&gt;::iterator i = Vec.begin; i != Vec.end; ++i)
{
   if (Condition)
      i = Vec.erase(i); // Der Iterator geht weiter auf das nächste gültige Element
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1587317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587317</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Sep 2008 12:57:15 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 12:58:55 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::vector&lt;Type&gt; Vec;
// Vec füllen

for (std::vector&lt;Type&gt;::iterator i = Vec.begin; i != Vec.end; ++i)
{
   if (Condition)
      i = Vec.erase(i); // Der Iterator geht weiter auf das nächste gültige Element
}
</code></pre>
</blockquote>
<pre><code class="language-cpp">std::vector&lt;Type&gt; Vec;
// Vec füllen

for (std::vector&lt;Type&gt;::iterator i = Vec.begin; i != Vec.end; )
{
   if (Condition)
      i = Vec.erase(i); // Der Iterator geht weiter auf das nächste gültige Element
   else ++i;
}
</code></pre>
<p><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/1587320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587320</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 24 Sep 2008 12:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 13:13:01 GMT]]></title><description><![CDATA[<p>Hm, meine Version erfüllt aber den Zweck...?<br />
Zumindest abgesehen davon, dass bei <code>begin()</code> und <code>end()</code> die Klammern fehlen <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/1587326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587326</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Sep 2008 13:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 13:14:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Hm, meine Version erfüllt aber den Zweck...?</p>
</blockquote>
<p>Nicht ganz: Wenn ein Element gelöscht wird, wird der Iterator auf das dem gelöschten folgende Element gesetzt. Das ++i der for-Schleife setzt ihn dann nochmal eins weiter, womit Du ein Element &quot;übersiehst&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587333</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 24 Sep 2008 13:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 13:18:33 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Nicht ganz: Wenn ein Element gelöscht wird, wird der Iterator auf das dem gelöschten folgende Element gesetzt. Das ++i der for-Schleife setzt ihn dann nochmal eins weiter, womit Du ein Element &quot;übersiehst&quot;.</p>
</blockquote>
<p>Danke, habs jetzt auch gerade rausgefunden <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>Zuerst hab ich mir es überlegt, und da bin ich eigentlich auf KasFs Lösung gekommen. Dann wollte ich es natürlich &quot;zur Sicherheit&quot; an einem Code-Beispiel testen, und dummerweise hatte ich per Zufall bei meiner Version ein Beispiel genommen, das gerade funktionierte (Deshalb auch die Edits, zuerst hatte ich KasF noch zugestimmt)...</p>
<p>Vielleicht sollte ich dem Verstand doch ein bisschen mehr vertrauen als dem Compiler <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/1587337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587337</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Sep 2008 13:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 14:01:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Sorry, ich verstehe nicht ganz, was du meinst. Soll <code>del()</code> willkürlich viele Elemente löschen? Was planst du genau?</p>
</blockquote>
<p>Leider ja.<br />
Es handelst sich um ein kombinatorisches Problem.<br />
Mein Pseudo-Code:<br />
<a href="http://img46.imageshack.us/my.php?image=snap1pu4.png" rel="nofollow">[img=http://img46.imageshack.us/img46/399/snap1pu4.th.png]</a></p>
<p>Daher bringt eine Sortierung vor &quot;foreach&quot; nichts.</p>
<p>Ich hab also den originären Vector und einen Vector indem die zu löschenden Elemente stecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587371</guid><dc:creator><![CDATA[HugoEgon]]></dc:creator><pubDate>Wed, 24 Sep 2008 14:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 14:22:43 GMT]]></title><description><![CDATA[<p>Mein Versuch mit Iterator sah ungefähr so aus:</p>
<pre><code class="language-cpp">void del(vector&lt;int&gt; &amp;vec, vector&lt;int&gt;::iterator &amp;it) {
  if(vec.size() == 6) {

	  it=vec.erase(vec.begin());
	  it=vec.erase(vec.begin());
	  it=vec.erase(vec.begin());
	  it=vec.erase(vec.begin());
	  it=vec.erase(vec.begin());
	  it=vec.erase(vec.begin());
  }

}

int main() {
	vector&lt;int&gt; vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);
	vec.push_back(6);

	vector&lt;int&gt;::iterator iter;// = vec.begin();

	for(iter = vec.begin(); iter != vec.end(); iter++) {

		cout &lt;&lt; *iter &lt;&lt; endl;
		del(vec, iter);
	}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1587383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587383</guid><dc:creator><![CDATA[HugoEgon]]></dc:creator><pubDate>Wed, 24 Sep 2008 14:22:43 GMT</pubDate></item><item><title><![CDATA[Reply to Beliebige Vectorelemente löschen on Wed, 24 Sep 2008 14:27:50 GMT]]></title><description><![CDATA[<p>Upps.<br />
So gehts schon besser:</p>
<pre><code class="language-cpp">int main() {
	vector&lt;int&gt; vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);
	vec.push_back(6);

	vector&lt;int&gt;::iterator iter;// = vec.begin();

	for(iter = vec.begin(); iter != vec.end(); iter++) {

		cout &lt;&lt; *iter &lt;&lt; endl;
		del(vec, iter);
		if(iter == vec.end()){
			break;
		}
	}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1587384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587384</guid><dc:creator><![CDATA[HugoEgon]]></dc:creator><pubDate>Wed, 24 Sep 2008 14:27:50 GMT</pubDate></item></channel></rss>