<?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[Container loopen]]></title><description><![CDATA[<p>Heiho,</p>
<p>Oft kommt es vor das ich durch ein container loopen muss, zb nem vector<br />
ich benutz zwei varianten, je nach bedarf</p>
<pre><code class="language-cpp">for(std::size_t i = 0; i &lt; vec.size(); ++i)
    vec[i]
</code></pre>
<p>oder die laengere variante wenn mir der index egal ist</p>
<pre><code class="language-cpp">for(std::vector&lt;DATA&gt;::iterator iter = vec.begin(); iter != vec.end(); ++iter)
    *iter;
</code></pre>
<p>Sofern es moeglich ist nehm ich algos, wie sort, for_each usw,</p>
<p>was ich mir aber zZt frag<br />
wenn ich den index i nicht brauch, ist es dann performanter den iterator zu nehmen statt [i] oder at(i) ?</p>
<p>wenn ich den index brauch ist es dann besser std::size_t,<br />
oder int (dann size() casten auf int)<br />
oder vector::size_type zu nehmen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205910/container-loopen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 00:19:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205910.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Feb 2008 11:55:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 11:55:44 GMT]]></title><description><![CDATA[<p>Heiho,</p>
<p>Oft kommt es vor das ich durch ein container loopen muss, zb nem vector<br />
ich benutz zwei varianten, je nach bedarf</p>
<pre><code class="language-cpp">for(std::size_t i = 0; i &lt; vec.size(); ++i)
    vec[i]
</code></pre>
<p>oder die laengere variante wenn mir der index egal ist</p>
<pre><code class="language-cpp">for(std::vector&lt;DATA&gt;::iterator iter = vec.begin(); iter != vec.end(); ++iter)
    *iter;
</code></pre>
<p>Sofern es moeglich ist nehm ich algos, wie sort, for_each usw,</p>
<p>was ich mir aber zZt frag<br />
wenn ich den index i nicht brauch, ist es dann performanter den iterator zu nehmen statt [i] oder at(i) ?</p>
<p>wenn ich den index brauch ist es dann besser std::size_t,<br />
oder int (dann size() casten auf int)<br />
oder vector::size_type zu nehmen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458777</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Tue, 19 Feb 2008 11:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:13:12 GMT]]></title><description><![CDATA[<p>Theoretisch ist die Iteratorvariante schneller, weil sie bei Vector auf Zeigerarithmetik hinauslaufen kann, sprich pro Durchlauf wird ein Zeiger um sizeof(Element) Bytes weitergeführt. Bei der Indexvariante muss in jedem Durchlauf Startoffset + Anzahl * sizeof(Element) berechnet werden, also kommt noch eine Multiplikation hinzu. Bei mehreren Zugriffen auf das Element summiert sich das natürlich auch noch, während der Iterator nur einmal berechnet werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458788</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:13:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Mr Evil schrieb:</p>
<blockquote>
<p>wenn ich den index i nicht brauch, ist es dann performanter den iterator zu nehmen statt [i] oder at(i) ?</p>
</blockquote>
<p>Ich glaub das schenkts sich nicht viel, hatten wir schon einige mal hier im Forum. Wobei at() durch die Index-Überprüfung ehe rausfällt. Also bleibt nur iter und [i] übrig. Da iterator bei vector als einfacher Zeiger implementiert sein sollte, dürfte es auf selebe hinauslaufen. Ein kleiner Test würde aber natürlich hier Gewissheit schaffen.</p>
<p>Mr Evil schrieb:</p>
<blockquote>
<p>wenn ich den index brauch ist es dann besser std::size_t,<br />
oder int (dann size() casten auf int)<br />
oder vector::size_type zu nehmen ?</p>
</blockquote>
<p>Casten brauchst du hier IMHO nicht. Würde dennoch vector::size_type, da dieser Typ ja genau dafür gedacht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458790</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:20:56 GMT]]></title><description><![CDATA[<p>Mr Evil schrieb:</p>
<blockquote>
<p>...<br />
wenn ich den index i nicht brauch, ist es dann performanter den iterator zu nehmen statt [i] oder at(i) ?<br />
...</p>
</blockquote>
<p>siehe:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-179278-and-highlight-is-.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-179278-and-highlight-is-.html</a></p>
<p>at(i) ist per se die langsamste variante, weil IMMER eine index-überprüfung stattfindet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458791</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:16:44 GMT]]></title><description><![CDATA[<p>- at(i) ist nicht so performant wie [i], da at() immer noch die Gueltigkeit ueberpruefen muss, op[] hingegen nicht.<br />
- bei vector sollten die index-methode und die iterator-methode in etwa gleich performant sein, da vector-iteratoren oft im Sinne von pointern implementiert werden<br />
- wenn du schon auf Performanz achten willst, dann lass nicht vor jedem Schleifendurchlauf vec.end() aufrufen (vorausgesetzt du fuegst dem vector keine Elemente hinzu oder loeschst sie):</p>
<pre><code class="language-cpp">std::vector&lt;DATA&gt;::iterator vec_end = vec.end();
for(std::vector&lt;DATA&gt;::iterator iter = vec.begin(); iter != vec_end; ++iter)
    *iter;
</code></pre>
<p>- welchen integer-typ du benutzt duerfte relativ egal sein, performancetechnisch</p>
<p>- BEVOR du dir irgendwelche gedanken ueber Performance machst, schau auf Korrektheit, Leserlichkeit und Wartbarkeit deines Codes. Wenn das alles gegeben ist, kuemmer dich nicht von Hand um die performance, sondern lass dir von einem Profiler sagen, wo du was verbessern kannst/musst. Der kann das tausendmal besser als deine Intuition, und er sieht auch die Optimierungen die der Compiler macht und von denen du nichtmal ansatzweise traeumen kannst <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>Fazit: machs nicht absichtlich schlechter, aber halte dich nicht mit Performance-Feinheiten auf, bevor du nicht 100%ig sicher bist, dass du es gerade an der Stelle musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458793</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:26:19 GMT]]></title><description><![CDATA[<p>Performancegewinn hat man meist eh bei Algorithmen. Zum Beispiel durch den Verzicht auf sqrt indem man mit den noch quadrierten Werten rechnet. Oder die richtige Reihenfolge bei verschachtelten Schleifen entsprechend der Speicherstruktur etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458800</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 12:30:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;DATA&gt;::iterator vec_end = vec.end();
for(std::vector&lt;DATA&gt;::iterator iter = vec.begin(); iter != vec_end; ++iter)
    *iter;
</code></pre>
<p>Nur als Zusatz, wegen Schreibarbeit und so:</p>
<pre><code class="language-cpp">for(std::vector&lt;DATA&gt;::iterator iter=vec.begin(), end=vec.end(); iter != end; ++iter )
    *iter;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1458806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458806</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 19 Feb 2008 12:30:59 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 13:14:13 GMT]]></title><description><![CDATA[<p><a href="http://boost.org/doc/html/foreach.html" rel="nofollow">http://boost.org/doc/html/foreach.html</a> <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="🙂"
    /> Sollte gleich schnell sein wie die iterator-Variante, ist aber wesentlich weniger Schreibaufwand (und sieht IMO besser aus <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/1458840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458840</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 19 Feb 2008 13:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 14:01:13 GMT]]></title><description><![CDATA[<p>Warum nicht std::for_each?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458875</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 19 Feb 2008 14:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 14:22:39 GMT]]></title><description><![CDATA[<p>Also Iterator ist wie hier schon angesprochen so gut wie immer schneller als direkter Zugriff per Index-Operator.</p>
<p>Dann noch mit Standardalgorithmen kombinieren, und es rockt das haus <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>
<pre><code class="language-cpp">#include &lt;functional&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

struct bar
{
    bar()
        : data(0)
    {}

    void foo(const std::size_t value) { std::cout &lt;&lt; &quot;data = &quot; &lt;&lt; value &lt;&lt; &quot; (old: &quot; &lt;&lt; data &lt;&lt; &quot;);&quot; &lt;&lt; std::endl; data = value; }

private:
    std::size_t data;
};

int main()
{
    std::vector&lt;bar&gt; data(10);

    /* operator[] =&gt; Indexoperator */
    for (std::size_t i(0); i &lt; data.size(); ++i)
        data.foo(2);

    /* begin(), end() =&gt; Iterator */
    const std::vector&lt;bar&gt;::iterator it_end(data.end());
    for (std::vector&lt;bar&gt;::iterator it(data.begin()); it != it_end; ++it)
        it-&gt;foo(3);

    /* for_each =&gt; Algorithm | Iterator */
    std::for_each(data.begin(), data.end(), std::bind2nd(std::mem_fun_ref(&amp;bar::foo), 2));
}
</code></pre>
<p>... Letztes gewinnt! ^^ Naja und in manchen Fällen ist es sogar nur per Iterator anständig möglich (std::list) oder einfach viel einfacher (std::ifstream_iterator usw.) ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458894</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 19 Feb 2008 14:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 15:16:54 GMT]]></title><description><![CDATA[<p>danke fuer die meinungen</p>
<p>- wegen dem casten, das wurde hier von jemanden missverstanden, wenn ich<br />
for(int i...<br />
mache, muss ich vec.size() nach int casten, darum lass ich das meistens</p>
<p>- das for_each usw schneller sind, also generell algos zu bevorzugen sind weiss ich, hab cih im start post auch schon geschrieben, mir gehts nur um die faellt wo ein also nicht moeglich ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458927</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Tue, 19 Feb 2008 15:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Tue, 19 Feb 2008 15:50:12 GMT]]></title><description><![CDATA[<p>Na, damit du bei der for-Schleife nicht casten mußt, solltest du dann halt den richtigen Typ nehmen:</p>
<pre><code class="language-cpp">for(std::size_t i=0; i&lt;vec.size(); i++)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1458951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458951</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 19 Feb 2008 15:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Wed, 20 Feb 2008 09:07:43 GMT]]></title><description><![CDATA[<p>ich weiss, das mach ich ja auch, nur manchmal brauch ich den index i auch fuer andere zwecke, da ist es dann einfacher size nach int zu casten als das size_t jedesmal nach int casten zu muessen</p>
<p>ich vermeide das aber so gut wie geht {also casts ueberhaupt}</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459263</guid><dc:creator><![CDATA[EXDW]]></dc:creator><pubDate>Wed, 20 Feb 2008 09:07:43 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Wed, 20 Feb 2008 13:18:03 GMT]]></title><description><![CDATA[<p>man braucht selten wirklich +/- -Zahlenbereiche ... meist reicht + oder -.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459428</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 20 Feb 2008 13:18:03 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Wed, 20 Feb 2008 14:19:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Na, damit du bei der for-Schleife nicht casten mußt, solltest du dann halt den richtigen Typ nehmen</p>
</blockquote>
<p>Ähm der richtige wäre:</p>
<pre><code class="language-cpp">typedef std::vector&lt;int&gt; IntArray;
IntArray vec;
for(IntArray::size_type i=0; i&lt;vec.size(); i++)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1459486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459486</guid><dc:creator><![CDATA[Tyrdal]]></dc:creator><pubDate>Wed, 20 Feb 2008 14:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Container loopen on Wed, 20 Feb 2008 15:19:56 GMT]]></title><description><![CDATA[<p>mal so ne Frage nebenbei:<br />
1. funzt std::mem_fun_ref auch virtuellen methoden?<br />
2. funzt das mit dem for_each auch bei Pointern?</p>
<pre><code class="language-cpp">class bar{
    bar() {}
    virtual void foo1() = 0;
    virtual void foo2() { std::cout &lt;&lt; &quot;bar::foo2&quot;  &lt;&lt; std::endl;  }
};

class bar2 : public bar{
    bar2() {}
    void foo1() { std::cout &lt;&lt; &quot;bar2::foo1&quot;  &lt;&lt; std::endl;  }
    void foo2() { std::cout &lt;&lt; &quot;bar2::foo2&quot;  &lt;&lt; std::endl;  }
};

class bar3 : public bar{
    bar3() {}
    void foo1() { std::cout &lt;&lt; &quot;bar3::foo1&quot;  &lt;&lt; std::endl;  }
    void foo2() { std::cout &lt;&lt; &quot;bar3::foo2&quot;  &lt;&lt; std::endl;  }
};

int main()
{
    std::vector&lt;bar*&gt; data(4);
    data[0] = new bar2;
    data[1] = new bar2;
    data[2] = new bar3;
    data[3] = new bar3;

    /* for_each =&gt; Algorithm | Iterator */
   //wie sähe hier der for_each Befehl aus? einmal für foo1 und einmal für foo2    
   std::for_each( ??? )
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1459542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459542</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 20 Feb 2008 15:19:56 GMT</pubDate></item></channel></rss>