<?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[Index oder Iterator?]]></title><description><![CDATA[<p>Hallo,<br />
welche der beiden Versionen ist schneller oder verbraucht weniger Speicher?</p>
<pre><code class="language-cpp">std::vector&lt;std::unique_ptr&lt;object&gt; &gt; objects;
// über iterator
for (auto it = objects.begin(); it != objects.end(); ++it) {
	(*it)-&gt;doSomething();
}

// über index
for (int i = 0; i &lt; objects.size(); ++i) {
    objects[i]-&gt;doSomething();
}
</code></pre>
<p><code>object</code> ist in diesem Fall eine abstrakte Basisklasse. Kann ich da eigentlich den Pointer irgendwie umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284197/index-oder-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 04:32:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284197.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Mar 2011 18:29:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 18:29:30 GMT]]></title><description><![CDATA[<p>Hallo,<br />
welche der beiden Versionen ist schneller oder verbraucht weniger Speicher?</p>
<pre><code class="language-cpp">std::vector&lt;std::unique_ptr&lt;object&gt; &gt; objects;
// über iterator
for (auto it = objects.begin(); it != objects.end(); ++it) {
	(*it)-&gt;doSomething();
}

// über index
for (int i = 0; i &lt; objects.size(); ++i) {
    objects[i]-&gt;doSomething();
}
</code></pre>
<p><code>object</code> ist in diesem Fall eine abstrakte Basisklasse. Kann ich da eigentlich den Pointer irgendwie umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040970</guid><dc:creator><![CDATA[Objektus]]></dc:creator><pubDate>Sun, 27 Mar 2011 18:29:30 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 18:49:27 GMT]]></title><description><![CDATA[<p>Die mit Iteratoren ist schneller, und verbraucht gleich viel Speicher. Falls der Compiler optimiert könnte das Ganze im Binary aber wieder gleich aussehen.<br />
Grund: Beim Zugriff via Index muss jedesmal eine Zeiger-Addition ausgeführt werden, etwa wie <code>vec.begin() + index</code> . Tatsächlich sieht das bei VS10 so aus:</p>
<pre><code class="language-cpp">reference operator[](size_type _Off)
{	// subscript mutable sequence
	return (*(begin() + _Off));
}
</code></pre>
<p>EDIT: Falscher Code, das vorher war (glaube ich) der Indexoperator eines Iterators.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040978</guid><dc:creator><![CDATA[Oberon_0]]></dc:creator><pubDate>Sun, 27 Mar 2011 18:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 18:40:50 GMT]]></title><description><![CDATA[<p>Normalerweise sollte ein Indexoperator einem Iterator (was die Geschwindigkeit angeht) überlegen sein. Aber Datenstrukturen wie Listen lassen sich kaum über einen Indexoperator ansprechen (oder nur sehr langsam). Zudem erlaubt ein Iterator das Wechseln der Speicherklasse ohne den wesentlichen Code umzuschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040979</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 27 Mar 2011 18:40:50 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 18:42:55 GMT]]></title><description><![CDATA[<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Zeiger-Addition</p>
</blockquote>
<p>Der Indexoperator des Vektors ist ungeprüft. So sollte es doch beinahe nichts kosten, oder irre ich mich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040981</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 27 Mar 2011 18:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 19:37:11 GMT]]></title><description><![CDATA[<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Die mit Iteratoren ist schneller, und verbraucht gleich viel Speicher.</p>
</blockquote>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Normalerweise sollte ein Indexoperator einem Iterator (was die Geschwindigkeit angeht) überlegen sein.</p>
</blockquote>
<p>Wow. Beides falsch.</p>
<p>Richtige Antwort: kann so oder so ausgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041005</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 27 Mar 2011 19:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 19:50:00 GMT]]></title><description><![CDATA[<p>Siehe dazu auch eine von mir angestoßene Diskussion: <a href="http://www.c-plusplus.net/forum/283008" rel="nofollow">http://www.c-plusplus.net/forum/283008</a></p>
<p>Edit: Ok, hat nur peripher damit zu tun, aber egal... Assoziationen schaffen ist doch immer gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041010</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 27 Mar 2011 19:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 21:20:03 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Normalerweise sollte ein Indexoperator einem Iterator (was die Geschwindigkeit angeht) überlegen sein.</p>
</blockquote>
<p>Theoretisch ist das falsch, da die Iteratoren eine Addition eines Offsets pro Schleifendurchlauf weniger machen müssen.<br />
Praktisch hängt es aber von den Fähigkeiten des verwendeten Compilers ab.</p>
<p>Habe gerade den Visual-C++-Express-2008 zur Hand - da sieht das so aus: folgender Code</p>
<pre><code class="language-cpp">vector&lt; int &gt; v(10000,2);
    for( int n=1200; --n; ) // damit ich überhaupt eine Zeit messen kann 
    {
        for( int i=0; i&lt;v.size(); ++i )
            ++v[i];
    }
</code></pre>
<p>braucht auf meine PC ca. 15ms</p>
<p>und mit Iterator</p>
<pre><code class="language-cpp">for( int n=1200; --n; )
    {
        for( vector&lt; int &gt;::iterator i = v.begin(); i != v.end(); ++i )
            ++*i;
    }
</code></pre>
<p>schafft es nur in 84ms - also deutlich langsamer. Sieht man sich den Maschinencode an, so ist der deutlich suboptimal.</p>
<p>Aber der Sieger ist:</p>
<pre><code class="language-cpp">struct inc
{
    void operator()( int&amp; i ) const
    {
        ++i;
    }
};
// ...
    for( int n=1200; --n; )
    {
        for_each( v.begin(), v.end(), inc() );
    }
</code></pre>
<p>mit nur 8ms, also fast doppelt so schnell wie die Index-Variante. Wer hätte das gedacht!</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041043</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 27 Mar 2011 21:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 21:32:31 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>mit nur 8ms, also fast doppelt so schnell wie die Index-Variante. Wer hätte das gedacht!</p>
</blockquote>
<p>Hmm. Das dürfte aber lediglich von dem <code>size()</code> herrühren. <code>for_each</code> macht ansonsten genau das gleiche, wie die erste Variante.</p>
<p>Hast du das auch mit dem extrahiertem size Aufruf probiert? Sollte dann das gleiche Ergebnis geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041046</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 27 Mar 2011 21:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 22:51:08 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Normalerweise sollte ein Indexoperator einem Iterator (was die Geschwindigkeit angeht) überlegen sein.</p>
</blockquote>
<p>Theoretisch ist das falsch, da die Iteratoren eine Addition eines Offsets pro Schleifendurchlauf weniger machen müssen.</p>
</blockquote>
<p>Nee, es ist theoretisch oft wahr, weil der Prozessor den Indexzugriff kostenlos schafft, und bei zwei beteiligten Arrays gleich ein Register weniger gebraucht wird, und das ist frei für weiter außen liegende Aufgaben. Oder überhaupt erst verwendbar. (Frei aus dem AMD Optimierungshandbuch, die sprachen von register pressure.)</p>
<p>Praktisch sollte hier kein Unterschied messbar sein. Falls doch, sind es die zusätzlichen Debug-Funktionen des MSVC, die schaltet man AFAIR nicht aus, wenn man auf Release umstellt, sondern muß noch komische Makros dazu setzen. Oder war das erst ab dem Visual Studio 2010?</p>
<p>hustbaers &quot;Richtige Antwort: kann so oder so ausgehen.&quot; kann ich nur zustimmen, möchte es noch ergänzen mit &quot;Und zwar aus Gründen, die außerhalb des zu messenden Codes liegen.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041065</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 27 Mar 2011 22:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Sun, 27 Mar 2011 23:41:32 GMT]]></title><description><![CDATA[<p>Das hier</p>
<pre><code class="language-cpp">for( int i=0; i!=v.size(); ++i )
            ++v[i];
</code></pre>
<p>ergibt bei mir mit<br />
g++ -march=native -DNDEBUG --save-temps -O3 main.cpp<br />
lediglich &quot;normalen&quot; assembler-code.</p>
<p>Aber</p>
<pre><code class="language-cpp">int s=v.size();
        for( int i=0; i!=s; ++i )
            ++v[i];
</code></pre>
<p>erzeugt MMX-Code.</p>
<p>Außerdem erzeugen die Iterator-Varianten MMX-Code, egal, ob ich mir end() vorher in einer Variablen merke.</p>
<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041072</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 27 Mar 2011 23:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 06:45:33 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for( int n=1200; --n; )
    {
        for( vector&lt; int &gt;::iterator i = v.begin(); i != v.end(); ++i )
            ++*i;
    }
</code></pre>
<p>schafft es nur in 84ms - also deutlich langsamer. Sieht man sich den Maschinencode an, so ist der deutlich suboptimal.</p>
</blockquote>
<p>Auch mit</p>
<pre><code class="language-cpp">#define _SECURE_SCL 0
</code></pre>
<p>probiert?.</p>
<p>Man kann zwar mal drüber nachdenken und zum Spaß auch mal nachmessen aber nach Optimierungen sind die Unterschiede so gering oder überhaupt nicht vorhanden, dass ich die Entscheidung bei sowas nie aufgrund von ein paar nanosekunden treffen würde. Iteratoren haben eigentlich immer Vorteile und den Index benutze ich bei Random Access Conatinern eigentlich nur, wenn ich ihn noch irgendwie anders benutze und beim Einsatz von Iteratoren einen zusätzlichen Zähler definieren müsste.<br />
Sofern ohne große Umstände anwendbar finden man aber das Optimum (in Effektivität, Flexibilität, Lesbarkeit (ok, ist oft auch geschmacksache)) oft in <code>&lt;algorithm&gt;</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041107</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 28 Mar 2011 06:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 11:25:39 GMT]]></title><description><![CDATA[<p>Ich habs mal so mit <code>for_each()</code> aus <code>&lt;algortithm&gt;</code> versucht:</p>
<pre><code class="language-cpp">std::for_each(objects.begin(), objects.end(), [](std::unique_ptr&lt;object&gt; ptr) {ptr-&gt;doSomething();});
</code></pre>
<p>Über Lesbarkeit lässt sich streiten, jedoch bekomm ich imemr folgende Fehlermeldung:</p>
<pre><code>error C2248: &quot;std::unique_ptr&lt;_Ty&gt;::unique_ptr&quot;: Kein Zugriff auf private Member, dessen Deklaration in der std::unique_ptr&lt;_Ty&gt;-Klasse erfolgte.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2041234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041234</guid><dc:creator><![CDATA[Objektus]]></dc:creator><pubDate>Mon, 28 Mar 2011 11:25:39 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 12:00:04 GMT]]></title><description><![CDATA[<p>Nimm den Pointer als const-Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041252</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 28 Mar 2011 12:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 13:14:29 GMT]]></title><description><![CDATA[<p>Danke, so klappts, aber wieso muss ich hier eine Referenz verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041280</guid><dc:creator><![CDATA[Objektus]]></dc:creator><pubDate>Mon, 28 Mar 2011 13:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 13:17:28 GMT]]></title><description><![CDATA[<p>Weil <code>unique_ptr</code> noncopyable ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041283</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 28 Mar 2011 13:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to Index oder Iterator? on Mon, 28 Mar 2011 13:36:04 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung bezieht sich übrigens auf den copy-ctor, der eben wegen noncopyableness private ist. Vielleicht hilft Dir das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041291</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 28 Mar 2011 13:36:04 GMT</pubDate></item></channel></rss>