<?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[frage zu STL containern]]></title><description><![CDATA[<p>mich wuerde mal interessieren ab wieviel elementen fuer einen STL-container<br />
(z.B. vector) es problematisch hinsichtlich algorithmen oder jeglichem zugriff gibt?<br />
gibt es solch eine maximum grenze ?<br />
falls ja, was waere eine alternative datenstruktur ?</p>
<p>ich schreibe gerade einen parser der aus einer text-datei bestimmte daten extrahiert und diese dann in form von instanzen einer klasse in einem STL container ablegt.</p>
<p>allerdings kann die anzahl an instanzen schonmal leicht die 1000.000 grenze erreichen <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="😞"
    /> -&gt; keine ahnung ob das ein problem sein duerfte?</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256672/frage-zu-stl-containern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 04:39:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256672.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Dec 2009 10:21:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 10:21:14 GMT]]></title><description><![CDATA[<p>mich wuerde mal interessieren ab wieviel elementen fuer einen STL-container<br />
(z.B. vector) es problematisch hinsichtlich algorithmen oder jeglichem zugriff gibt?<br />
gibt es solch eine maximum grenze ?<br />
falls ja, was waere eine alternative datenstruktur ?</p>
<p>ich schreibe gerade einen parser der aus einer text-datei bestimmte daten extrahiert und diese dann in form von instanzen einer klasse in einem STL container ablegt.</p>
<p>allerdings kann die anzahl an instanzen schonmal leicht die 1000.000 grenze erreichen <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="😞"
    /> -&gt; keine ahnung ob das ein problem sein duerfte?</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823361</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Wed, 16 Dec 2009 10:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 10:28:23 GMT]]></title><description><![CDATA[<p>Wikliche Probleme wird es erst geben, falls dir der virtuelle Speicher ausgeht. Das dürfte aber von Containertyp weitgehend unabhängig sein. Du musst einfach schauen, wie groß eine Instanz ist, das gibt dir die Möglichkeit, den Speicherbedarf abzuschätzen. Natürlich gibt es auch Algorithmen die auf manchen Containern bei großer Anzahl an Elementen sehr langsam werden. Das kann man aber nur für die konkrete Kombination aus Container und Algorithmus sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823369</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Wed, 16 Dec 2009 10:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 10:39:07 GMT]]></title><description><![CDATA[<p>ok, danke.</p>
<p>im prinzip geht es nur um lineare suche (find etc.) was die algorithmen angeht.<br />
hoffe das mit dem langsam werden trifft hier nicht zu.<br />
bei der sache mit dem virtuellen speicher muesste ich mir das mal zusammenrechnen.</p>
<p>gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823375</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Wed, 16 Dec 2009 10:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 11:03:43 GMT]]></title><description><![CDATA[<p>Ich gehe mal von Windows aus.<br />
Hast mehrere Grenzen.<br />
Paßt alles noch in den Prozessorcache und liegt zufällig auch noch da, ist es schnell wie Proz.<br />
So bei 128k hört das aber sachon auf.<br />
Anderenfalls ist es schonmal spürbar, weil das RAM nicht so fix ist. Aber geht ja nicht anders.<br />
So bei RAM-größe, die eingebaut ist minus 150MB hört das dann auf.<br />
Ab jetzt muß Speicher immer von der Festplatte eingelagert werden und das ist LAHM.<br />
Geht bis zur Menge des virtuellen Speichers, also Größe der Auslagerungsdatei.<br />
Danach bricht das Programm einfach ab.<br />
Zusatzgrenze: Geht bis ca 1.8GB. Danach geht der virtuelle Adressraum aus und das Programm bricht einfach ab.<br />
Bei einem 64-Bit-Betriebssystem fällt die Grenze mit dem virtuellen Adressraum weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823388</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 Dec 2009 11:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 11:09:59 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>ok, danke.<br />
im prinzip geht es nur um lineare suche (find etc.) was die algorithmen angeht.<br />
gruss</p>
</blockquote>
<p>Da hängt es sehr stark vom benutzten Kontainer ab. Bei ner list oder nem vector ist die Dauer zum Suchen proportional zur Anzahl der Elemente also O(n);<br />
Bei Associativen Kontainern wie map oder set ist sie O(log n). Das ist für große n schon deutlich schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823391</guid><dc:creator><![CDATA[siecpp]]></dc:creator><pubDate>Wed, 16 Dec 2009 11:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Wed, 16 Dec 2009 22:52:01 GMT]]></title><description><![CDATA[<p>Bei sehr grossen Datenmengen kann sich eventuell <code>std::deque</code> auszahlen, da dieser Container kleinere Speicherbereiche anfordert (und die Wahrscheinlichkeit grösser ist, dass mehrere kleine Stücke frei sind als ein grosses).</p>
<p>Ich würde am besten etwas herumexperimentieren, auch bezüglich Performance. Wenn du wirklich aufs Speicher-Ausgehen gefasst sein willst, fange <code>std::bad_alloc</code> (allerdings hatte ich selbst noch nie einen Fall, in dem das nötig war – du musst dir auch überlegen, wie du in so einer Situation sinnvoll reagierst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823780</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 16 Dec 2009 22:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Thu, 17 Dec 2009 12:25:53 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Bei sehr grossen Datenmengen kann sich eventuell <code>std::deque</code> auszahlen, da dieser Container kleinere Speicherbereiche anfordert (und die Wahrscheinlichkeit grösser ist, dass mehrere kleine Stücke frei sind als ein grosses).</p>
<p>Ich würde am besten etwas herumexperimentieren, auch bezüglich Performance. Wenn du wirklich aufs Speicher-Ausgehen gefasst sein willst, fange <code>std::bad_alloc</code> (allerdings hatte ich selbst noch nie einen Fall, in dem das nötig war – du musst dir auch überlegen, wie du in so einer Situation sinnvoll reagierst).</p>
</blockquote>
<p>Da muss ich dich leider übelst enttäuschen, denn den gleichen Gedankengang hatte ich auch und hab da einige interessante Erkenntnisse über std::deque gewonnen. Bei der STLport Implementierung von SGI besteht eine deque aus einzelnen &quot;maps&quot;, die untereinander verlinkt sind. Jede map besteht aus 1-16 (auf den ersten Blick in die Dinkumware deque) Elementen und einigen Zeigern, sodass bei kleinen Datentypen das Verhältnis von organisatorischen Daten zu Nutzdaten exorbitant schlecht wird. Leider kann man die map size nicht einstellen, um ein besseres Verhältnis zu erzielen, aber so bleibt eine deque für eine große Anzahl von kleinen Objekten ein Speicherfresser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823941</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 17 Dec 2009 12:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu STL containern on Thu, 17 Dec 2009 20:19:12 GMT]]></title><description><![CDATA[<p>Ich habe eben die MSVC++-Implementierung getestet:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;fstream&gt;
#include &lt;deque&gt;
#include &lt;vector&gt;

size_t allocations;
size_t bytes;

std::ofstream logger(&quot;log.txt&quot;);

void* operator new(size_t size)
{
	++allocations;
	bytes += size;
	return malloc(size);
}

void operator delete(void* mem)
{
	free(mem);
}

template &lt;size_t Bytes&gt;
struct byter
{
	char arr[Bytes];
};

template &lt;typename T&gt;
void test_container()
{
	allocations = 0;
	bytes = 0;

	std::deque&lt;T&gt; c(1048576 / sizeof(T));
	logger &lt;&lt; &quot;Groesse des Typs:           &quot; &lt;&lt; sizeof(T) &lt;&lt; std::endl;
	logger &lt;&lt; &quot;Anzahl Elemente:            &quot; &lt;&lt; c.size() &lt;&lt; std::endl;
	logger &lt;&lt; &quot;Allokationen:               &quot; &lt;&lt; allocations &lt;&lt; std::endl;
	logger &lt;&lt; &quot;Speicherverbrauch (Total):  &quot; &lt;&lt; bytes &lt;&lt; std::endl;
	logger &lt;&lt; &quot;Speicherverbrauch (Daten):  &quot; &lt;&lt; c.size() * sizeof(T) &lt;&lt; std::endl;
	logger &lt;&lt; &quot;Anteil Speicher fuer Daten: &quot; &lt;&lt; static_cast&lt;float&gt;(c.size() * sizeof(T)) / bytes &lt;&lt; std::endl;
	logger &lt;&lt; c[rand()%c.size()].arr &lt;&lt; std::endl; // Wegoptimieren verunmöglichen
}

int main()
{
	test_container&lt;byter&lt;4&gt; &gt;();
	test_container&lt;byter&lt;16&gt; &gt;();
	test_container&lt;byter&lt;64&gt; &gt;();
	test_container&lt;byter&lt;256&gt; &gt;();
	test_container&lt;byter&lt;1024&gt; &gt;();
}
</code></pre>
<p>Nun zu den Resultaten. Der STL-Container <code>std::deque</code> ist bezüglich Speicherverbrauch nicht sehr effizient, wenn die Elementtypen klein sind. Je grösser sie werden, desto vernachlässigbarer wird der Overhead.</p>
<pre><code>Groesse des Typs:           4
Anzahl Elemente:            262144
Allokationen:               65560
Speicherverbrauch (Total):  1995280
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.525528

Groesse des Typs:           16
Anzahl Elemente:            65536
Allokationen:               65560
Speicherverbrauch (Total):  1995280
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.525528

Groesse des Typs:           64
Anzahl Elemente:            16384
Allokationen:               16405
Speicherverbrauch (Total):  1329052
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.788965

Groesse des Typs:           256
Anzahl Elemente:            4096
Allokationen:               4113
Speicherverbrauch (Total):  1103936
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.949852

Groesse des Typs:           1024
Anzahl Elemente:            1024
Allokationen:               1038
Speicherverbrauch (Total):  1064936
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.984638
</code></pre>
<p>Nun zum Vergleich der <code>std::vector</code> (identischer Code bis auf Containerdeklaration):</p>
<pre><code>Groesse des Typs:           4
Anzahl Elemente:            262144
Allokationen:               2
Speicherverbrauch (Total):  1048580
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.999996

Groesse des Typs:           16
Anzahl Elemente:            65536
Allokationen:               2
Speicherverbrauch (Total):  1048580
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.999996

Groesse des Typs:           64
Anzahl Elemente:            16384
Allokationen:               2
Speicherverbrauch (Total):  1048580
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.999996

Groesse des Typs:           256
Anzahl Elemente:            4096
Allokationen:               2
Speicherverbrauch (Total):  1048580
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.999996

Groesse des Typs:           1024
Anzahl Elemente:            1024
Allokationen:               2
Speicherverbrauch (Total):  1048580
Speicherverbrauch (Daten):  1048576
Anteil Speicher fuer Daten: 0.999996
</code></pre>
<p>Aber dieser Vergleich ist natürlich etwas unfair, da der <code>std::vector</code> seinen Speicher in den wenigsten Fällen so gut ausnutzen kann. Als Konstrast dazu, nachdem ich nach der Deklaration die Anweisung <code>c.resize(c.capacity()+1);</code> eingefügt habe:</p>
<pre><code>Groesse des Typs:           4
Anzahl Elemente:            262145
Allokationen:               3
Speicherverbrauch (Total):  2621444
Speicherverbrauch (Daten):  1048580
Anteil Speicher fuer Daten: 0.400001

Groesse des Typs:           16
Anzahl Elemente:            65537
Allokationen:               3
Speicherverbrauch (Total):  2621444
Speicherverbrauch (Daten):  1048592
Anteil Speicher fuer Daten: 0.400005

Groesse des Typs:           64
Anzahl Elemente:            16385
Allokationen:               3
Speicherverbrauch (Total):  2621444
Speicherverbrauch (Daten):  1048640
Anteil Speicher fuer Daten: 0.400024

Groesse des Typs:           256
Anzahl Elemente:            4097
Allokationen:               3
Speicherverbrauch (Total):  2621444
Speicherverbrauch (Daten):  1048832
Anteil Speicher fuer Daten: 0.400097

Groesse des Typs:           1024
Anzahl Elemente:            1025
Allokationen:               3
Speicherverbrauch (Total):  2621444
Speicherverbrauch (Daten):  1049600
Anteil Speicher fuer Daten: 0.40039
</code></pre>
<p>Ganz so rosig sieht es also auch beim <code>std::vector</code> nicht immer aus, die Wahrheit liegt irgendwo dazwischen. Die <code>std::deque</code> benötigt zwar bei kleinen Objekten relativ viel Speicher (die Hälfte ist Overhead), aber vor allem bei grösseren bzw. sehr vielen Elementen kann sie sich trotzdem auszahlen, weil sie flexibler ist, was Reallokationen und Speicherfreigaben betrifft. Schlussendlich kommts halt immer auf den Anwendungsfall an, deshalb vorhin auch mein Vorschlag mit dem Herumexperimentieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824178</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Dec 2009 20:19:12 GMT</pubDate></item></channel></rss>