<?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[Kurze Frage zur Gültigkeit vom Increment von Iteratoren]]></title><description><![CDATA[<p>Hallo, ich hab ne schnelle frage, ob das eine gültige Operation ist, oder ob das undefiniertes Verhalten nach sich führt:</p>
<pre><code class="language-cpp">std::map&lt;int, int&gt; m;
m[0]=0; //m.size() == 1

std::map&lt;int, int&gt; iterator it = m.begin();
++it;++it; //Erlaubt und definiert?
if(m.size() &gt; 2) std::cout&lt;&lt;it-&gt;second;
</code></pre>
<p>&quot;it&quot; zeigt ja erst auf m.end() und dann hinter m.end(), wird aber niemals dereferenziert. Ist es dann erlaubt/definiert, den iterator über end() hinaus zu inkrementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279139/kurze-frage-zur-gültigkeit-vom-increment-von-iteratoren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 18:17:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279139.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Dec 2010 19:55:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 19:55:48 GMT]]></title><description><![CDATA[<p>Hallo, ich hab ne schnelle frage, ob das eine gültige Operation ist, oder ob das undefiniertes Verhalten nach sich führt:</p>
<pre><code class="language-cpp">std::map&lt;int, int&gt; m;
m[0]=0; //m.size() == 1

std::map&lt;int, int&gt; iterator it = m.begin();
++it;++it; //Erlaubt und definiert?
if(m.size() &gt; 2) std::cout&lt;&lt;it-&gt;second;
</code></pre>
<p>&quot;it&quot; zeigt ja erst auf m.end() und dann hinter m.end(), wird aber niemals dereferenziert. Ist es dann erlaubt/definiert, den iterator über end() hinaus zu inkrementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996839</guid><dc:creator><![CDATA[IncIt]]></dc:creator><pubDate>Sun, 19 Dec 2010 19:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 20:09:14 GMT]]></title><description><![CDATA[<p>Ich denke, dass das Verhalten undefiniert ist, sobald du end() überschreitest. Da sich das aber gut duch entsprechende Abfragen vermeiden lässt, solltest du nie in eine solche Situation geraten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996852</guid><dc:creator><![CDATA[kljljkljk]]></dc:creator><pubDate>Sun, 19 Dec 2010 20:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 20:10:22 GMT]]></title><description><![CDATA[<p>IncIt schrieb:</p>
<blockquote>
<p>Ist es dann erlaubt/definiert, den iterator über end() hinaus zu inkrementieren?</p>
</blockquote>
<p>Nein. Gibt es eine Situation, in der du das tun müsstest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996854</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 20:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 20:18:08 GMT]]></title><description><![CDATA[<p>Ich habe hier so einen Code (m hat mind. 1 Element):</p>
<pre><code class="language-cpp">std::map&lt;tile, int&gt;::iterator it = m.begin();
std::map&lt;tile, int&gt;::iterator it1=it; ++it1;
std::map&lt;tile, int&gt;::iterator it2=it1; ++it2;
std::map&lt;tile, int&gt;::iterator it3=it2; ++it3;
return (
        (it-&gt;second==2 &amp;&amp; s==4)  ||
        (it-&gt;second==2 &amp;&amp; s==2)  ||
        (it-&gt;second==3 &amp;&amp; s==3)  ||
        (it-&gt;second==3 &amp;&amp; s==2)  ||
        (s==3 &amp;&amp; it1-&gt;second==3) ||
        (s==3 &amp;&amp; it2-&gt;second==3) ||
        (s==4 &amp;&amp; it3-&gt;second==2)
);
</code></pre>
<p>Wäre es also besser, ich würde it1 zB so zuweisen?</p>
<pre><code class="language-cpp">std::map&lt;tile, int&gt;::iterator it = m.begin();
std::map&lt;tile, int&gt;::iterator it1 = it;
if(s &gt; 1)
    ++it1;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1996865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996865</guid><dc:creator><![CDATA[IncIt]]></dc:creator><pubDate>Sun, 19 Dec 2010 20:18:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 20:19:26 GMT]]></title><description><![CDATA[<p>edit: s == unsigned s = m.size()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996867</guid><dc:creator><![CDATA[IncIt]]></dc:creator><pubDate>Sun, 19 Dec 2010 20:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Sun, 19 Dec 2010 21:21:46 GMT]]></title><description><![CDATA[<p>Wenn, dann sowas:</p>
<pre><code class="language-cpp">std::map&lt;tile, int&gt;::iterator it = m.begin();
return ((it-&gt;second==2 &amp;&amp; s==4)          ||
        (it-&gt;second==2 &amp;&amp; s==2)          ||
        (it-&gt;second==3 &amp;&amp; s==3)          ||
        (it-&gt;second==3 &amp;&amp; s==2)          ||
        ++it == m.end() || it-&gt;second==3 || // sobald eine Bedingung zutrifft,
        ++it == m.end() || it-&gt;second==3 || // wird die Orgie beendet.  Alles
        ++it == m.end() || it-&gt;second==2  ) // wird schön der Reihe nach behandelt
);
</code></pre>
<p>Denn: Bei einem map-Iterator wird das hinausnavigieren über die Grenzen nicht funktionieren. Der braucht einen Zeiger um das nächste Element zu finden.<br />
Bei einem <code>std::vector&lt;&gt;</code> ist es (in der Praxis) definiert, weil der Iterator nichts anderes als ein Pointer ist.</p>
<p>Dein Block aus hardgecodeten Zahlen gefällt mir ganz und gar nicht, das löst man besser allgemeiner.</p>
<p>BTW: Wenn du einen Iterator <code>it</code> um <code>n</code> Elemente verschieben willst, nimmt man <code>std::advance(it, n)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996900</guid><dc:creator><![CDATA[eastl]]></dc:creator><pubDate>Sun, 19 Dec 2010 21:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zur Gültigkeit vom Increment von Iteratoren on Mon, 20 Dec 2010 08:23:41 GMT]]></title><description><![CDATA[<p>IncIt schrieb:</p>
<blockquote>
<p>&quot;it&quot; zeigt ja erst auf m.end() und dann hinter m.end(), wird aber niemals dereferenziert. Ist es dann erlaubt/definiert, den iterator über end() hinaus zu inkrementieren?</p>
</blockquote>
<p>Ganz einfach: Jedes mal, wenn ein Iterator <em>vor</em> <code>c.begin()</code> oder <em>hinter</em> <code>c.end()</code> zeigt, hast Du UB. Wenn man Pech hat, geht z.B. das Inkrementieren/Dekrementieren in die Hose.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1997003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1997003</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 20 Dec 2010 08:23:41 GMT</pubDate></item></channel></rss>