<?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 vs. []-operator]]></title><description><![CDATA[<p>Hi,</p>
<p>ich frage mich gerade was schneller wäre oder ob es überhaupt einen theoretischen Unterschied gibt.</p>
<p>Wenn ich mich durch die Elemente eines Vektors arbeite (in 90% der Fälle nur einen kleinen Teil) - wäre der const_iterator flotter oder die Adressierung mittels []-Operator flotter?</p>
<pre><code class="language-cpp">for ( std::vector&lt;int&gt;::const_iterator it = keys.begin();
      it != keys.end();
      ++it )
{
	if (!mkeTester-&gt;isKey(*it))
		return false;
}
// ... oder ...
for ( size_t i=0;
      i &lt; keys.size();
      ++i )
{
	if (!mkeTester-&gt;isKey(keys[i]))
		return false;
}
return true;
</code></pre>
<p>danke <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/157888/iterator-vs-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 13:31:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157888.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Aug 2006 12:20:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to iterator vs. []-operator on Wed, 30 Aug 2006 12:21:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich frage mich gerade was schneller wäre oder ob es überhaupt einen theoretischen Unterschied gibt.</p>
<p>Wenn ich mich durch die Elemente eines Vektors arbeite (in 90% der Fälle nur einen kleinen Teil) - wäre der const_iterator flotter oder die Adressierung mittels []-Operator flotter?</p>
<pre><code class="language-cpp">for ( std::vector&lt;int&gt;::const_iterator it = keys.begin();
      it != keys.end();
      ++it )
{
	if (!mkeTester-&gt;isKey(*it))
		return false;
}
// ... oder ...
for ( size_t i=0;
      i &lt; keys.size();
      ++i )
{
	if (!mkeTester-&gt;isKey(keys[i]))
		return false;
}
return true;
</code></pre>
<p>danke <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/1127531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127531</guid><dc:creator><![CDATA[__et_]]></dc:creator><pubDate>Wed, 30 Aug 2006 12:21:22 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Wed, 30 Aug 2006 12:28:35 GMT]]></title><description><![CDATA[<p>Es gibt keinen relevanten Unterschied. Ich bevorzuge aber immer die Iterator-Lösung, da das bei jedem Container geht.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127538</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 30 Aug 2006 12:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Wed, 30 Aug 2006 18:15:34 GMT]]></title><description><![CDATA[<p>mmhh, also ich hab mal gelesen das du mit dem [] operator glaub ich eine multiplikation oder adition mehr brauchst als mit einem iterator. das ist aber mittlerweile schon so lange her das ich das nicht mehr zusammen bekomme..<br />
ich hab mir auch mal benchmarks dazu angesehn und es scheint das der iterator doch etwas schneller ist.<br />
aber der unterschied ist ziemlich gering...</p>
<p>ich versuchs mal<br />
array[3]<br />
wird erst auf den anfang gesetzt und dann 3 elemente weiter gegangen also hast du array+3*sizeof(type)<br />
und dann noch derefenziert</p>
<p>nun ist aber ein iterator schon ein zeiger auf das element selbst also wird nur derefenziert<br />
wie du siehst ist da schon ein unterschied.</p>
<p>ich hebe aber keinen anspruch auf richtigkeit <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/1127853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127853</guid><dc:creator><![CDATA[ConfusedGuy]]></dc:creator><pubDate>Wed, 30 Aug 2006 18:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Wed, 30 Aug 2006 18:21:18 GMT]]></title><description><![CDATA[<p>Nunja, der Iterator muss irgendwo aber auch aufs nächste Element gesetzt werden. Da ein vector direkten Zugriff auf alle Indizes erlaubt macht es keinen Unterschied ob Du eins oder drei auf den Zeiger addierst <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>EDIT:<br />
Bei einer Million Zugriffe auf denselben Index kommt die Addition dafür immer zum Tragen, beim Iterator nur immer dann wenn auf den folgenden Index gewechselt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127858</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 30 Aug 2006 18:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 11:37:02 GMT]]></title><description><![CDATA[<p>Bei der Benutzung mittels eines Index werden zwei Additionen ausgeführt, einmal für die Zählvariable (i++) und einmal für den Zugriff auf das Array (keys[i] = keys+i).<br />
Jedoch benutze ich selber auch meist die Index-Variante, da mir die Schreibarbeit für z.B.</p>
<pre><code class="language-cpp">for ( std::vector&lt;int&gt;::const_iterator it = keys.begin();
      it != keys.end();
      ++it )
</code></pre>
<p>zu viel ist.<br />
Aber wenn es bald(!?) im neuen C++0x Standard, die auto-Benutzung geben wird, dann werde ich es wohl durchgehend benutzen.</p>
<p>Bei einem allgemeinen template sollte man natürlich die Iterator-Variante nutzen, da z.B. list keinen Index-Zugriff hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128302</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 31 Aug 2006 11:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 11:52:37 GMT]]></title><description><![CDATA[<p>Schreibarbeit ist kein Argument für Codequalität.</p>
<p>Wenn ich stl-Container verwende, definiere ich mir in aller Regel einen Typedef, so daß ich für den Container-Typ einen dokumentierenden Namen habe. Beispielsweise:</p>
<pre><code class="language-cpp">typedef std::vector&lt;int&gt; KeysType;
KeysType keys;
for (KeysType::const_iterator it = keys.begin();
      it != keys.end();
      ++it )
</code></pre>
<p>Das schöne ist halt, daß man iteratoren immer verwenden kann. Da bekommt der Code auch ein einheitliches Aussehen.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128314</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 31 Aug 2006 11:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 12:56:34 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>...<br />
Jedoch benutze ich selber auch meist die Index-Variante, da mir die Schreibarbeit für z.B.</p>
<pre><code class="language-cpp">for ( std::vector&lt;int&gt;::const_iterator it = keys.begin();
      it != keys.end();
      ++it )
</code></pre>
<p>zu viel ist.</p>
</blockquote>
<p>Naja, soooo viel kürzer ist:</p>
<pre><code class="language-cpp">for ( int it = 0; it != keys.end(); ++it )
</code></pre>
<p>auch nicht (mal abgesehen davon, dass bei jeder Verwendung der Index-Variante immer noch 1 eckige Klammer und die Indexvariable dazukommt <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="😉"
    /> und (min.) der Containertyp sinnvollerweise ein typedef ist).</p>
<p>Der []-operator hat einfach einen ganz klar definierten Zweck: Random-Access.<br />
Man sollte ihn IMO deswegen auch nur da verwenden, wo man ihn braucht. Die gesparte Tipparbeit hat man nämlich bei der ersten &quot;Codeanpassung&quot; ganz schnell wieder verbraten, wenn man</p>
<ul>
<li>Indexfehler suchen und/oder</li>
<li>man erstemal alle Codestellen durchgehen muss, ob hier wirklich RandomAccess gemeint ist (z.B. wenn ein anderer Containertype notwendig wird, der keinen operator[] hat).</li>
</ul>
<p>BTW: std::for_each() kann man ja auch nehmen, wenn man wirklich alle Elemente braucht; da braucht man noch nicht einmal auf den nächsten Standard zu 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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128382</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 31 Aug 2006 12:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 13:16:17 GMT]]></title><description><![CDATA[<p>Hi ihr beiden,</p>
<p>ich meinte ja, ich benutze die Index-Schleife, wenn es mir auch auf den Index ankommt, d.h. ich schreibe lieber:</p>
<pre><code class="language-cpp">for ( size_t i = 0; i &lt; keys.size(); i++)
{
   cout &lt;&lt; i &lt;&lt; &quot;:&quot; &lt;&lt; keys[i] &lt;&lt; endl;
}
</code></pre>
<p>anstatt</p>
<pre><code class="language-cpp">for ( VInt::const_iterator it = keys.begin(); it != keys.end(); ++it )
{
   int i = it - keys.begin();
   cout &lt;&lt; i &lt;&lt; &quot;:&quot; &lt;&lt; *it &lt;&lt; endl;
}
</code></pre>
<p>Außerdem finde ich die Iteratoren immer noch ziemlich fehleranfällig. Beim Index-Operator kriege ich wenigstens eine OutOfBounds-Exception. Beim Dereferenzieren auf einen falschen Iterator machts einfach peng! (außer man benutzt eine safe STL-Variante)</p>
<p>Dies soll jetzt nicht den Eindruck erwecken, daß ich die STL nicht zu schätzen weiß. Ohne sie kann ich nicht mehr leben -)</p>
<p>Aber wenn ich eine Anwender-Klasse entwickle, welche (konstanten) Zugriff auf eine interne Liste (z.B. vector) als Schnittstelle zur Verfügung stellt, dann stelle ich stets die Methoden</p>
<pre><code class="language-cpp">size_t GetCount() const;
T Get(size_t index) const;
</code></pre>
<p>zur Verfügung, anstatt wiederum einen Iterator nach außen zu geben.</p>
<p>Aber der eigentliche Inhalt dieses Threads hat ja die Frage nach der Geschwindigkeit gestellt und die haben wir wohl gegeben.</p>
<p>ENDE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128413</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 31 Aug 2006 13:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 14:12:54 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Außerdem finde ich die Iteratoren immer noch ziemlich fehleranfällig. Beim Index-Operator kriege ich wenigstens eine OutOfBounds-Exception. Beim Dereferenzieren auf einen falschen Iterator machts einfach peng! (außer man benutzt eine safe STL-Variante)</p>
</blockquote>
<p>Ich denke du solltest nochmal schleunigst alle deine Programme mit diesem Konstrukt durchgehen. Auf eine Exception vom Indexoperator wirst du nämlich lange warten ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128474</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Thu, 31 Aug 2006 14:12:54 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Thu, 31 Aug 2006 14:44:32 GMT]]></title><description><![CDATA[<p>Normalerweise schon. Bei manchen Implementationen allerdings kann man BoundsChecking auch beim Indexoperator über defines einschalten. Dann fliegt eine Exception.<br />
Bei der alten Rogue Wave mit _RWSTD_BOUNDS_CHECKING in der stdcomp.h<br />
[edit]<br />
Ich hab gerade noch ein wenig geschaut. Bei stlPort gibt es nichts dergleichen. Bei Dinkumware gibt es _HAS_ITERATOR_DEBUGGING was eine Fehlermeldung be Überschreiten der Arraygrenzen ausgibt.<br />
[edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128503</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 31 Aug 2006 14:44:32 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Fri, 01 Sep 2006 07:21:19 GMT]]></title><description><![CDATA[<p>Hi Tc,</p>
<p>wie schon gesagt: Das Boundchecking ist das schlechteste Argument für die Verwendung des operator[]'s, weil der gerade so definiert ist, dass er das NICHT tut/n muss.<br />
Wenn schon, dann solltest Du (wo vorhanden) at() verwenden.</p>
<p>Ach ja:<br />
Ein</p>
<pre><code class="language-cpp">int i = it - keys.begin();
</code></pre>
<p>wäre mir zu teuer, wenn man mit einem simplen ++i ebensogut bedient ist. <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>Braunstein schrieb:</p>
<blockquote>
<p>...Bei manchen Implementationen ...</p>
</blockquote>
<p>Ist auch am sinnvollsten, Konstrukte zu verwenden, die möglichst nur auf einem bestimmten Compiler funktionieren !<br />
V.A. mit #defines, bei denen niemand merkt, wenn der aktuelle Compiler (bzw. die aktuelle Version) nichts mit ihnen anfängt....</p>
<p>:p</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128817</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 01 Sep 2006 07:21:19 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Fri, 01 Sep 2006 07:30:01 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>wie schon gesagt: Das Boundchecking ist das schlechteste Argument für die Verwendung des operator[]'s, weil der gerade so definiert ist, dass er das NICHT tut/n muss.</p>
</blockquote>
<p>AFAIK nicht tun <em>darf</em>. Der Indexoperator soll sich so verhalten wie der &quot;echte&quot; Indexoperator bei normalen Arrays.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128824</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 01 Sep 2006 07:30:01 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Fri, 01 Sep 2006 07:38:36 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>wie schon gesagt: Das Boundchecking ist das schlechteste Argument für die Verwendung des operator[]'s, weil der gerade so definiert ist, dass er das NICHT tut/n muss.</p>
</blockquote>
<p>AFAIK nicht tun <em>darf</em>. Der Indexoperator soll sich so verhalten wie der &quot;echte&quot; Indexoperator bei normalen Arrays.</p>
</blockquote>
<p>und wie verhält sich der &quot;echte&quot; indexoperator, wenn der index außerhalb der arraygrenzen liegt? genau: undefiniertes verhalten. das schließt die möglichkeit, dass eine exception geworfen wird, ein. es wird nur nicht garantiert, dass das passieren wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128828</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 01 Sep 2006 07:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to iterator vs. []-operator on Fri, 01 Sep 2006 09:12:15 GMT]]></title><description><![CDATA[<p>Sorry, daß ich soviel Diskussionen ausgelöst habe.</p>
<p>Ich hätte mein Beispiel mit dem []-Operator entsprechend meinem letzten Beispiel anpassen sollen.</p>
<p>Ich meinte, wenn ich nach außen eine Funktion Get() bzw. den Operator [] gebe, dann kann ich in meiner Implementierung selbst entscheiden, ob ich eine Bereichsüberprüfung checke, also intern z.B. vector&lt;...&gt;.at() benutze.</p>
<p>A propos, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@simon2</a>:</p>
<blockquote>
<p>wenn man mit einem simplen ++i ebensogut bedient ist.</p>
</blockquote>
<p>Dann sehe ich aber keinen Unterschied zu der Zähl-Schleife, wenn ich dann zusätzlich noch eine zweite Variable mitschleppe.</p>
<p>P.S.<br />
Ich glaube, ich hatte gestern hier wohl einen Troll-Beitrag verfaßt -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128892</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 01 Sep 2006 09:12:15 GMT</pubDate></item></channel></rss>