<?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[Iteratoren als L-Wert]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem bei der Benutzung von Iteratoren<br />
unter LINUX (g++ Compiler). Auszug aus meinem Source-Code:</p>
<pre><code>1) vector&lt;unsigned int&gt; LEAF;
2) set&lt;unsigned int, less&lt;unsigned int&gt; &gt;::SetA;
3) set&lt;unsigned int, less&lt;unsigned int&gt; &gt;::iterator i;
4)
5) for (i=SetA.begin(); i!=SetA.end(); ++i) 
6) {
7) 		[b]*(i) = LEAF[*(i)];[/b]
8)		Ki.push_back(*(i));
9) }
</code></pre>
<p>Der Compiler bemängelt, dass es sich bei <strong>i</strong> nicht um einen L-Wert handelt. Dementsprechend Zeile erhalte ich in Zeile 7) eine Fehlermeldung.</p>
<p>(Unter <strong>MS Visual C++ .net</strong> akzeptiert der Compiler meinen Code.)</p>
<p>Kann mir dabei jmd. helfen?</p>
<p>Besten Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125126/iteratoren-als-l-wert</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 05:28:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125126.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Nov 2005 15:27:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iteratoren als L-Wert on Thu, 03 Nov 2005 15:27:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem bei der Benutzung von Iteratoren<br />
unter LINUX (g++ Compiler). Auszug aus meinem Source-Code:</p>
<pre><code>1) vector&lt;unsigned int&gt; LEAF;
2) set&lt;unsigned int, less&lt;unsigned int&gt; &gt;::SetA;
3) set&lt;unsigned int, less&lt;unsigned int&gt; &gt;::iterator i;
4)
5) for (i=SetA.begin(); i!=SetA.end(); ++i) 
6) {
7) 		[b]*(i) = LEAF[*(i)];[/b]
8)		Ki.push_back(*(i));
9) }
</code></pre>
<p>Der Compiler bemängelt, dass es sich bei <strong>i</strong> nicht um einen L-Wert handelt. Dementsprechend Zeile erhalte ich in Zeile 7) eine Fehlermeldung.</p>
<p>(Unter <strong>MS Visual C++ .net</strong> akzeptiert der Compiler meinen Code.)</p>
<p>Kann mir dabei jmd. helfen?</p>
<p>Besten Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907478</guid><dc:creator><![CDATA[victim49]]></dc:creator><pubDate>Thu, 03 Nov 2005 15:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren als L-Wert on Thu, 03 Nov 2005 16:29:36 GMT]]></title><description><![CDATA[<p>Jaja, die set-Iteratoren ... wenn ich grad nicht was ziemlich durcheinanderbringe ist es dem Compiler freigestellt, ob set::iterator sich wie ein const_iterator verhält oder nicht. In deinem Fall ist es IMO auch besser, dass der g++ das nicht macht, denn die bemängelte Zuweisung würde ziemlich sicher die Sortierung des Sets durcheinanderbringen und damit die Konsistenz des sets zerstören.</p>
<p>Richtig wäre, das zu ändernde Element aus dem set zu entfernen und dann das neue einzufügen.</p>
<p>BTW, das nächste mal solltest du den tatsächlichen Code (eine deiner Deklarationen ist syntaktisch falsch) und die tatsächliche Fehlermeldung (nicht i soll ein lvalue sein, sondern *i) posten.</p>
<p>Noch zwei Anmerkungen zum Stil:<br />
1. Ist die Vergleichsfunktion beim set&lt;T&gt; standardmäßig less&lt;T&gt;, es hat also keinen Mehrwert, das extra dazuzuschreiben, es verschlechtert eher die Lesbarkeit.<br />
2. Eine Variable einzuklammern hat keinen Sinn. Statt *(i) schreibst du besser *i.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907522</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 03 Nov 2005 16:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren als L-Wert on Thu, 03 Nov 2005 19:00:00 GMT]]></title><description><![CDATA[<p>Hallo Bashar,</p>
<p>vielen Dank für die Hinweise.</p>
<p>ich habe die Zeile</p>
<pre><code class="language-cpp">*(i) = LEAF[*(i)];
</code></pre>
<p>ersetzt durch</p>
<pre><code class="language-cpp">SetA.erase(i);
SetA.insert(LEAF[*i]);
</code></pre>
<p>Durch die Methode <strong>erase(i)</strong> wird doch das Element, auf das<br />
i zeigt gelöscht. Bei einem Container set ist es also so, dass man nur<br />
einfügen und löschen kann, die Sortierung ist läuft automatisch ab. Ist das korrekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907637</guid><dc:creator><![CDATA[victim49]]></dc:creator><pubDate>Thu, 03 Nov 2005 19:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren als L-Wert on Thu, 03 Nov 2005 21:47:04 GMT]]></title><description><![CDATA[<p>victim49 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">SetA.erase(i);
SetA.insert(LEAF[*i]);
</code></pre>
<p>Durch die Methode <strong>erase(i)</strong> wird doch das Element, auf das<br />
i zeigt gelöscht.</p>
</blockquote>
<p>Durch das ersae( i ) wird nicht nur das Element im Container gelöscht, sondern auch der Iterator 'i' invalid. Ist ja auch irgendwie logisch, es ist ja nichts mehr da, worauf 'i' zeigen kann. Einen invaliden Iterator darf man weder dereferenzieren - also</p>
<pre><code class="language-cpp">// 'i' sei invalid
    SetA.insert( LEAF[*i] ); // *i kann nur schiefgehen
</code></pre>
<p>noch darf man ihn inkrementieren.</p>
<pre><code class="language-cpp">for (i=SetA.begin(); i!=SetA.end(); ++i)
    {
        SetA.erase( i ); // 'i' wird invalid
        // ...
    } // am Ende wird i in der for-Schleife inkrementiert (s.o)
</code></pre>
<p>auch hier ist nicht definiert was geschieht und meistens geht es schief.</p>
<p>victim49 schrieb:</p>
<blockquote>
<p>Bei einem Container set ist es also so, dass man nur<br />
einfügen und löschen kann, die Sortierung ist läuft automatisch ab. Ist das korrekt?</p>
</blockquote>
<p>Ja; kann man so sagen. Man kann auch einzelne Elemente oder einen Bereich (von, bis) von Elementen relativ schnell finden.</p>
<p>Was soll Dein Programm eigentlich tun?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907720</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 03 Nov 2005 21:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren als L-Wert on Fri, 04 Nov 2005 09:28:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">SetA.erase(i);
SetA.insert(LEAF[*i]);
</code></pre>
<p>Garnicht gut. Du iterierst über ein Set, dass Du gleichzeitig veränderst. Durch die automatische Einsortierung kann es passieren, dass Du über Elemente mehrfach iterierst, was von merkwürdigen Effekten bis zu Abstürzen führen kann.</p>
<p>Die bessere Lösung wäre, in ein neues Set einzufügen und dann hinterher das Alte mit dem Neuen zu swappen. Eine Ausnahme wäre höchstens, dass das Set so riesig ist, dass der temporäre, doppelte Speicherbedarf für das Set nicht tragbar ist (ab ein paar MB Speicherverbrauch kann man da vielleicht diskutieren ;))</p>
<p>Zum eigentlichen Problem:</p>
<p>Dass normale Set-Iteratoren const sein können oder nicht, ist als 'defect' im Standard bekannt. Das Problem ist, dass Du all die Kriterien des Schlüssels nicht ändern darfst, die die Sortierung beeinflussen (das Set bekommt das nicht mit und hat so internen Datenmüll) - aber auch dass es viele Parameter am Schlüssel geben kann, die die Sortierung nicht beeinflussen und meist sinnvoll geändert werden können. Es gibt Implementierungen die meinen, dass man die Schlüssel lieber const machen sollte um Fehler von vornherein zu vermeiden, und andere die Schlüssel modifizierbar lassen in der Annahme, dass der Anwender keinen Unfug damit treibt.</p>
<p>Sofern Du dir ganz sicher bist, dass Du die Sortier-Reihenfolge des Sets nicht änderst, und es auch keine andere pratikable Möglichkeit gibt, kannst Du das const vom Element wegcasten.</p>
<p>Lustiger Weise sind die Schlüssel in einer Map immer const <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/907799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907799</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 04 Nov 2005 09:28:51 GMT</pubDate></item></channel></rss>