<?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[STL-Iteratoren casten]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich arbeite grad viel mit den STL-Iteratoren und hab mal eine Frage:<br />
Angenommen, ich habe einen <em>string::iterator</em>, der &quot;zeigt&quot; ja quasi auf ein Element (char) im String. Ich meine auch mal gelesen zu haben, dass in den &quot;normalen&quot; Containern wie string und vector alle Elemente hintereinander abgelegt werden - soweit der Compiler std-conform ist.<br />
Deshalb ist es ja auch möglich, jenen String-Iterator in einen <em>char</em>* zu casten. Ist aber nicht besonders schön:</p>
<pre><code class="language-cpp">string::iterator s;
char* str2 = (char*) &amp;(*(is));
</code></pre>
<p>Gibts da eine andere Möglichkeit, oder sollte man das grundsätzlich vermeiden? Ich hab irgendwie das Gefühl, dass ich das an einigen Stellen brauche, von daher wärs schön <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Natürlich auch analog vector&lt;xy&gt;::iterator <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187254/stl-iteratoren-casten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 15:06:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187254.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jul 2007 16:39:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 16:39:59 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich arbeite grad viel mit den STL-Iteratoren und hab mal eine Frage:<br />
Angenommen, ich habe einen <em>string::iterator</em>, der &quot;zeigt&quot; ja quasi auf ein Element (char) im String. Ich meine auch mal gelesen zu haben, dass in den &quot;normalen&quot; Containern wie string und vector alle Elemente hintereinander abgelegt werden - soweit der Compiler std-conform ist.<br />
Deshalb ist es ja auch möglich, jenen String-Iterator in einen <em>char</em>* zu casten. Ist aber nicht besonders schön:</p>
<pre><code class="language-cpp">string::iterator s;
char* str2 = (char*) &amp;(*(is));
</code></pre>
<p>Gibts da eine andere Möglichkeit, oder sollte man das grundsätzlich vermeiden? Ich hab irgendwie das Gefühl, dass ich das an einigen Stellen brauche, von daher wärs schön <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Natürlich auch analog vector&lt;xy&gt;::iterator <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327359</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 17 Jul 2007 16:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 17:13:53 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Hi!</p>
<p>Ich arbeite grad viel mit den STL-Iteratoren und hab mal eine Frage:<br />
Angenommen, ich habe einen <em>string::iterator</em>, der &quot;zeigt&quot; ja quasi auf ein Element (char) im String. Ich meine auch mal gelesen zu haben, dass in den &quot;normalen&quot; Containern wie string und vector alle Elemente hintereinander abgelegt werden - soweit der Compiler std-conform ist.</p>
</blockquote>
<p>vector: ja; string: nein (auch wenn es wohl keine bestehende Implementation kaputtmachte, wenn man das auch für string festlegte).</p>
<blockquote>
<p>Deshalb ist es ja auch möglich, jenen String-Iterator in einen <em>char</em>* zu casten. Ist aber nicht besonders schön:</p>
<pre><code class="language-cpp">string::iterator s;
char* str2 = (char*) &amp;(*(is));
</code></pre>
</blockquote>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox252" checked="true" /><label for="checkbox252">oder so ist demzufolge (für x!=0) undefiniert. Für</label></div></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327376</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Jul 2007 17:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 18:06:17 GMT]]></title><description><![CDATA[<p>Na gut, schade <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="😞"
    /> Aber danke für die Antwort! Muss ich mir wahrscheinlich die Zeiger (zumindest teilweise) abgewöhnen...</p>
<p>Wie macht ihr das eigentlich? Wenn man mit der STL arbeitet, müsste man ja viele Zeiger weglassen und immer mit iteratoren arbeiten:</p>
<pre><code class="language-cpp">class SomeClass {};

void DoSomething( vector&lt;SomeClass&gt;::const_iterator elem ) {}
// statt
void DoSomething( const SomeClass* elem ) {}

...

vector&lt;SomeClass&gt; vec;
for ( vector&lt;SomeClass&gt;::iterator iter=vec.begin(); iter!=vec.end(); iter++ )
    DoSomething( iter );
</code></pre>
<p>Aber wenn ich nun nur eine Instanz von &quot;SomeClass&quot; haben will, dann kann ich die Funktion &quot;DoSomething&quot; ja gar nicht nutzen:</p>
<pre><code class="language-cpp">SomeClass* sc = new SomeClass();
DoSomething( sc );
</code></pre>
<p>Wie kann man sowas lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327392</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 17 Jul 2007 18:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 18:12:34 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">SomeClass* sc = new SomeClass();
DoSomething( sc );
</code></pre>
<p>Wie kann man sowas lösen?</p>
</blockquote>
<pre><code class="language-cpp">class SomeClass {};

void DoSomething( const SomeClass* elem ) {}

...

vector&lt;SomeClass&gt; vec;
for ( vector&lt;SomeClass&gt;::iterator iter=vec.begin(); iter!=vec.end(); ++iter ) // ++iter
    DoSomething( *iter );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1327400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327400</guid><dc:creator><![CDATA[lollololololololol]]></dc:creator><pubDate>Tue, 17 Jul 2007 18:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 18:36:29 GMT]]></title><description><![CDATA[<p>Ne, eben nicht <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=":/"
      alt="😕"
    /><br />
Wenn man den Iterator dereferenziert, kommt ein vector&lt;..&gt;::value_type bei raus.</p>
<p>Und ob iter++ oder ++iter ist in der for-Schleife egal :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327407</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 17 Jul 2007 18:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 18:42:00 GMT]]></title><description><![CDATA[<p>überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327409</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Tue, 17 Jul 2007 18:42:00 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Tue, 17 Jul 2007 18:49:23 GMT]]></title><description><![CDATA[<p>Checker&amp;Murckser schrieb:</p>
<blockquote>
<p>überladen?</p>
</blockquote>
<p>Ja gut, das geht schon, aber dann hätte ich den Code doppelt <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="😞"
    /> Ist zwar eine Lösung, aber designtechnisch auch nur halb gebacken..</p>
<p>Oh, Juchu, ich habs!! Hab gemerkt, dass push_back auch einen dereferenzierten Iterator als &quot;const Typ&amp;&quot; annimmt <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>
<p>Also:</p>
<pre><code class="language-cpp">void DoSomething( const SomeClass&amp; elem ) {}

vector&lt;SomeClass&gt; vec;
for ( vector&lt;SomeClass&gt;::iterator iter=vec.begin(); iter!=vec.end(); iter++ )
	DoSomething( *iter );

SomeClass cl;
DoSomething( cl );
</code></pre>
<p>Freude <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="😃"
    /> <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="😃"
    /> <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/1327410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327410</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 17 Jul 2007 18:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 10:46:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">++iter
</code></pre>
<p>Bei Iteratoren ++iter ! Merk dir das... <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327685</guid><dc:creator><![CDATA[lollololololololol]]></dc:creator><pubDate>Wed, 18 Jul 2007 10:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 10:59:08 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>vector: ja; string: nein (auch wenn es wohl keine bestehende Implementation kaputtmachte, wenn man das auch für string festlegte).</p>
</blockquote>
<p>das wurde doch 2003 so festgelegt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327688</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 18 Jul 2007 10:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 10:56:30 GMT]]></title><description><![CDATA[<p>Der Grund:<br />
==iter inkrementiert erst und liefert dann den erhaltenen Wert zurueck, iter++ speichert den Wert, inkrementiert dann und liefert am ende den gespeicherten Wert - sprich es muss eine Kopie angelegt werden, was sowohl speicher als auch Zeit kostet. (Gilt im Endeffekt fuer alle ueberladenen inkrement-operatoren, nur bei Standardtypen wie int ist der compiler (meist) schlau genug, keinen overhead zu produzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327689</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 18 Jul 2007 10:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 11:24:19 GMT]]></title><description><![CDATA[<p>Hm, war mir neu, leuchtet aber ein <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 />
Aber seid ihr euch sicher, dass er den Wert speichert und zurückgibt, obwohl er gar nicht gebraucht/abgefragt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327715</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 18 Jul 2007 11:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 11:29:44 GMT]]></title><description><![CDATA[<p>In dem Moment, wo der op++ aufgerufen wird, ist noch gar nicht klar, ob der Rückgabewert weiterverwendet werden soll - also bleibt dem Operator gar nichts anderes übrig als ihn zu kopieren (die eigene Position wird als Nebeneffekt geändert, also stimmt sie nicht mehr mit dem überein, was der Aufrufer erwartet). Wenn du den Rückgabewert nicht nutzt, <em>darf</em> (<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> nicht 'muss') der Compiler die ganze Kopiererei natürlich wegoptimieren - aber verlassen würde ich mich nicht darauf.</p>
<p>PS: Und der typische Aufbau der Inkrement-Operatoren sieht so aus:</p>
<pre><code class="language-cpp">iter&amp; iter::operator++()
{
  //bewege *this vorwärts
  return *this;
}
iter iter::operator++(int)
{
  iter tmp=*this;
  ++*this;
  return tmp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1327718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327718</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Jul 2007 11:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Iteratoren casten on Wed, 18 Jul 2007 13:02:18 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>vector: ja; string: nein (auch wenn es wohl keine bestehende Implementation kaputtmachte, wenn man das auch für string festlegte).</p>
</blockquote>
<p>das wurde doch 2003 so festgelegt, oder?</p>
</blockquote>
<p>Für vector steht es explicit da 23.2.4/1</p>
<blockquote>
<p>The elements of a vector are stored contiguously, meaning that if v is a vector&lt;T, Allocator&gt; where T is some type other than bool, then it obeys the identity &amp;v[n] == &amp;v[0] + n for all 0 &lt;= n &lt; v.size().</p>
</blockquote>
<p>Für basic_string existiert keine solche Passage an entsprechender Stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327791</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 18 Jul 2007 13:02:18 GMT</pubDate></item></channel></rss>