<?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[Mehrere Element in std::vector löschen]]></title><description><![CDATA[<p>Hallo,<br />
ich habe hier ein etwas schwieriges Problem:<br />
Ich möchte mehrere Elemente aus einem Vektor löschen. Allerdings scheint meine Idee irgendwie nicht zu funktionieren.</p>
<p>Meine Idee war:<br />
*Zuerst alle Indexe der Elemente, die gelöscht werden in einem std::set abspeicheren (-&gt;ship_indexes)<br />
*dann das erste Element löschen: Problem, die vorher abgespeicherten Indexe werden ungültig, da sich die Position der Element durch das Löschen verschiebt.<br />
Also aus einem Vektor mit<br />
vec[0]=0<br />
vec[1]=1<br />
vec[2]=2<br />
vec[3]=3<br />
wird nach dem löschen von vec[2]<br />
vec[0]=0<br />
vec[1]=1<br />
vec[2]=3</p>
<p>Also muss ich abspeichern, wie viele Elemente ich gespeichert habe, und die Anzahl der gelöschten Elemente von dem abgespeicherten Index in ship_indexes abziehen. Das funktioniert natürlich nur, wenn ich die Elemente von oben nach unten lösche (also zuerst Index 0 dann 3 dann 5).<br />
Da std::set eh seine Elemente standardmäßig so sortiert ist das kein Problem.</p>
<p>So, trotz allem scheint diese Idee nicht zu funktionieren.<br />
Ich bekomme einen Fehler, weil ich anscheinend ein Element 2x mit delete lösche.<br />
Ich weiß nicht mehr weiter, nach den Logs, die mein Programm ausgibt, scheint mein Algorithmus zu funktionieren, aber das Programm stürzt jedesmal beim Aufruf von delete ab.</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">while(index_iter!=ship_indexes.end())//clear all ships at the indexes in ShipVector
	{
		if(count_deletes&gt;0)
			_DPRINTL(&quot;count_deletes&gt;0&quot;);
		//save the size of the ship
		shipsize_buffer_vector.push_back(ShipVector.at(*index_iter-count_deletes)-&gt;GetSize());
		//clear ship from ShipVector
		_DPRINTL(&quot;delete ship [%p]: *index_iter: %d, count_deletes: %d&quot;,ShipVector.at(*index_iter-count_deletes),*index_iter,count_deletes);
		delete ShipVector.at((*index_iter-count_deletes)); //[crashes here] delete the Ship, because it was created with new
		_DPRINTL(&quot;deleted ship [%p]!&quot;,ShipVector.at(*index_iter-count_deletes));
		ShipVector.erase(ShipVector.begin() + (*index_iter-count_deletes)); //don't remove the brackets, or the iterator will jump for one moment over his bounds, that leads in VS to an assertion failed!

		//with the erase all vector elements from (*index_iter-count_deletes) on moved one left
		//so we will have to subtract one more than before, to erase the element meant by ship_indexes 
		count_deletes++; 

		_DPRINTL(&quot;DUMP: ShipVector after %d. delete&quot;,count_deletes);
		DumpShipVector();
		_DPRINTL(&quot;END DUMP: ShipVector after %d. delete&quot;,count_deletes);

		index_iter++;
	}
</code></pre>
<p>Das ganze Projekt findet ihr auf:<br />
<a href="http://mitglied.lycos.de/xcooperation23/simulator/fight_simulator.html" rel="nofollow">http://mitglied.lycos.de/xcooperation23/simulator/fight_simulator.html</a><br />
([offtopic]falls ihr euch wundert wofür das ist: <a href="http://openspacegame.sourceforge.net/board/index.php" rel="nofollow">http://openspacegame.sourceforge.net/board/index.php</a><br />
[/offtopic])</p>
<p>Hier ist noch ein &quot;kleiner&quot; Ausschnitt aus meinem Debug-Log:</p>
<pre><code>[debug 0]: DUMP: ship_indexes
[debug 0]: 2
[debug 0]: 5
[debug 0]: 9
[debug 0]: 12
[debug 0]: END DUMP: ship_indexes
[debug 0]: DUMP: ShipVector before
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356DD0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[3]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[4]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[5]: 003570D0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[6]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[7]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[8]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[9]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[10]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[11]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[12]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector before
[debug 0]: delete ship [00356DD0]: *index_iter: 2, count_deletes: 0
[debug 0]: deleted ship [00356DD0]!
[debug 0]: DUMP: ShipVector after 1. delete
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[3]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[4]: 003570D0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[5]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[6]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[7]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[8]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[9]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[10]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[11]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector after 1. delete
[debug 0]: count_deletes&gt;0
[debug 0]: delete ship [003570D0]: *index_iter: 5, count_deletes: 1
[debug 0]: deleted ship [003570D0]!
[debug 0]: DUMP: ShipVector after 2. delete
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[3]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[4]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[5]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[6]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[7]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[8]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[9]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[10]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector after 2. delete
[debug 0]: count_deletes&gt;0
[debug 0]: delete ship [00357660]: *index_iter: 9, count_deletes: 2
</code></pre>
<p>so und nach dem delete gibts nen Crash.<br />
Wobei ich nicht weiß wieso, nirgendwo im Log wurde ein Schiff mit der Adresse 00357660 gelöscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/178741/mehrere-element-in-std-vector-löschen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 01:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178741.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Apr 2007 10:13:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 10:13:15 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe hier ein etwas schwieriges Problem:<br />
Ich möchte mehrere Elemente aus einem Vektor löschen. Allerdings scheint meine Idee irgendwie nicht zu funktionieren.</p>
<p>Meine Idee war:<br />
*Zuerst alle Indexe der Elemente, die gelöscht werden in einem std::set abspeicheren (-&gt;ship_indexes)<br />
*dann das erste Element löschen: Problem, die vorher abgespeicherten Indexe werden ungültig, da sich die Position der Element durch das Löschen verschiebt.<br />
Also aus einem Vektor mit<br />
vec[0]=0<br />
vec[1]=1<br />
vec[2]=2<br />
vec[3]=3<br />
wird nach dem löschen von vec[2]<br />
vec[0]=0<br />
vec[1]=1<br />
vec[2]=3</p>
<p>Also muss ich abspeichern, wie viele Elemente ich gespeichert habe, und die Anzahl der gelöschten Elemente von dem abgespeicherten Index in ship_indexes abziehen. Das funktioniert natürlich nur, wenn ich die Elemente von oben nach unten lösche (also zuerst Index 0 dann 3 dann 5).<br />
Da std::set eh seine Elemente standardmäßig so sortiert ist das kein Problem.</p>
<p>So, trotz allem scheint diese Idee nicht zu funktionieren.<br />
Ich bekomme einen Fehler, weil ich anscheinend ein Element 2x mit delete lösche.<br />
Ich weiß nicht mehr weiter, nach den Logs, die mein Programm ausgibt, scheint mein Algorithmus zu funktionieren, aber das Programm stürzt jedesmal beim Aufruf von delete ab.</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">while(index_iter!=ship_indexes.end())//clear all ships at the indexes in ShipVector
	{
		if(count_deletes&gt;0)
			_DPRINTL(&quot;count_deletes&gt;0&quot;);
		//save the size of the ship
		shipsize_buffer_vector.push_back(ShipVector.at(*index_iter-count_deletes)-&gt;GetSize());
		//clear ship from ShipVector
		_DPRINTL(&quot;delete ship [%p]: *index_iter: %d, count_deletes: %d&quot;,ShipVector.at(*index_iter-count_deletes),*index_iter,count_deletes);
		delete ShipVector.at((*index_iter-count_deletes)); //[crashes here] delete the Ship, because it was created with new
		_DPRINTL(&quot;deleted ship [%p]!&quot;,ShipVector.at(*index_iter-count_deletes));
		ShipVector.erase(ShipVector.begin() + (*index_iter-count_deletes)); //don't remove the brackets, or the iterator will jump for one moment over his bounds, that leads in VS to an assertion failed!

		//with the erase all vector elements from (*index_iter-count_deletes) on moved one left
		//so we will have to subtract one more than before, to erase the element meant by ship_indexes 
		count_deletes++; 

		_DPRINTL(&quot;DUMP: ShipVector after %d. delete&quot;,count_deletes);
		DumpShipVector();
		_DPRINTL(&quot;END DUMP: ShipVector after %d. delete&quot;,count_deletes);

		index_iter++;
	}
</code></pre>
<p>Das ganze Projekt findet ihr auf:<br />
<a href="http://mitglied.lycos.de/xcooperation23/simulator/fight_simulator.html" rel="nofollow">http://mitglied.lycos.de/xcooperation23/simulator/fight_simulator.html</a><br />
([offtopic]falls ihr euch wundert wofür das ist: <a href="http://openspacegame.sourceforge.net/board/index.php" rel="nofollow">http://openspacegame.sourceforge.net/board/index.php</a><br />
[/offtopic])</p>
<p>Hier ist noch ein &quot;kleiner&quot; Ausschnitt aus meinem Debug-Log:</p>
<pre><code>[debug 0]: DUMP: ship_indexes
[debug 0]: 2
[debug 0]: 5
[debug 0]: 9
[debug 0]: 12
[debug 0]: END DUMP: ship_indexes
[debug 0]: DUMP: ShipVector before
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356DD0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[3]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[4]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[5]: 003570D0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[6]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[7]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[8]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[9]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[10]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[11]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[12]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector before
[debug 0]: delete ship [00356DD0]: *index_iter: 2, count_deletes: 0
[debug 0]: deleted ship [00356DD0]!
[debug 0]: DUMP: ShipVector after 1. delete
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[3]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[4]: 003570D0 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[5]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[6]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[7]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[8]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[9]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[10]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[11]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector after 1. delete
[debug 0]: count_deletes&gt;0
[debug 0]: delete ship [003570D0]: *index_iter: 5, count_deletes: 1
[debug 0]: deleted ship [003570D0]!
[debug 0]: DUMP: ShipVector after 2. delete
[debug 0]: ShipVector[0]: 003569D0 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[1]: 00356CD8 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[2]: 00356F78 -&gt; Delete: 0 Healthpoints: 4500
[debug 0]: ShipVector[3]: 00357028 -&gt; Delete: 0 Healthpoints: 1500
[debug 0]: ShipVector[4]: 00357178 -&gt; Delete: 0 Healthpoints: 500
[debug 0]: ShipVector[5]: 00357290 -&gt; Delete: 0 Healthpoints: 7000
[debug 0]: ShipVector[6]: 003573E0 -&gt; Delete: 0 Healthpoints: 8000
[debug 0]: ShipVector[7]: 00357660 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: ShipVector[8]: 00357708 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[9]: 00357858 -&gt; Delete: 0 Healthpoints: 5000
[debug 0]: ShipVector[10]: 00357900 -&gt; Delete: 0 Healthpoints: 0
[debug 0]: END DUMP: ShipVector after 2. delete
[debug 0]: count_deletes&gt;0
[debug 0]: delete ship [00357660]: *index_iter: 9, count_deletes: 2
</code></pre>
<p>so und nach dem delete gibts nen Crash.<br />
Wobei ich nicht weiß wieso, nirgendwo im Log wurde ein Schiff mit der Adresse 00357660 gelöscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265830</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sat, 14 Apr 2007 10:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 10:19:48 GMT]]></title><description><![CDATA[<p>Eine Frage: du speicherst die Indexe aller zu löschenden Schiffe, wieso deletest du sie nicht gleich beim Suchen danach?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265834</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sat, 14 Apr 2007 10:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 10:33:16 GMT]]></title><description><![CDATA[<p>Generell isses vielleicht laufzeitmäßig nicht so geschickt die Indices vorher irgendwo abzulegen. Dann lieber irgendwas mit std::remove konstruieren. Dein Problem kannste aber ganz einfach umgehen, indem Du die Elemente von hinten nach vorne löschst. Dadurch verschieben sich die vorderen Elemente nicht. <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/1265841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265841</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 14 Apr 2007 10:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 10:34:23 GMT]]></title><description><![CDATA[<p>Warum gehst du nicht einfach rückwärts durch dein set?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265844</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sat, 14 Apr 2007 10:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 12:14:47 GMT]]></title><description><![CDATA[<p>Damit Jesters Vorschlag nicht untergeht:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

struct MyPred
{
    bool operator() (const ShipVectorContent&amp; elem)
    {
        // wenn elem deleted werden soll -&gt; return true
        return false;
    }
};

vector&lt;ShipVectorContent&gt;::iterator new_end = std::remove(ShipVector.begin(), ShipVector.end(), MyPred());

ShipVector.erase(new_end, ShipVector.end());
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265894</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sat, 14 Apr 2007 12:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 12:19:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::erase( std::remove( ShipVectr.begin(), ShipVector.end(), MyPred() );
</code></pre>
<p>so! <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>Edit: Ups, zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265900</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 14 Apr 2007 12:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 13:48:07 GMT]]></title><description><![CDATA[<p>Dass ich die Indexe abspeichere hat schon einen Grund:</p>
<p>Das Problem ist folgendes:<br />
Das ganze ist ein Kampfsimulator, der einen Kampf zwischen zwei Raumschiffflotten berechnen soll.<br />
Wird ein Schiff zerstört habe ich es (wie ihr vorgeschlagen habt) in meiner ersten Version gleich gelöscht.<br />
Das Problem das ich dabei hatte war folgendes: Jedes Schiff hat eine bestimmte Wahrscheinlichkeit getroffen zu werden, abhängig von seiner Größe.<br />
Entferne ich das Schiff sofort, muss ich jedesmal wenn ein Schiff zerstört wird die Trefferwahrscheinlichkeit aller Schiffe neu berechnen.<br />
Meine Idee war also, die zerstörten Schiffe bis zum Ende einer Runde noch da zu lassen. (Dann können sie zwar immer noch getroffen werden, etwas unrealistisch, aber wenn ich genügend Geschwindigkeit dabei raushole geht das in Ordnung).<br />
Wird ein Schiff zerstört, speichere ich also seinen Index ab (dann weiß ich ja, welches Schiff kaputt ist, und muss nicht wieder den ganzen Array nach kaputten Schiffen durchsuchen).</p>
<p>Und am Ende der Runde lösche ich die kaputten Schiffe aus der Flotte Das ist das was mein Code oben machen sollte).<br />
Dabei muss ich dann die Trefferwahrscheinlichkeit nur EINMAL berechnen</p>
<p>Aber ich werd jetzt mal die Schiffe von hinten löschen, das sollte gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265937</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sat, 14 Apr 2007 13:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 13:59:58 GMT]]></title><description><![CDATA[<p>Ok, ich hab jetzt euren Vorschlag umgesetzt und die Schiff von hinten her gelöscht.<br />
Ergebnis: gleiches Problem wie vorher :(.</p>
<p>Code:</p>
<pre><code class="language-cpp">INDEX_SET::reverse_iterator index_reviter;
	index_reviter=ship_indexes.rbegin();

	while(index_reviter!=ship_indexes.rend())//clear all ships at the indexes in ShipVector
	{
		if(count_deletes&gt;0)
			_DPRINTL(&quot;count_deletes&gt;0&quot;);
		//save the size of the ship
		shipsize_buffer_vector.push_back(ShipVector.at(*index_reviter)-&gt;GetSize());
		//clear ship from ShipVector
		_DPRINTL(&quot;delete ship [%p]: *index_reviter: %d&quot;,ShipVector.at(*index_reviter),*index_reviter);
		delete ShipVector.at(*index_reviter); //delete the Ship, because it was created with new
		_DPRINTL(&quot;deleted ship [%p]!&quot;,ShipVector.at(*index_reviter));
		ShipVector.erase(ShipVector.begin() + *index_reviter); //don't remove the brackets, or the iterator will jump for one moment over his bounds, that leads in VS to an assertion failed!

		count_deletes++;

		_DPRINTL(&quot;DUMP: ShipVector after %d. delete&quot;,count_deletes);
		DumpShipVector();
		_DPRINTL(&quot;END DUMP: ShipVector after %d. delete&quot;,count_deletes);

		index_reviter++;
	}
</code></pre>
<p>Mir ist allerdings was aufgefallen:<br />
Schaut euch dieses Bild hier an: <a href="http://666kb.com/i/anhp4ws10z83hogy2.png" rel="nofollow">http://666kb.com/i/anhp4ws10z83hogy2.png</a></p>
<p>Seht ihr auf was index_reviter zeigt?<br />
Genau auf eine negative Zahl. Das kann doch nicht sein?????<br />
Ich meine ich weiß ja nicht, es ist ja alles richtig programmiert soweit ich das sehe.<br />
Und was am aller seltsamsten ist:<br />
Gehe ich weiter, und schaue was <a href="http://ShipVector.at" rel="nofollow">ShipVector.at</a>(size_t pos) macht, dann ist pos nicht der (falsche negative) Wert von index_reviter, sondern der richtige, auf den index_reviter auch zeigen sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> .<br />
Was soll das? Ein Bug in Visual Studio oder ein Fehler von mir???<br />
Bugs äußern sich ja manchmal in der schrägsten Dingen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Langsam hab ich das Gefühl, das mein Fehler irgendwo anderst liegt <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 />
Aber wo, das hier ist die einzige Stelle an der ich delete benütze...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265947</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sat, 14 Apr 2007 13:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 14:08:54 GMT]]></title><description><![CDATA[<p>Frage fürs eigene Verständnis: wieso dererenzierst du den iterator beim delete (also beim aufruf von at, genauer gesagt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265958</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sat, 14 Apr 2007 14:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 14:21:54 GMT]]></title><description><![CDATA[<p>Also, <strong>ship_indexes</strong> speichert die Indexe der Elemente ab, die aus ShipVector gelöscht werden sollen.<br />
<strong>index_reviter</strong> ist ein Iterator, der auf ein Element in ship_indexes zeigt<br />
<strong>ShipVector</strong> enthält die Zeiger auf alle Schiffe in der Flotte.<br />
Da ich alle Schiffe mit new erstellt habe, muss ich sie, wenn ich sie aus der Flotte mit erase lösche, mit delete wieder löschen. (Sonst werden sie ja nie gelöscht -&gt; Memory Leak)</p>
<p>Deswegen mach ich</p>
<pre><code class="language-cpp">delete ShipVector.at(*index_reviter); //delete the Ship, because it was created with new
</code></pre>
<p>Heißt nix anderes als &quot;Lösche jetzt das Schiff, das zerstört worden ist&quot;<br />
Und *index_reviter sollte ja der Index des Schiffes sein das gelöscht wird</p>
<p>Das war doch deine Frage oder?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265963</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sat, 14 Apr 2007 14:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 14:20:01 GMT]]></title><description><![CDATA[<p>Hmm, wenn man einen index dereferenziert erhält man das Element auf das er zeigt soweit ich bisher dachte.</p>
<p>quasi:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
v.push_back(5);
std::iterator it=v.begin();
assert((*it)=5);
</code></pre>
<p>Von daher würde ich einfach</p>
<pre><code class="language-cpp">delete *it;
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265966</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sat, 14 Apr 2007 14:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 14:25:54 GMT]]></title><description><![CDATA[<p>naja, aber da verwechselst du was:</p>
<p>index_iter zeigt auf ship_indexes, der die Indexe der Schiffe enthält die gelöscht werden sollen.<br />
ShipVector enthält dann die Zeiger auf die Schiffe.</p>
<p>Deswegen</p>
<pre><code class="language-cpp">delete ShipVector.at(*index_reviter); //delete the Ship, because it was created with new
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1265970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265970</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sat, 14 Apr 2007 14:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Element in std::vector löschen on Sat, 14 Apr 2007 14:41:16 GMT]]></title><description><![CDATA[<p>Achsoooo, *Klick*<br />
Sorry, hatte glatt vergessen, dass das ja nicht der vector ist auf den der iterator zeigt.</p>
<p>Entschuldige dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265981</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sat, 14 Apr 2007 14:41:16 GMT</pubDate></item></channel></rss>