<?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[Vectorelement löschen]]></title><description><![CDATA[<p>Hallo,<br />
ich kenne mich leider noch nicht so gut mit der Vector Klasse von CPP aus:<br />
Ich habe versucht ein Nachrichtensystem zu programmieren, jede Nachricht erhält eine bestimmte Dauer, wielange sie angezeigt werden soll. Jetzt wird jedesmal die Zeit runtergesetzt. Wenn die Zeit kleiner Null geworden ist soll die Nachricht gelöscht werden:</p>
<pre><code class="language-cpp">for(std::vector&lt;Message1&gt;::iterator dIter3(Nachrichten1.begin()); !Nachrichten1.empty() &amp;&amp; dIter3 != Nachrichten1.end(); ++dIter3)
{
//Das ist nur zum Anzeigen der Meldung da...		
		m_pFont1-&gt;DrawText((*dIter3).Position, (*dIter3).Text, 0, -1, ((*dIter3).Happy ? tbColor(0.0f, 1.0f, 0.0f) : tbColor(1.0f, 0.0f, 0.0f)), tbColor(-1.0f), tbVector2(2.0f));
//Zeit der Nachricht heruntersetzen
		(*dIter3).fTime-=fTime;
//Abfragen ob die Zeit für die Nachricht abgelaufen ist
		if((*dIter3).fTime &lt;= 0.0f) 
		{
			Nachrichten1.erase(dIter3);
		}
	}
</code></pre>
<p>Wenn ich das ganze jetzt starte und zwei Nachrichten in der Schleife habe und eine abläuft löscht er beim Debuggen die erste, geht dann aber nochmal in die If-Abfrage, obwohl diese Nachricht noch gar nicht wieder gelöscht werden darf und bring dann bei der erase Anweisung die Meldung &quot;Acess Violation&quot;</p>
<p>Was muss ich anders machen, sodass dieses System funktioniert?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194282/vectorelement-löschen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 10:24:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194282.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Oct 2007 18:09:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vectorelement löschen on Thu, 04 Oct 2007 18:09:51 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich kenne mich leider noch nicht so gut mit der Vector Klasse von CPP aus:<br />
Ich habe versucht ein Nachrichtensystem zu programmieren, jede Nachricht erhält eine bestimmte Dauer, wielange sie angezeigt werden soll. Jetzt wird jedesmal die Zeit runtergesetzt. Wenn die Zeit kleiner Null geworden ist soll die Nachricht gelöscht werden:</p>
<pre><code class="language-cpp">for(std::vector&lt;Message1&gt;::iterator dIter3(Nachrichten1.begin()); !Nachrichten1.empty() &amp;&amp; dIter3 != Nachrichten1.end(); ++dIter3)
{
//Das ist nur zum Anzeigen der Meldung da...		
		m_pFont1-&gt;DrawText((*dIter3).Position, (*dIter3).Text, 0, -1, ((*dIter3).Happy ? tbColor(0.0f, 1.0f, 0.0f) : tbColor(1.0f, 0.0f, 0.0f)), tbColor(-1.0f), tbVector2(2.0f));
//Zeit der Nachricht heruntersetzen
		(*dIter3).fTime-=fTime;
//Abfragen ob die Zeit für die Nachricht abgelaufen ist
		if((*dIter3).fTime &lt;= 0.0f) 
		{
			Nachrichten1.erase(dIter3);
		}
	}
</code></pre>
<p>Wenn ich das ganze jetzt starte und zwei Nachrichten in der Schleife habe und eine abläuft löscht er beim Debuggen die erste, geht dann aber nochmal in die If-Abfrage, obwohl diese Nachricht noch gar nicht wieder gelöscht werden darf und bring dann bei der erase Anweisung die Meldung &quot;Acess Violation&quot;</p>
<p>Was muss ich anders machen, sodass dieses System funktioniert?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378097</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Thu, 04 Oct 2007 18:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Thu, 04 Oct 2007 18:46:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Evtl. hilft dir dieser Thread (noch auf dieser Seite)<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-162637.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-162637.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378134</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 04 Oct 2007 18:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Thu, 04 Oct 2007 19:40:53 GMT]]></title><description><![CDATA[<p>Hi danke für die Antwort!<br />
So wie ich den Thread verstanden habe dreht es sich dabei aber darum, wie man ein Element überhaupt löscht.<br />
Ich bin mir nicht ganz sicher, aber ich glaube, dass das löschen funktioniert, nur glaube ich, dass etwas schiefgeht, wenn ich das so lösche, und dann in der for schleife einfach normal vorwärts gehe.<br />
Vielleicht werden die verbleibenden Elemente anders als ich denke beim löschen verketten, ich bin mir aber überhaupt nicht sicher.<br />
Hat das denn noch keiner gemacht, mit einem Iterator einen Vektor durchgegangen und zwischendurch Elemente gelöscht? (Vielleicht ein Codebeispiel)</p>
<p>Viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378163</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Thu, 04 Oct 2007 19:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Thu, 04 Oct 2007 21:40:54 GMT]]></title><description><![CDATA[<p>Ich werf dir hier einfach mal ein Stück Code von mir hin (lustig, dass wir gerade an was ähnlichem arbeiten <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="😉"
    /> ), ich verwende zwar eine std::list, das Prinzip ist aber das selbe:</p>
<pre><code class="language-cpp">std::list&lt;GLLogMessage&gt;::iterator pos = m_messages.begin();

	while(pos != m_messages.end())
	{
		//check if message has exceeded its lifetime
		if((current_time - pos-&gt;timestamp) &gt; (5 * CLOCKS_PER_SEC))
		{
                        //Delete Message
			pos = m_messages.erase(pos); //erase gibt einen iterator auf das nächste Element zurück
		}
		else
		{
                         //Print message
		         ...

                         pos++;
                }

         }
</code></pre>
<p>Wenn du mit dem Iterator, den erase zurückgibt, weiterarbeitest, bist du in jedem Fall auf der sicheren Seite...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378214</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Thu, 04 Oct 2007 21:50:08 GMT]]></title><description><![CDATA[<p>- <em>std::vector::erase</em> invalidiert sämtliche Iteratoren.</p>
<p>- Dein <em>!Nachrichten1.empty()</em> ist vielleicht nett gemeint, aber eigentlich unnötig. Der idiomatische Weg in C++ ist ganz einfach</p>
<pre><code class="language-cpp">for (container::iterator it = c.begin(), end = c.end(); it != end; ++it)
</code></pre>
<p>, wobei <em>std::for_each</em> und Konsorten nach Möglichkeit vorzuziehen sind.</p>
<p>- *(<em>iter).member</em> liest sich wie folgendermaßen etwas leichter: <em>iter-&gt;member</em></p>
<p>- &quot;Message1&quot;, &quot;m_pFont1&quot;, etc., sind ganz, ganz üble Bezeichner, insbesondere für Typen. (Borland-geschädigt, stimmt's? <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/1378219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378219</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Fri, 05 Oct 2007 06:36:25 GMT]]></title><description><![CDATA[<p>finix schrieb:</p>
<blockquote>
<p>- <em>std::vector::erase</em> invalidiert sämtliche Iteratoren.</p>
</blockquote>
<p>Nicht alle, aber zumindest alles hinter der Lösch-Position <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="😉"
    /> (darum gibt erase() auch den Iterator hinter die Lösch-Position zurück)</p>
<blockquote>
<p>- Dein <em>!Nachrichten1.empty()</em> ist vielleicht nett gemeint, aber eigentlich unnötig. Der idiomatische Weg in C++ ist ganz einfach</p>
<pre><code class="language-cpp">for (container::iterator it = c.begin(), end = c.end(); it != end; ++it)
</code></pre>
<p>, wobei <em>std::for_each</em> und Konsorten nach Möglichkeit vorzuziehen sind.</p>
</blockquote>
<p>Und diese Schleife wird dir nicht sehr viel Freude bereiten - da du in der Schleife den vector umbaust, wird 'end' auch ungültig.</p>
<p>Ja, std::for_each() und Co. sind geeigneter - können aber nicht auf die interne Struktur des unterliegenden Containers zugreifen (also auch keine Elemente löschen). Selbst die Lösch-Algorithmen wie remove_if() kopieren die Elemente nur im Bereich um und lassen am Ende einen Block &quot;unbenutzter&quot; Elemente stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378284</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 05 Oct 2007 06:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Fri, 05 Oct 2007 11:52:43 GMT]]></title><description><![CDATA[<p>Hallo, erstmal vielen Dank für die ganzen Antworten,</p>
<p>ich hab versucht das ganze jetzt etwas umzubauen und jetzt sieht es so aus:</p>
<pre><code class="language-cpp">for(std::vector&lt;Message1&gt;::iterator dIter3(Nachrichten1.begin()); dIter3 != Nachrichten1.end(); ++dIter3)
	{
		m_pFont1-&gt;DrawText(dIter3-&gt;Position, dIter3-&gt;Text, 0, -1, (dIter3-&gt;Happy ? tbColor(0.0f, 1.0f, 0.0f) : tbColor(1.0f, 0.0f, 0.0f)), tbColor(-1.0f), tbVector2(2.0f));
		dIter3-&gt;fTime-=fTime;

		if(dIter3-&gt;fTime &lt;= 0.0f) 
		{
			dIter3 = Nachrichten1.erase(dIter3);

		}
	}
</code></pre>
<p>Damit hätte ich jetzt dIter3 wieder aktualisiert, da ich ihm den Wert von erase() zugewiesen habe.<br />
In meinem Cpp Buch ist aber erase() für den Datentyp Vector() als void definiert und funktionieren tut es leider immer noch nicht. Es kommt immer noch die AcessViolation Meldung.<br />
Ich möchte die Elemente aber wirklich gelöscht haben, da sie danach nicht zu gebrauchen sind<br />
-&gt;</p>
<blockquote>
<p>(also auch keine Elemente löschen).</p>
</blockquote>
<p>Deshalb bringt mir std::for_each() doch dann nichts, oder doch?<br />
Gibts irgendwie noch eine andere Möglichkeit, wie ich die Elemente sicher löschen kann und anschließend keine Acess Violation erhalte?</p>
<p>Vielen Dank und viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378544</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Fri, 05 Oct 2007 12:19:48 GMT]]></title><description><![CDATA[<blockquote>
<p>In meinem Cpp Buch ist aber erase() für den Datentyp Vector() als void definiert und funktionieren tut es leider immer noch nicht.</p>
</blockquote>
<p>Da erzählt dein Buch Blödsinn:<br />
<a href="http://www.cplusplus.com/reference/stl/vector/erase.html" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/erase.html</a><br />
Wenn es wirklich so wäre, würde dein Code auch garnicht erst kompilieren...</p>
<p>Die Access Violation kommt aus folgendem Grund zustande:<br />
Szenario: dein Iterator ist beim vorletzten Element des Vektors angelangt, dein Programm stellt fest, das die Message veraltet ist. Jetzt löschst du das Element und setzt den Iterator auf das nächste (letzte) Element des Vektors. Beim nächsten Schleifendurchlauf wird der Iterator nochmal inkrementiert, zeigt jetzt also auf ungültigen Speicher hinter dem Vektor, der Zugriff geht schief...</p>
<p>Ich hab deshalb die Variante mit der while-Schleife gewählt, weil ich dort den Iterator unabhängig vom Schleifenkopf inkrementieren kann...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378569</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Fri, 05 Oct 2007 12:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Fri, 05 Oct 2007 13:02:52 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>finix schrieb:</p>
<blockquote>
<p>- <em>std::vector::erase</em> invalidiert sämtliche Iteratoren.</p>
</blockquote>
<p>Nicht alle, aber zumindest alles hinter der Lösch-Position <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="😉"
    /> (darum gibt erase() auch den Iterator hinter die Lösch-Position zurück)</p>
</blockquote>
<p>Das war eher als allgemeiner Tipp zu verstehen. Im Sinne von Iteratoren von mutable vectoren sind höchst flüchtig.</p>
<p>CStoll schrieb:</p>
<blockquote>
<blockquote>
<p>- Dein <em>!Nachrichten1.empty()</em> ist vielleicht nett gemeint, aber eigentlich unnötig. Der idiomatische Weg in C++ ist ganz einfach</p>
<pre><code class="language-cpp">for (container::iterator it = c.begin(), end = c.end(); it != end; ++it)
</code></pre>
<p>, wobei <em>std::for_each</em> und Konsorten nach Möglichkeit vorzuziehen sind.</p>
</blockquote>
<p>Und diese Schleife wird dir nicht sehr viel Freude bereiten - da du in der Schleife den vector umbaust, wird 'end' auch ungültig.</p>
</blockquote>
<p>Siehe oben. Allgemeiner Weg um über einen Container zu iterieren.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Ja, std::for_each() und Co. sind geeigneter - können aber nicht auf die interne Struktur des unterliegenden Containers zugreifen (also auch keine Elemente löschen). Selbst die Lösch-Algorithmen wie remove_if() kopieren die Elemente nur im Bereich um und lassen am Ende einen Block &quot;unbenutzter&quot; Elemente stehen.</p>
</blockquote>
<p>Ja, schon klar. Aber siehe oben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378603</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vectorelement löschen on Fri, 05 Oct 2007 13:06:45 GMT]]></title><description><![CDATA[<p>Vielen Dank Martin,<br />
damit geht es jetzt und ich hab auch verstanden wie der Fehler zustandekommt <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="🙂"
    /><br />
Viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378609</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:06:45 GMT</pubDate></item></channel></rss>