<?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 oder Listenproblem]]></title><description><![CDATA[<p>Habe ein kleines Problem mit Iteratoren anscheinend. Kann sein dass es auch ein etwas grundlegenderes Problem mit Call by Value/Reference ist.</p>
<pre><code class="language-cpp">/*
 * connections ist ein Vector&lt;CONECT&gt;
 * CONECT besteht aus einem int startID
 * und einer Liste&lt;int&gt; ConnectionID
 * getConnectionID() { return ConnectionID; }
 */
for (unsigned int i = 0; i &lt; connections.size(); i++)
{
    cout &lt;&lt; connections[i].getStartID() &lt;&lt; &quot; &quot;;

// Möglichkeit 1: Funktioniert : kopiere die Liste
    list&lt;int&gt; l = connections[i].getConnectID();
    for (list&lt;int&gt;::iterator iter = l.begin(); iter != l.end(); iter++)
    {
        cout &lt;&lt; *iter &lt;&lt; &quot; &quot;;
    }
    cout &lt;&lt; endl;
// Möglichkeit 2 funktioniert nicht, versuchter direkter Aufruf -&gt; Speicherzugriffsfehler
    for (list&lt;int&gt;::iterator iter = connections[i].getConnectID().begin(); iter != connections[i].getConnectID().end(); iter++)
    {
        cout &lt;&lt; *iter &lt;&lt; &quot; &quot;;
    }
    cout &lt;&lt; endl;

}
</code></pre>
<p>Woran liegt das? Wird mit jedem Aufruf von getConnectID() eine neue Liste angefordert, für die der Iterator nicht mehr gilt?</p>
<p>Generelle Verbessetrungsvorschläge sind auch gern gesehen, ich weiß dass ich kein guter C++-Progger mit jahrelanger Erfahrung bin <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/topic/298295/iterator-oder-listenproblem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 22:27:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298295.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jan 2012 13:42:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:42:35 GMT]]></title><description><![CDATA[<p>Habe ein kleines Problem mit Iteratoren anscheinend. Kann sein dass es auch ein etwas grundlegenderes Problem mit Call by Value/Reference ist.</p>
<pre><code class="language-cpp">/*
 * connections ist ein Vector&lt;CONECT&gt;
 * CONECT besteht aus einem int startID
 * und einer Liste&lt;int&gt; ConnectionID
 * getConnectionID() { return ConnectionID; }
 */
for (unsigned int i = 0; i &lt; connections.size(); i++)
{
    cout &lt;&lt; connections[i].getStartID() &lt;&lt; &quot; &quot;;

// Möglichkeit 1: Funktioniert : kopiere die Liste
    list&lt;int&gt; l = connections[i].getConnectID();
    for (list&lt;int&gt;::iterator iter = l.begin(); iter != l.end(); iter++)
    {
        cout &lt;&lt; *iter &lt;&lt; &quot; &quot;;
    }
    cout &lt;&lt; endl;
// Möglichkeit 2 funktioniert nicht, versuchter direkter Aufruf -&gt; Speicherzugriffsfehler
    for (list&lt;int&gt;::iterator iter = connections[i].getConnectID().begin(); iter != connections[i].getConnectID().end(); iter++)
    {
        cout &lt;&lt; *iter &lt;&lt; &quot; &quot;;
    }
    cout &lt;&lt; endl;

}
</code></pre>
<p>Woran liegt das? Wird mit jedem Aufruf von getConnectID() eine neue Liste angefordert, für die der Iterator nicht mehr gilt?</p>
<p>Generelle Verbessetrungsvorschläge sind auch gern gesehen, ich weiß dass ich kein guter C++-Progger mit jahrelanger Erfahrung bin <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/2169126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169126</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:46:47 GMT]]></title><description><![CDATA[<p>Gibt getConnectID vielleicht eine Kopie der Liste zurück? Dann passt Dein Iteratortupel (begin,end) nicht zusammen, und DU wirst eine entsprechende Assertion bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169128</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:48:45 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Wird mit jedem Aufruf von getConnectID() eine neue Liste angefordert, für die der Iterator nicht mehr gilt?</p>
</blockquote>
<p>Ja</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169129</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:49:47 GMT]]></title><description><![CDATA[<p>Möglicherweise hast du bei Möglichkeit 2 2 temporäre Listen, die natürlich unterschiedliche begin(), end() addressen haben. Probier mal den return type von CONECT::getConnectionID() auf const std::list&lt;int&gt;&amp; zuändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169130</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:51:48 GMT]]></title><description><![CDATA[<p>Ja, ich gebe eine Kopie der Liste zurück. Ich habe schon vermutet, dass das Problem verursacht.</p>
<p>Also passen die Iteratorentupel nicht zusammen?<br />
Was sollte das für Auswirkungen haben?<br />
Irgendwie hätte ich vermutet, dass das Programm dann wenigstens bis zum Ende der Liste durchiteriert, weil iter.begin() und end() nie übereinstimmen und dann irgendwas seltsames tut.<br />
Aber es bricht schon beim ersten Schleifendurchlauf ab.</p>
<p>Und was bedeutet , dass ICH eine Assertion bekomme?<br />
ich kenne assert() aber was Assertion bekommen bedeutet weiß ich leider nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169131</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:51:48 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 13:58:33 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Ja, ich gebe eine Kopie der Liste zurück. Ich habe schon vermutet, dass das Problem verursacht.</p>
<p>Also passen die Iteratorentupel nicht zusammen?<br />
Was sollte das für Auswirkungen haben?<br />
Irgendwie hätte ich vermutet, dass das Programm dann wenigstens bis zum Ende der Liste durchiteriert, weil iter.begin() und end() nie übereinstimmen und dann irgendwas seltsames tut.<br />
Aber es bricht schon beim ersten Schleifendurchlauf ab.</p>
<p>Und was bedeutet , dass ICH eine Assertion bekomme?<br />
ich kenne assert() aber was Assertion bekommen bedeutet weiß ich leider nicht.</p>
</blockquote>
<p>Iteratoren sind häufig so implementiert, dass sie im Debugmodus eine Assertion auslösen, wenn irgendetwas nicht zusammen passt.<br />
In Deinem Fall merkt beim Vergleich, dass die Iteratoren nicht vom gleichen Objekt kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169133</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 13:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:03:52 GMT]]></title><description><![CDATA[<p>Ok, danke soweit. Ich habe noch 2 abschließende Fragen dazu:</p>
<p>1. Wie viele Kopien von der Liste werden tatsächlich erstellt?</p>
<p>Wenn die Bedingung</p>
<pre><code class="language-cpp">iter != connections[i].getConnectID().end();
</code></pre>
<p>durchgeführt wird, wird da in JEDEM Durchlauf eine neue Kopie erzeugt?<br />
(Wenn man von eventuellen Compiler-Optimierungen absieht)</p>
<p>2. Ist es vom Design her besser Referenzen zurückzugeben?</p>
<p>Ich habe bisher überall Kopien zurückgegeben, aus ANgst dass ich mir meine Einträge versehentlich zerschieße, aber vlt ist es doch günstiger, wenn ich mir den direkten Zugriff ermögliche?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169135</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:03:52 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:06:40 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Ich habe bisher überall Kopien zurückgegeben, aus ANgst dass ich mir meine Einträge versehentlich zerschieße, aber vlt ist es doch günstiger, wenn ich mir den direkten Zugriff ermögliche?</p>
</blockquote>
<p>du kannst auch konstante Referenzen zurückgeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169136</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:07:29 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Und was bedeutet , dass ICH eine Assertion bekomme?<br />
ich kenne assert() aber was Assertion bekommen bedeutet weiß ich leider nicht.</p>
</blockquote>
<p>Eine Assertion ist eine Behauptung, die man über den Programmzustand an einer bestimmten Stelle macht, mit dem Ziel, dass man über eine falsche Annahme durch einen Abbruch mit Fehlermeldung informiert wird. Das ist dann eine fehlgeschlagene Assertion, schlampig auch einfach nur Assertion genannt. Klarer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169137</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:15:59 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>shisha schrieb:</p>
<blockquote>
<p>Ich habe bisher überall Kopien zurückgegeben, aus ANgst dass ich mir meine Einträge versehentlich zerschieße, aber vlt ist es doch günstiger, wenn ich mir den direkten Zugriff ermögliche?</p>
</blockquote>
<p>du kannst auch konstante Referenzen zurückgeben...</p>
</blockquote>
<p>Eigentlich ist es auch gut, Kopien zurückzugeben.<br />
Du kannst es zum Beispiel einfach so machen, wie in Deinem funktionierenden Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169141</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:17:26 GMT]]></title><description><![CDATA[<blockquote>
<p>du kannst auch konstante Referenzen zurückgeben...</p>
</blockquote>
<p>Ist das hier Korrekt?</p>
<pre><code class="language-cpp">const std::list&lt;int&gt;&amp; CONECT::getConnectionID() const
</code></pre>
<p>Habe mit const auch so meine Probleme ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169142</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:20:24 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<blockquote>
<p>du kannst auch konstante Referenzen zurückgeben...</p>
</blockquote>
<p>Ist das hier Korrekt?</p>
<pre><code class="language-cpp">const std::list&lt;int&gt;&amp; CONECT::getConnectionID() const
</code></pre>
<p>Habe mit const auch so meine Probleme ^^</p>
</blockquote>
<p>Das hängt davon ab, ob das Listenobjekt, das da referenziert wird, nach dem Funktionsaufruf gültig bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169143</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:27:52 GMT]]></title><description><![CDATA[<p>Direkt nach dem Aufruf ist es normal noch gültig.<br />
Ist es meine Aufgabe so was zu verhindern ?</p>
<pre><code class="language-cpp">instanz = new KLASSENTYP();
list&lt;int&gt; l = instanz.getConnectionID();
delete instanz;
beliebiger zugriff auf l
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2169145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169145</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:32:59 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Direkt nach dem Aufruf ist es normal noch gültig.<br />
Ist es meine Aufgabe so was zu verhindern ?</p>
<pre><code class="language-cpp">instanz = new KLASSENTYP();
list&lt;int&gt; l = instanz.getConnectionID();
delete instanz;
beliebiger zugriff auf l
</code></pre>
</blockquote>
<p>Da ist alles okay. l ist eine Kopie dessen, was zurückgegeben wird.<br />
Sowas ist viel schlimmer:</p>
<pre><code class="language-cpp">list&lt;int&gt;::iterator i;
{
   KLASSENTYP instanz;
   i = instanz.getConnectionID().begin();
}
int crash = *i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2169146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169146</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:32:59 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:33:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Da ist alles okay. l ist eine Kopie dessen, was zurückgegeben wird.</p>
</blockquote>
<p>Hmm, wenn ich mir das wieder in meinem Iterator-Beispiel reindenke, hätte ich also auch mit dem Ändern des Rückgabetyps auf eine Referenz doch immer noch das Problem dass eine Kopie erstellt wird von der Liste und die Iteratoren nicht zusammenpassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169148</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:37:15 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<blockquote>
<p>Da ist alles okay. l ist eine Kopie dessen, was zurückgegeben wird.</p>
</blockquote>
<p>Hmm, wenn ich mir das wieder in meinem Iterator-Beispiel reindenke, hätte ich also auch mit dem Ändern des Rückgabetyps auf eine Referenz doch immer noch das Problem dass eine Kopie erstellt wird von der Liste und die Iteratoren nicht zusammenpassen?</p>
</blockquote>
<p>Ohne Dir zu nahe treten zu wollen:<br />
Da Du das mit den Gültigkeiten anscheinend noch nicht so ganz durchdrungen hast, bleibe bei Kopien und mache es so, wie in Deinem ersten Beispiel.<br />
Btw. ist hier nicht der Rückgabewert selbst eine Kopie, sondern l.<br />
In Deinem Beispiel wäre eher das hier problematisch:</p>
<pre><code class="language-cpp">instanz = new KLASSENTYP();
list&lt;int&gt; const &amp; l = instanz.getConnectionID(); //l ist jetzt keine Kopie
delete instanz;
beliebiger zugriff auf l
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2169150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169150</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator oder Listenproblem on Tue, 17 Jan 2012 14:43:13 GMT]]></title><description><![CDATA[<p>Danke vorerst mal.</p>
<p>Ich habe schon Jahre nichts mehr mit C++ gemacht und habe das bisschen, dass ich mal konnte auch schon fast vergessen.</p>
<p>Musste gerade nochmal &quot;Refenz&quot; nachschauen um wieder festzustellen, dass Referenzen schon als solche deklariert werden müssen und dass der kritische Aufruf, den ich meinte so aussehen müsste, wie eben von dir gepostet.</p>
<p>Es kann mir im Moment durchaus passieren, dass ich den einen oder anderen Anfängerfehler begehe und es nicht mal mehr merke.</p>
<p>Ich hoffe mein nächstes Problem lässt nun auf sich warten <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/2169152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169152</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 17 Jan 2012 14:43:13 GMT</pubDate></item></channel></rss>