<?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[Gültigkeit von Iteratoren bei zwischenzeitlichem Hinzufügen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab hier mal nen Beispiel gepostet. Hier verwende ich einen<br />
Iterator auf einem std::vector, füge neue Elemente hinzu und arbeite<br />
dann mit dem Iterator weiter. Es funktioniert allerdings nicht, da der<br />
std::vector sich irgendwann neuen Speicher alloziiert und der Inhalt<br />
nun woanders liegt und der Iterator auf dem vorherigen Bereich weiterarbeitet.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;

int main(int argc, char *argv[]){
	std::vector&lt;int&gt; vec;
	for(int i=0; i&lt;10; ++i){
		vec.push_back(i);
	}
	std::vector&lt;int&gt;::const_iterator it = vec.begin();
	for(int i=0; i&lt;5; ++i){
		int j = *it;
		std::cout &lt;&lt; j &lt;&lt; std::endl;
		++it;
	}
	for(int i=10; i&lt;1000; ++i){
		vec.push_back(i);
	}
	for(;it!=vec.end(); ++it){
		std::cout &lt;&lt; *it &lt;&lt; std::endl;
	}
}
</code></pre>
<p>Ich finde es auch sehr verständlich, warum das nicht geht.<br />
Meine Intuition sagt mir, dass es bei einer std::list klappt, da es sich<br />
ja um eine Verkettete Liste handelt. Es scheint auch zu funktionieren, aber<br />
kann ich mich darauf verlassen oder hab ich unter Umständen<br />
irgendwas zu befürchten?</p>
<p>Wo ich den Beitrag gerade schreibe:<br />
Darf ich mir aus genau diesem Grund auch keine Referenz auf ein Objekt<br />
in einem Vektor dauerhaft halten?</p>
<p>Gruß,<br />
*Cpp-Anfänger*</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201087/gültigkeit-von-iteratoren-bei-zwischenzeitlichem-hinzufügen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 12:27:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201087.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Dec 2007 03:30:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gültigkeit von Iteratoren bei zwischenzeitlichem Hinzufügen on Mon, 24 Dec 2007 03:30:00 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab hier mal nen Beispiel gepostet. Hier verwende ich einen<br />
Iterator auf einem std::vector, füge neue Elemente hinzu und arbeite<br />
dann mit dem Iterator weiter. Es funktioniert allerdings nicht, da der<br />
std::vector sich irgendwann neuen Speicher alloziiert und der Inhalt<br />
nun woanders liegt und der Iterator auf dem vorherigen Bereich weiterarbeitet.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;

int main(int argc, char *argv[]){
	std::vector&lt;int&gt; vec;
	for(int i=0; i&lt;10; ++i){
		vec.push_back(i);
	}
	std::vector&lt;int&gt;::const_iterator it = vec.begin();
	for(int i=0; i&lt;5; ++i){
		int j = *it;
		std::cout &lt;&lt; j &lt;&lt; std::endl;
		++it;
	}
	for(int i=10; i&lt;1000; ++i){
		vec.push_back(i);
	}
	for(;it!=vec.end(); ++it){
		std::cout &lt;&lt; *it &lt;&lt; std::endl;
	}
}
</code></pre>
<p>Ich finde es auch sehr verständlich, warum das nicht geht.<br />
Meine Intuition sagt mir, dass es bei einer std::list klappt, da es sich<br />
ja um eine Verkettete Liste handelt. Es scheint auch zu funktionieren, aber<br />
kann ich mich darauf verlassen oder hab ich unter Umständen<br />
irgendwas zu befürchten?</p>
<p>Wo ich den Beitrag gerade schreibe:<br />
Darf ich mir aus genau diesem Grund auch keine Referenz auf ein Objekt<br />
in einem Vektor dauerhaft halten?</p>
<p>Gruß,<br />
*Cpp-Anfänger*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425488</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Mon, 24 Dec 2007 03:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeit von Iteratoren bei zwischenzeitlichem Hinzufügen on Mon, 24 Dec 2007 05:11:36 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/stl/list/insert.html" rel="nofollow">Die Referenz die ich nutze</a> sagt zum Einfügen in lists:</p>
<blockquote>
<p>all of the previously obtained iterators and references remain valid after the insertion and refer to the same elements they were referring before.</p>
</blockquote>
<p>Und ja, Referenzen in einen vector werden genauso wie Iteratoren ungültig, sobald eine Einfügeoperation ein umkopieren der Inhalte des vectors nötig macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425489</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Dec 2007 05:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeit von Iteratoren bei zwischenzeitlichem Hinzufügen on Mon, 24 Dec 2007 05:17:27 GMT]]></title><description><![CDATA[<p>bei list ist dir garantiert, dass das einfügen keine iteratoren und/oder referenzen invalidiert, das löschen nur den jeweiligen iterator, der auf das zu löschende element zeigt.</p>
<p>für vector ist das nur garantiert, wenn die anzahl der neuen elemente seine capacity vor dem einfügen nicht überschreitet. das heißt aber auch, dass deine iteratoren gültig bleiben, wenn du vor der initialisierung des iterators</p>
<pre><code class="language-cpp">vec.reserve (vec.size() + 1000);
std::vector&lt;int&gt;::const_iterator it = vec.begin();
//...
</code></pre>
<p>einfügst, wird dir auch nichts passieren.</p>
<p>/edit: bei vector natürlich nur für einfügeoperationen und auch nur am ende des vectors garantiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425490</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 24 Dec 2007 05:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeit von Iteratoren bei zwischenzeitlichem Hinzufügen on Mon, 24 Dec 2007 10:14:49 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure prägnanten Erklärungen.</p>
<p>Bisher hab ich Elemente immer mit</p>
<pre><code class="language-cpp">list.push_back(i);
</code></pre>
<p>ans Ende einer Liste angehängt.<br />
Hier steht sowas in dieser Referenz nicht<br />
explizit bei.<br />
In Zukunft werde ich wohl eher</p>
<pre><code class="language-cpp">list.insert(list.end(),i);
</code></pre>
<p>benutzen. Sicher ist sicher <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>An di Möglichkeit der vorzeitigen Speicherreservierung für<br />
std::vectot hab ich auch gedacht, aber danke für die definitive<br />
Aussage.</p>
<p>Ich wünsche euch noch einen schönen Heiligen Abend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425525</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Mon, 24 Dec 2007 10:14:49 GMT</pubDate></item></channel></rss>