<?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[Iterator kopieren]]></title><description><![CDATA[<p>Hallo!<br />
Ich will in meinem Programm den Iterator einer STL-Liste kopieren.<br />
Sinn und Zweck ist es, den Iterator zu sichern, den originalen zu<br />
bewegen, und ggf. wieder an die ursprüngliche Position zu bringen.<br />
Der originale Iterator ist:</p>
<pre><code class="language-cpp">list &lt;cConfigEntry&gt;::iterator Iter;
</code></pre>
<p>Den setze ich auf eine beliebige Position in der Liste.<br />
Für's Kopieren hab ich folgende beiden Möglichkeiten versucht, sollten<br />
doch beide auf dasselbe rauskommen:</p>
<pre><code class="language-cpp">list &lt;cConfigEntry&gt;::iterator SaveIter = Iter;
list &lt;cConfigEntry&gt;::iterator SaveIter(Iter);
</code></pre>
<p>Dann die Zuweisung mit der ursprünglichen Position:</p>
<pre><code class="language-cpp">Iter = SaveIter;
</code></pre>
<p>ergibt jedoch einen Segfault.<br />
Mein Verdacht war, dass dies nur eine flache Kopie ist, aber eigentlich<br />
müsste doch der Kopierkonstuktor aufgerufen werden, und eine tiefe Kopie<br />
machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179733/iterator-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 09:27:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179733.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Apr 2007 19:23:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:23:35 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich will in meinem Programm den Iterator einer STL-Liste kopieren.<br />
Sinn und Zweck ist es, den Iterator zu sichern, den originalen zu<br />
bewegen, und ggf. wieder an die ursprüngliche Position zu bringen.<br />
Der originale Iterator ist:</p>
<pre><code class="language-cpp">list &lt;cConfigEntry&gt;::iterator Iter;
</code></pre>
<p>Den setze ich auf eine beliebige Position in der Liste.<br />
Für's Kopieren hab ich folgende beiden Möglichkeiten versucht, sollten<br />
doch beide auf dasselbe rauskommen:</p>
<pre><code class="language-cpp">list &lt;cConfigEntry&gt;::iterator SaveIter = Iter;
list &lt;cConfigEntry&gt;::iterator SaveIter(Iter);
</code></pre>
<p>Dann die Zuweisung mit der ursprünglichen Position:</p>
<pre><code class="language-cpp">Iter = SaveIter;
</code></pre>
<p>ergibt jedoch einen Segfault.<br />
Mein Verdacht war, dass dies nur eine flache Kopie ist, aber eigentlich<br />
müsste doch der Kopierkonstuktor aufgerufen werden, und eine tiefe Kopie<br />
machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272760</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:23:35 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:34:04 GMT]]></title><description><![CDATA[<p>hm... bist du dir sicher, dass du mit dem neuen iterator nichts anstellst, was den anderen ungültig macht? also, wirklich nur iterieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272762</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:42:26 GMT]]></title><description><![CDATA[<p>Ja, bin ich mir sicher. Ich weise ihm nur den originalen zu. Sonst mach<br />
ich mit ihm nix.<br />
Der Segfault kommt schon bei der Deklaration und Zuweisung. Ich hab<br />
mal alles andere auskommentiert, bis auf obiges.<br />
Aber ich lieg doch richtig, dass beide Möglichkeiten dasselbe sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272770</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:57:01 GMT]]></title><description><![CDATA[<p>Hier mal meine Klassenmethode:</p>
<pre><code class="language-cpp">bool cConfigFile::setEnd(string _Head)
{
   if (Configuration.empty())
   {
      return false;
   }

   list &lt;cConfigEntry&gt;::iterator SaveIter = Iter;

   Iter = Configuration.end();
   Iter--;

   while (_Head != Iter-&gt;getHead())
   {
      if (Iter == Configuration.begin())
      {
         Iter = SaveIter;
         return false;
      }

      Iter--;
   }

   return true;
}
</code></pre>
<p>Iter ist als Member der Klasse im Headerfile deklariert.<br />
Und Iter kriegt beim Programmstart eine Zuweisung, zeigt also auf eine<br />
gültige Position.<br />
Die Liste speichert eine eingelesene ini-Datei nach Header, Keyword und<br />
Values. Diese Methode soll den Iterator auf das letzte Element eines<br />
Headers setzen. Falls das nicht gelingt, kann ja sein, dass es den<br />
übergebenen Header nicht gibt, soll der Iterator wieder auf seine<br />
ursprüngliche Position gesetzt werden, und false zurückgegeben werden.<br />
In der Liste werden cConfigEntry Objekte gespeichert.<br />
cConfigEntry::getHead() liefert mir den Header.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272780</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:59:51 GMT]]></title><description><![CDATA[<p>hm... kein plan... dummerweise hocke ich grad an einem andren rechner <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="😞"
    /> , die ganzen header der STL habe ich hier momentan leider nicht zur verfügung... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Ansonsten würde ich im &lt;LIST&gt; header nachschauen, in der &quot;list&quot;-klasse ist irgendwo eine &quot;iterator&quot; bzw &quot;const_iterator&quot; klasse definiert, schau mal, wie der = operator definiert ist (die ganzen typedefs sind ganz oben in der list-klasse zu finden) Da kannst du direkt nachschauen, was da eigentlich gemacht wird... Aber das ganze ist leider nicht so übertrieben leserlich, wenn ich ehrlich bin... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Aber wenn sonst nichts hilft, kann man ja nen blick darein riskieren <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>keine ahnung, wie man sonst erfahren will, was da los ist... wahrscheinlich gibts hier andere leute, die dasselbe problem schon mal hatten... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>\edit: mit dem debugger drübergeschaut, irgendetwas auffälliges entdeckt? irgendwo muss es ja dazu kommen, dass die iteratoren irgendwie &quot;verrutschen&quot; und auf die falsche stelle zeigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272782</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 19:59:52 GMT]]></title><description><![CDATA[<p>Abre selbst wenn der =-Operator nicht so definiert ist, wie ich angenommen<br />
habe, müsste</p>
<pre><code class="language-cpp">list &lt;cConfigEntry&gt;::iterator SaveIter(Iter);
</code></pre>
<p>doch das gewünschte Ergebnis bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272784</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 24 Apr 2007 19:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 20:08:37 GMT]]></title><description><![CDATA[<p>Klar kannst du parallel über zwei Iteratoren wandern...</p>
<pre><code class="language-cpp">#include&lt;vector&gt;
#include&lt;list&gt;
#include&lt;windows.h&gt;
#include&lt;iostream&gt;

int main(){
	std::list&lt;int&gt; vec;
	for(int i=0; i&lt;10;++i){
		vec.push_back(i);
	}
	std::list&lt;int&gt;::iterator it = vec.begin();
	for(int i=0; i&lt;3;++i){
		std::cout &lt;&lt; *it &lt;&lt; std::endl;
		++it;
	}
	std::list&lt;int&gt;::iterator it2 = it;
	int j=0;
	while(it!=vec.end() || it2!=vec.end()){
		if(j%3==0){
			if(it!=vec.end()){
				std::cout &lt;&lt; *it &lt;&lt; std::endl;
				++it;
	  		}
		}
		else{
			if(it2!=vec.end()){
				std::cout &lt;&lt; *it2 &lt;&lt; std::endl;
				++it2;
	  		}
	 	}
		++j;
	}
	return 0;
}
</code></pre>
<p>Sowas etwa geht einwandfrei.<br />
Ich weiß nicht wie --it definiert ist, aber würde mich wundern, dass<br />
so, denn wofür gibt es dann einen reverse_iterator<br />
Ich würd an deiner Stelle einen reverse_iterator verwenden...</p>
<p>EDIT: Genau wie den normalen Iterator verwenden mit ++i, nur stattdessen rbegin() und rend()</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272789</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:08:37 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 20:09:28 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Ich weiß nicht wie --it definiert ist, aber würde mich wundern, dass<br />
so, denn wofür gibt es dann einen reverse_iterator</p>
</blockquote>
<p>Den gibt es, damit Algorithmen, die nur für forward-Iteratoren ausgelegt sind, die Sequenz auch rückwärts bearbeiten können. list hat bidirektionale Iteratoren, die unterstützen -- genauso wie ++ (und gäbe es -- nicht, dann gäbe es auch keine reverse-Iteratoren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272794</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 20:09:44 GMT]]></title><description><![CDATA[<p>der reverse_iterator ist afaik einfach so eine art wrapper-template, die einen normalen iterator nimmt, alle zurückgegebenen zeiger um 1 versetzt und die -- ++ und += -= operatoren vertauscht, daran kann es also meiner meinung nach nicht liegen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272795</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 20:50:26 GMT]]></title><description><![CDATA[<p>Ich denke nicht dass man von &quot;.end()&quot; ausgehen und dann &quot;zurückwandern&quot; darf. Würde mich wunder wenn das erlaubt wäre...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272831</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Tue, 24 Apr 2007 20:55:59 GMT]]></title><description><![CDATA[<p>bei BidIt's und RanIt's geht es doch wunderbar, warum sollen denn da irgendwo schwierigkeiten auftreten?</p>
<p>List hat doch einen bidirektionalen iterator, ++ unterscheidet sich eigentlich durch gar nichts vom --, man nimmt halt statt des pNext-zeigers den pPrevious-zeiger, oder wie die da heissen... Für die maschine gibt es da genau 0 unterschiede, nur die menschen sind halt dran gewohnt, irgendwo ein anfang und ein ende zu definieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272833</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Wed, 25 Apr 2007 10:28:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich dachte für reverse Iteratoren verwendet man rbegin() und rend() ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273058</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 25 Apr 2007 10:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Wed, 25 Apr 2007 10:29:55 GMT]]></title><description><![CDATA[<p>richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273061</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Wed, 25 Apr 2007 10:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Wed, 25 Apr 2007 13:48:40 GMT]]></title><description><![CDATA[<p>Mein Segfault kommt aber schon bei der Deklaration des neuen, und bei der<br />
Zuweisung des alten an den neuen Iterator.<br />
Warum soll es nicht möglich sein, zuerst an das Ende zu springen, und dann<br />
mit -- zum Anfang zu wandern? Wenn ich dem Iterator an list::end() zuweise,<br />
steh ich ja ganz am Ende der Liste, also hinter dem letzen Eintrag. Ein<br />
folgendes -- würde ihn dann doch auf den letzen Eintrag bewegen.<br />
Aber das alles ist nicht die Ursache meines Segfaults.<br />
Aus irgendeinem Grund scheitert bei mir die Zuweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273250</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 25 Apr 2007 13:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator kopieren on Wed, 25 Apr 2007 13:58:39 GMT]]></title><description><![CDATA[<p>Ich hab den Fehler gefunden. Ich hatte zu Testzwecken die Initialisierung<br />
des ersten Iterators, die beim Laden des Files stattfinden soll, auskommen-<br />
tiert. Er wurde also nur als Member deklariert. Deshalb scheiterte die<br />
Zuweisung. Jetzt geht es wie gewünscht, auch mit dem Zurückwandern.<br />
Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273262</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 25 Apr 2007 13:58:39 GMT</pubDate></item></channel></rss>