<?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[end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert?]]></title><description><![CDATA[<p>Hi volks!<br />
Ich habe da eine frage zu der &quot;rend&quot; funktion bei sequentiellen containern.<br />
In der doku habe ich folgendes entdeckt:</p>
<p>documentation schrieb:</p>
<blockquote>
<p>The member function returns a reverse iterator that points at the <strong>first</strong> element of the sequence</p>
</blockquote>
<p>also stelle ich mir das bei einer sequenz</p>
<pre><code>[A]&lt;-&gt;[B]&lt;-&gt;[C]&lt;-&gt;[-]
// [-] ist das garantiert leere element nach dem ende des arrays
// (listen etc. lass ich erstma weg, nur zum vector jetzt)
</code></pre>
<p>etwa so vor: (rend liefert A zurück)</p>
<pre><code>[C]&lt;-&gt;[B]&lt;-&gt;[A]&lt;-&gt;[-]
            |
            |
            rend()
</code></pre>
<p>in der dritten auflage von &quot;The c++ programming language&quot; sehe ich jetzt aber etwas, was ich nicht verstehe:</p>
<pre><code>[C]&lt;-&gt;[B]&lt;-&gt;[A]&lt;-&gt;[-]
|                   |
|                   |
rbegin()           rend()
</code></pre>
<p>laut einer skizze aus dem kapitel 16.3.2 (wer das tolle büchlein hat, kanns gerne nachschlagen <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="🙄"
    /> ) zeigt jetzt aber die &quot;rend()&quot; funktion auf ein leeres element <strong>vor</strong> dem array?</p>
<p>Fragen:<br />
0) Welche version stimmt denn jetzt?</p>
<ol>
<li>
<p>soll ich da als iterator einen zeiger auf das -1. element des arrays zurückgeben? (irgendwas sagt mir, dass ich das nicht tun darf, weil sogar der datentyp für das indizieren der arrays size_t als <strong>unsigned</strong> int definiert ist) *ungutes gefühl in der magengegend* <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>
</li>
<li>
<p>wird es garantiert, dass vor dem ersten element nichts ist, was man versehentlich kaputtmachen könnte, wenn ich das array mit &quot;new&quot; erschaffe?</p>
</li>
<li>
<p>soll ich das buch vielleicht zuerst mal in die dunkle ecke schmeissen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> mir ist nähmlich etwas aufgefallen: seit ich es mir durchlese, mache ich mir nur noch sorgen über den guten stil, statt zu programmieren^^ :p</p>
</li>
</ol>
<p>najo, danke allen im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/178303/end-und-rend-wo-wird-quot-leere-quot-garantiert</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 20:21:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178303.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Apr 2007 09:35:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 09:37:28 GMT]]></title><description><![CDATA[<p>Hi volks!<br />
Ich habe da eine frage zu der &quot;rend&quot; funktion bei sequentiellen containern.<br />
In der doku habe ich folgendes entdeckt:</p>
<p>documentation schrieb:</p>
<blockquote>
<p>The member function returns a reverse iterator that points at the <strong>first</strong> element of the sequence</p>
</blockquote>
<p>also stelle ich mir das bei einer sequenz</p>
<pre><code>[A]&lt;-&gt;[B]&lt;-&gt;[C]&lt;-&gt;[-]
// [-] ist das garantiert leere element nach dem ende des arrays
// (listen etc. lass ich erstma weg, nur zum vector jetzt)
</code></pre>
<p>etwa so vor: (rend liefert A zurück)</p>
<pre><code>[C]&lt;-&gt;[B]&lt;-&gt;[A]&lt;-&gt;[-]
            |
            |
            rend()
</code></pre>
<p>in der dritten auflage von &quot;The c++ programming language&quot; sehe ich jetzt aber etwas, was ich nicht verstehe:</p>
<pre><code>[C]&lt;-&gt;[B]&lt;-&gt;[A]&lt;-&gt;[-]
|                   |
|                   |
rbegin()           rend()
</code></pre>
<p>laut einer skizze aus dem kapitel 16.3.2 (wer das tolle büchlein hat, kanns gerne nachschlagen <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="🙄"
    /> ) zeigt jetzt aber die &quot;rend()&quot; funktion auf ein leeres element <strong>vor</strong> dem array?</p>
<p>Fragen:<br />
0) Welche version stimmt denn jetzt?</p>
<ol>
<li>
<p>soll ich da als iterator einen zeiger auf das -1. element des arrays zurückgeben? (irgendwas sagt mir, dass ich das nicht tun darf, weil sogar der datentyp für das indizieren der arrays size_t als <strong>unsigned</strong> int definiert ist) *ungutes gefühl in der magengegend* <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>
</li>
<li>
<p>wird es garantiert, dass vor dem ersten element nichts ist, was man versehentlich kaputtmachen könnte, wenn ich das array mit &quot;new&quot; erschaffe?</p>
</li>
<li>
<p>soll ich das buch vielleicht zuerst mal in die dunkle ecke schmeissen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> mir ist nähmlich etwas aufgefallen: seit ich es mir durchlese, mache ich mir nur noch sorgen über den guten stil, statt zu programmieren^^ :p</p>
</li>
</ol>
<p>najo, danke allen im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262753</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 10 Apr 2007 09:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 09:52:26 GMT]]></title><description><![CDATA[<ol start="0">
<li>
<p>rend() zeigt physikalisch auf das erste Element des Array, aber logisch auf das nicht existente Element davor (das liegt daran, daß eine Position VOR dem ersten Element nicht definiert ist).</p>
</li>
<li>
<p>Du darfst keine singulären Iteratoren dereferenzieren, weder das normale end() noch rend().</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1262767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262767</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Apr 2007 09:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 10:06:13 GMT]]></title><description><![CDATA[<p>da ist mir aber immer noch nicht alles klar: was heißt &quot;logisch&quot;?</p>
<pre><code class="language-cpp">for(rev_iter=rbegin(); rev_iter!=rend(); rev_iter++){}
</code></pre>
<p>wenn rend jetzt physikalisch die adresse von [A] liefert, dann werden die operationen im {}-block nicht für alle elemente der folge durchgeführt, sondern nur für [C] und [B], bei [A] wird es aber schon abgebrochen. <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>
<pre><code class="language-cpp">(rev_iter!=rend()) //liefert für [A] false? =&gt; abbruch! :( ?
</code></pre>
<p>Das ist doch irgendwie schräg, das kann doch nicht sein, dass wenn ich die sequenz in die normale richtung durchlaufe, ein element mehr anspreche, als wenn ich genau dasselbe in der anderen reihenfolge mache <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>und dann noch eine frage:</p>
<blockquote>
<p>Du darfst keine singulären Iteratoren dereferenzieren</p>
</blockquote>
<p>&quot;darf nicht &quot; oder &quot;kann nicht&quot;? durch welche sprachlichen elemente wird es dem benutzer des containers denn verboten? [krig ich da compilierfehler?]</p>
<p>thx schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262789</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 10 Apr 2007 10:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 10:16:33 GMT]]></title><description><![CDATA[<p>Andrey schrieb:</p>
<blockquote>
<p>da ist mir aber immer noch nicht alles klar: was heißt &quot;logisch&quot;?</p>
<pre><code class="language-cpp">for(rev_iter=rbegin(); rev_iter!=rend(); rev_iter++){}
</code></pre>
<p>wenn rend jetzt physikalisch die adresse von [A] liefert, dann werden die operationen im {}-block nicht für alle elemente der folge durchgeführt, sondern nur für [C] und [B], bei [A] wird es aber schon abgebrochen. <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>
<pre><code class="language-cpp">(rev_iter!=rend()) //liefert für [A] false? =&gt; abbruch! :( ?
</code></pre>
<p>Das ist doch irgendwie schräg, das kann doch nicht sein, dass wenn ich die sequenz in die normale richtung durchlaufe, ein element mehr anspreche, als wenn ich genau dasselbe in der anderen reihenfolge mache <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>
</blockquote>
<p>Es gibt kein Element &quot;vor dem Anfang&quot; in einem Container. Deshalb zeigt der Reverse-Iterator physikalisch nicht auf das Objekt, das er logisch darstellt. Wenn er dereferenziert wird, liefert er das Element vor seiner physikalischen Position:</p>
<p>Das mußt du dir ungefähr so vorstellen:</p>
<pre><code>[A] - [B] - [C] - [D] - [-]
 ^--+                 ^-----+
   rend()                  rbegin()
</code></pre>
<blockquote>
<p>und dann noch eine frage:</p>
<blockquote>
<p>Du darfst keine singulären Iteratoren dereferenzieren</p>
</blockquote>
<p>&quot;darf nicht &quot; oder &quot;kann nicht&quot;? durch welche sprachlichen elemente wird es dem benutzer des containers denn verboten? [krig ich da compilierfehler?]</p>
</blockquote>
<p>DARF NICHT - im Sinne von &quot;wenn du's doch machst, landest du im siebten Kreis der Hölle&quot; (aka 'undefines Behaviour')</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262797</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Apr 2007 10:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 10:18:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int arr[5];
int* iter = arr;
int* end = arr + 6;
while(iter != end)
{
   do_some(*iter);
   iter++;
}

do_some(*iter); //hier zeigt iter auf arr[5] -&gt; außerhalb des Arrays und somit kracht es.
</code></pre>
<p>An dem Beispiel sollte das vielleicht anschaulich werden, wie teratoren funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262800</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Tue, 10 Apr 2007 10:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 11:34:03 GMT]]></title><description><![CDATA[<p>und rückwärts?</p>
<pre><code class="language-cpp">int a[3]={1,2,3};
    int* iter_rbegin=&amp;a[2];
    int* iter_rend=&amp;a[-1];	
    //physikalisch sowie logisch schon &quot;im siebten kreis der hölle&quot;
    //bloß nicht dereferenzieren!!!

    for(int* i=iter_rbegin; i!=iter_rend; i--){
	std::cout&lt;&lt;*i&lt;&lt;std::endl;
    }
</code></pre>
<p>ja, hier klapps... aber physikalisch, sowie logisch zeigt das ding wirklich irgendwohin ins leere...</p>
<p>edit: bzw. nicht &quot;irgendwohin ins leere&quot; sondern nur &quot;iregndwohin&quot;, das ist ja das problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>ich raff den unterschied zwischen dem &quot;logisch&quot; und &quot;physikalisch&quot; immer noch nich <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262880</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 10 Apr 2007 11:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 11:45:54 GMT]]></title><description><![CDATA[<p>Da solltest du dir vielleicht mal die reverse_iterator-Klasse(n) ansehen, vielleicht wird dir der Unterschied dann klar <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>Nochmal langsam: Physikalisch zeigt rend() auf das erste Element des Containers und rbegin() hinter das letzte, logisch verwendet jeder Reverse-Iterator den Wert, der VOR seiner aktuellen Position steht (also rbegin() das letzte Element, rend() undefinierte Speicherbereiche &quot;vor&quot; dem ersten Element).<br />
(ein Iterator &quot;hinter&quot; dem Containerinhalt ist laut Standard erlaubt (nennt sich end()), ein Iterator &quot;vor&quot; dem Containerinhalt ist nicht definiert - deshalb gibt es bei einem Reverse-Iterator diese Unterscheidung zwischen physikalischer und logischer Position.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262899</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Apr 2007 11:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 12:01:03 GMT]]></title><description><![CDATA[<p>aaaaaaaaaaaaaaaaaaaaaaaaaaaachhhhhsooooooooooooo!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
okay, na dann sry für die vielen überflüssigen fragen, mir fehlte es halt n bissl an &quot;allgemeinbildung&quot; was die reverse_iteratoren angeht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
danke schön! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262915</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 12:37:48 GMT]]></title><description><![CDATA[<blockquote>
<p>(ein Iterator &quot;hinter&quot; dem Containerinhalt ist laut Standard erlaubt (nennt sich end())</p>
</blockquote>
<p>jop, nur als ergänzung: der standard garantiert auch für arrays (also nicht nur bei iteratoren), dass es eine gültige operation ist die adresse des 1. elements nach dem letzten element eines arrays zu bestimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262952</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 15:24:58 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<blockquote>
<p>(ein Iterator &quot;hinter&quot; dem Containerinhalt ist laut Standard erlaubt (nennt sich end())</p>
</blockquote>
<p>jop, nur als ergänzung: der standard garantiert auch für arrays (also nicht nur bei iteratoren), dass es eine gültige operation ist die adresse des 1. elements nach dem letzten element eines arrays zu bestimmen.</p>
</blockquote>
<p>Vorläufig - bis zur nächsten Version - aber nur per Pointeraddition; also</p>
<pre><code class="language-cpp">int a[10];
int* end = a + 10;
</code></pre>
<p>dagegen nicht</p>
<pre><code class="language-cpp">int* end = &amp;a[ 10 ];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1263078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1263078</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 10 Apr 2007 15:24:58 GMT</pubDate></item><item><title><![CDATA[Reply to end() und rend():  wo wird &amp;quot;leere&amp;quot; garantiert? on Tue, 10 Apr 2007 15:36:47 GMT]]></title><description><![CDATA[<p>im letzten code-schnipsel habe ich aber auch sowas mit</p>
<pre><code class="language-cpp">int* rend=&amp;a[-1];
</code></pre>
<p>und es hat auch funktioniert... liegt es daran, dass ich einen total veralteten compiler verwende?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1263095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1263095</guid><dc:creator><![CDATA[Andrey]]></dc:creator><pubDate>Tue, 10 Apr 2007 15:36:47 GMT</pubDate></item></channel></rss>