<?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[std::vector Specherfreigabe]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich frage mich gerade:<br />
Wieso gibt std::vector kein Speicher frei, wenn Elemente entfernt werden? Was ist der Grund für dieses Design? Ist das vom Standard vorgeschrieben? Ich meine man könnte ja problemlos machen, dass der Speicherverbrauch exponentiell sinkt, so wie er auch wächst, um die Deallokationen zu minimieren. Oder ist das eine Eigenschaft des default-Allokators?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315513/std-vector-specherfreigabe</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 18:04:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315513.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Apr 2013 15:29:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 15:29:00 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich frage mich gerade:<br />
Wieso gibt std::vector kein Speicher frei, wenn Elemente entfernt werden? Was ist der Grund für dieses Design? Ist das vom Standard vorgeschrieben? Ich meine man könnte ja problemlos machen, dass der Speicherverbrauch exponentiell sinkt, so wie er auch wächst, um die Deallokationen zu minimieren. Oder ist das eine Eigenschaft des default-Allokators?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312502</guid><dc:creator><![CDATA[Stefan666]]></dc:creator><pubDate>Thu, 04 Apr 2013 15:29:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 15:51:46 GMT]]></title><description><![CDATA[<p>Das ist so beabsichtigt. Man kann in der Regel reservierte Speicherbereiche nicht stückweise freigeben, deshalb hätte eine Verkleinerung des reservierten Platzes eine neue Allokation und ein Kopieren der Elemente zur Folge.<br />
Möchte man den Vector trotzdem verkleinern, gab es bis C++11 das Idiom</p>
<pre><code>vector&lt;T&gt;(v.begin(), v.end()).swap(v)
</code></pre>
<p>Seit C++11 hat <code>vector</code> dafür die Memberfunktion <code>shrink_to_fit</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312508</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 04 Apr 2013 15:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 15:44:52 GMT]]></title><description><![CDATA[<p>Weil es effizient ist, ohne nennenswerte Nachteile zu haben. Es ist aus zwei Gründen effizient:<br />
1. Wenn der Speicher freigegeben werden sollte, so wäre eine Kopieraktion aller verbliebenen Elemente nötig. Ganz übel.<br />
2. Meistens wird der Vektor kurz danach wieder gefüllt.</p>
<p>Die Vorgaben im Standard bezüglich Effizienz der Operationen und die Gültigkeit von Iteratoren diktieren indirekt, dass solch eine Freigabe nicht erlaubt wäre.</p>
<p>Falls du aus irgendeinem Grund wirklich (bist du <strong>ganz</strong> sicher?) den Speicher freigeben musst, dann gibt es in C++11 shrink_to_fit (nicht bindend!) und ohne C++11 den swap-Trick (Efficient C++, Trick 17):</p>
<pre><code>mein_vector.swap(vector&lt;T&gt;(mein_vector));
</code></pre>
<p>Achtung: Dies ist, wie oben angedeutet, eine teure Kopieraktion!</p>
<p>P.S.: Mal wieder zu langsam...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312511</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 04 Apr 2013 15:44:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 15:52:57 GMT]]></title><description><![CDATA[<p>Ok, aber beim Wachsen kann ein Umkopieren in einen neuen Speicherbereich auch durchaus notwendig sein. Ein vorübergehender Peak bezüglich Speicherverbrauch lässt sich da nicht vermeiden. Ausserdem werden Iteratoren beim Wachsen sowieso ungültig. Dürfen sie etwa beim Schrumpfen nicht ungültig werden? Nur dann wäre das Neuallozieren von kleineren Speicherblöcken verboten, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312519</guid><dc:creator><![CDATA[Stefan666]]></dc:creator><pubDate>Thu, 04 Apr 2013 15:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 16:06:18 GMT]]></title><description><![CDATA[<p>Beim Wachsen lässt sich Reallokation nicht vermeiden. Beim Schrumpfen schon. wieso sollte man sich selber behindern? Wo wäre der Vorteil?</p>
<p>Du kannst auch jede Membermethode noch ein dickes sleep einbauen. Kann man machen. Wieso sollte man?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312528</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 04 Apr 2013 16:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 22:28:12 GMT]]></title><description><![CDATA[<p>Bevor ich jetzt einen neuen Thread aufmache poste ich mal hier rein passt ja <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="😉"
    /><br />
Also ich habe gerade gelesen (in einem C++ Buch) das es sehr viel Rechenzeit kostet Elemente zu löschen, daher wird in einem Beispiel (zu dem das stand) aus dem Buch auch kein Element gelöscht (erase) sonder einfach bei der Durchsuchung des Vectors der Bereich nicht angesprochen.<br />
Daher es gibt eine Variable &quot;Anzahl&quot; welche die Anzahl der Elemente des Vectors verwaltet.<br />
Beispiel:<br />
Der Vector hat 5 Elemente, Anzahl = 5.<br />
Element 3 wird gelöscht.<br />
Jetzt wird Element 5 nach 3 kopiert und die variable Anzahl auf 4 geändert.<br />
So dass nur noch 4 Elemente durchsucht werden.</p>
<p>Aber jetzt schreibt ihr ja das beim löschen eines Elementes gar keins gelöscht wird.<br />
Daher ist jetzt die Rechenzeit / Speicherplatz bei der Variante aus dem Buch günstiger?</p>
<p>Danke <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/2312637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312637</guid><dc:creator><![CDATA[derFer]]></dc:creator><pubDate>Thu, 04 Apr 2013 22:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 22:35:34 GMT]]></title><description><![CDATA[<p>Grundsätzlich kann <code>std::vector::erase()</code> teuer sein, weil es alle nachfolgenden Elemente umkopiert. Häufig sieht man <code>erase()</code> in einer Iterationsschleife, was wahnsinnig ineffizient ist, da für jedes zu löschende Element sämtliche Nachfolger verschoben werden müssen. Daher sollte man in solchen Fällen <code>std::remove()</code> oder <code>std::remove_if()</code> verwenden.</p>
<p>Für einzelne Elemente gibts den <code>swap()</code> -and- <code>pop_back()</code> -Trick, das kannst du nämlich automatisch haben. Zuerst vertauschst du das zu löschende Element mit dem letzten, dann entfernst du das letzte. So ist das Löschen quasi gratis. Geht aber nur, wenn die Reihenfolge egal ist.</p>
<pre><code>std::swap(*itr, vec.back());
vec.pop_back();
</code></pre>
<p>Wenn man externe Variablen für sowas erstellt, hat man was ganz Wichtiges nicht verstanden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312638</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 04 Apr 2013 22:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 22:45:58 GMT]]></title><description><![CDATA[<p>Ah danke <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 />
Macht es denn einen Unterschied ob ich std::swap benutze oder ob ich einfach <a href="http://vec.at" rel="nofollow">vec.at</a>(x) = vec.back() benutze?</p>
<p>Und hab ich das richtig verstanden, das pop_back() einfach size() verkleinert? daher theoretisch ist das &quot;gelöschte&quot; Element immer noch über vec[vec.size()] erreichbar?</p>
<p>Danke auf jeden Fall <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="🙂"
    /><br />
MfG<br />
derFer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312639</guid><dc:creator><![CDATA[derFer]]></dc:creator><pubDate>Thu, 04 Apr 2013 22:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 22:56:10 GMT]]></title><description><![CDATA[<p>derFer schrieb:</p>
<blockquote>
<p>Ah danke <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 />
Macht es denn einen Unterschied ob ich std::swap benutze oder ob ich einfach <a href="http://vec.at" rel="nofollow">vec.at</a>(x) = vec.back() benutze?</p>
<p>Und hab ich das richtig verstanden, das pop_back() einfach size() verkleinert? daher theoretisch ist das &quot;gelöschte&quot; Element immer noch über vec[vec.size()] erreichbar?</p>
<p>Danke auf jeden Fall <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="🙂"
    /><br />
MfG<br />
derFer</p>
</blockquote>
<p>Auf das letzte Element wird der Dekonstruktor aufgerufen, d.h. das wäre undefiniert. Du wirst natürlich meistens noch die gleichen bytes dort vorfinden, aber Standard ist das nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312641</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Thu, 04 Apr 2013 22:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Thu, 04 Apr 2013 23:03:02 GMT]]></title><description><![CDATA[<p>Ah OK, das habe ich mir schon gedacht... 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="🙂"
    /><br />
Aber es macht keinen Unterschied ob ich std::swap benutze oder ob ich einfach <a href="http://vec.at" rel="nofollow">vec.at</a>(x) = vec.back() benutze, oder?<br />
MfG,<br />
derFer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312642</guid><dc:creator><![CDATA[derFer]]></dc:creator><pubDate>Thu, 04 Apr 2013 23:03:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 00:09:07 GMT]]></title><description><![CDATA[<p>derFer schrieb:</p>
<blockquote>
<p>Aber es macht keinen Unterschied ob ich std::swap benutze oder ob ich einfach <a href="http://vec.at" rel="nofollow">vec.at</a>(x) = vec.back() benutze, oder?</p>
</blockquote>
<p>Bei komplexen Objekten kann <code>swap()</code> effizienter sein, weil keine Kopie benötigt wird. Für <code>int</code> s ist die Zuweisung schneller.</p>
<p>Übrigens solltest du wenn schon <code>operator[]</code> statt <code>at()</code> verwenden. In C++11 kannst du zudem das Objekt verschieben, was ebenfalls sehr effizient ist, allerdings einen Move-Zuweisungsoperator erfordert:</p>
<pre><code>vec[x] = std::move(vec.back());
</code></pre>
<p>GorbGorb schrieb:</p>
<blockquote>
<p>Dekonstruktor</p>
</blockquote>
<p>Uuh.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Destruktor!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312647</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 05 Apr 2013 00:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 07:39:33 GMT]]></title><description><![CDATA[<p>wenn du unnötige Kopier- und Speicher-Operationen vermeiden möchtest, verwende nicht std::vector. nutze dieses kleine Testprogramm zum Prüfen, welche unnötigen Kopieroperationen im Hintergrund ablaufen. verschiedene Stdlib Implementierungen liefern da übrigens unterschiedliche Ergebnisse (MSVC, gcc usw.)</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

class MyInt
  {
public:
  MyInt()
    { m_Value = 0;
      cout &lt;&lt; &quot;MyInt() &quot;; Cout(); }
  MyInt(const MyInt&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;MyInt(c&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout(); }
  MyInt(MyInt&amp;&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;MyInt(&amp;&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout(); }
  MyInt(int i)
    { m_Value = i;
      cout &lt;&lt; &quot;MyInt(&quot; &lt;&lt; i &lt;&lt; &quot;) &quot;; Cout(); }
  ~MyInt()
    { cout &lt;&lt; &quot;~MyInt() &quot;; Cout(); }
  MyInt&amp; operator=(const MyInt&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;operator=(c&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout();
      return *this; }
  MyInt&amp; operator=(MyInt&amp;&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;operator=(&amp;&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout();
      return *this; }
  void setValue(int i)
    { m_Value = i;
      cout &lt;&lt; &quot;setValue(&quot; &lt;&lt; i &lt;&lt; &quot;) &quot;; Cout(); }
private:
  void Cout()
    { cout &lt;&lt; m_Value &lt;&lt; &quot; &quot; &lt;&lt; this &lt;&lt; endl; }
  int m_Value;
  };

int main ()
  {
  {
  vector &lt;MyInt&gt; myVector;
  cout &lt;&lt; &quot;--- vector &lt;MyInt&gt; myVector;&quot; &lt;&lt; endl;
  MyInt myInt;
  cout &lt;&lt; &quot;--- MyInt myInt;&quot; &lt;&lt; endl;
  myVector.push_back(myInt);
  cout &lt;&lt; &quot;--- myVector.push_back(myInt);&quot; &lt;&lt; endl;
  myVector.push_back(myInt);
  cout &lt;&lt; &quot;--- myVector.push_back(myInt);&quot; &lt;&lt; endl;
  myVector.push_back(myInt);
  cout &lt;&lt; &quot;--- myVector.push_back(myInt);&quot; &lt;&lt; endl;
  vector&lt;MyInt&gt;::iterator it = myVector.begin();
  myVector.erase(it);
  cout &lt;&lt; &quot;--- myVector.erase(it);&quot; &lt;&lt; endl;
  myVector.shrink_to_fit();
  cout &lt;&lt; &quot;--- myVector.shrink_to_fit();&quot; &lt;&lt; endl;
  }
  cout &lt;&lt; &quot;--- ~myInt(); ~myVector();&quot; &lt;&lt; endl;
  return 0;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2312670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312670</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Fri, 05 Apr 2013 07:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 08:01:03 GMT]]></title><description><![CDATA[<blockquote>
<p>wenn du unnötige Kopier- und Speicher-Operationen vermeiden möchtest, verwende nicht std::vector.</p>
</blockquote>
<p>Worauf willst Du hinaus? vector hat doch supergeringen Overhead. Das Einzige, was mir einfällt, ist, dass der vector häufig wächst, wenn man sehr viele Elemente einfügt und das kann man durch reserve doch umgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312676</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 05 Apr 2013 08:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 08:03:00 GMT]]></title><description><![CDATA[<p>dd++ schrieb:</p>
<blockquote>
<p>wenn du unnötige Kopier- und Speicher-Operationen vermeiden möchtest, verwende nicht std::vector.</p>
</blockquote>
<p>Das halte ich für einen gefährlichen Tipp. Denn viele Leute wissen nicht, <em>warum</em> sie Kopien vermeiden sollten, sondern finden einfach nur, dass das toll klingt. Sehen aber nicht die Nachteile. Dann nehmen sie am Ende std::list oder ähnliches und wundern sich, warum ihr Programm so lahm ist.</p>
<p>Von vector sollte man nur abweichen, wenn man einen wirklich, wirklich guten Grund hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312678</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Apr 2013 08:03:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:04:53 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>dd++ schrieb:</p>
<blockquote>
<p>wenn du unnötige Kopier- und Speicher-Operationen vermeiden möchtest, verwende nicht std::vector.</p>
</blockquote>
<p>Das halte ich für einen gefährlichen Tipp. Denn viele Leute wissen nicht, <em>warum</em> sie Kopien vermeiden sollten, sondern finden einfach nur, dass das toll klingt. Sehen aber nicht die Nachteile. Dann nehmen sie am Ende std::list oder ähnliches und wundern sich, warum ihr Programm so lahm ist.</p>
</blockquote>
<p>Der Tipp ist ja nicht <code>std::list</code> verwenden. Wer das aus Versehen macht, findet schnell raus, dass der <code>operator[]</code> fehlt. Die <code>std::deque</code> ist schon besser, da wird nie etwas kopiert bei push_* (ausser ev. das einzufügende Element, aber dafür gibt es emplace).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312788</guid><dc:creator><![CDATA[abweichler]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:08:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Von vector sollte man nur abweichen, wenn man einen wirklich, wirklich guten Grund hat.</p>
</blockquote>
<p>Performance? <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>
<p>Ich meine, einerseits beschäftigen sich viele hier mit nichts anderem, als der Fragestellung, wie man unnötige Kopien vermeidet<br />
und im gleichen Atemzug wird für fast jeden Anwendungsfall der vector empfohlen... Da beißt sich die Katze ja irgendwo in den Schwanz. <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/2312792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312792</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:30:30 GMT]]></title><description><![CDATA[<p>It0101 schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Von vector sollte man nur abweichen, wenn man einen wirklich, wirklich guten Grund hat.</p>
</blockquote>
<p>Performance? <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>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Eben drum vector benutzen? Performance ist doch gerade der Grund, deque &amp; Co. wirklich nur dann zu benutzen, wenn man die speziellen Eigenschaften (zum Beispiel löschen am Anfang) ganz dringend braucht. Bei Normalbenutzung hängt ein vector eine deque ganz locker ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312810</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:30:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:32:48 GMT]]></title><description><![CDATA[<p>Es wäre super wenn jemand mal genau schreiben könnte wann man Vector benutzt, wann list und wann deque.<br />
Damit das immer wiederkehrende Fragen danach ein Ende hat <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>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312811</guid><dc:creator><![CDATA[derFer]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:32:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:41:49 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Eben drum vector benutzen? Performance ist doch gerade der Grund, deque &amp; Co. wirklich nur dann zu benutzen, wenn man die speziellen Eigenschaften (zum Beispiel löschen am Anfang) ganz dringend braucht. Bei Normalbenutzung hängt ein vector eine deque ganz locker ab.[/quote]Naja, was man halt so Normalbenutzung nennt.</p>
<pre><code class="language-cpp">int main()
{
    typedef std::array&lt;int, 999&gt; data;
    std::vector&lt;data&gt; container; // bzw. deque
    for (int i=0; i&lt;40000; ++i)
       container.push_back(data{});
}
</code></pre>
<p><a href="http://ideone.com/aQGdGF" rel="nofollow">Vektor: 0.39s</a><br />
<a href="http://ideone.com/l0b8SZ" rel="nofollow">Deque: 0.15s</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312814</guid><dc:creator><![CDATA[abweichler]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:45:53 GMT]]></title><description><![CDATA[<p>Bevor jetzt der Kommentar kommt, man könne auch reserve benutzen: In diesem Fall ist Vektor einem Dynarray unterlegen. Das kann nämlich bei einer moderaten Anzahl Elemente auf dem Stack allokieren, was oft um EINIGES schneller ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312817</guid><dc:creator><![CDATA[abweichler]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:45:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:50:17 GMT]]></title><description><![CDATA[<p>@abweichler:<br />
Super. Du hast eine der beiden Sachen gemessen, die deque besser als vector kann. Einfügen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Nun miss mal die Zugriffszeiten.</p>
<p>Was kommt in normalen Programmen häufiger vor? Einfügen oder Zugriff?</p>
<p>Falls dein Programm tatsächlich nur Daten in Container speichern soll (write only <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="🙂"
    /> ), dann ist deque natürlich der richtige Container. Das ist einer der erwähnten guten Gründe, bei denen man vector nicht nutzen sollte.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25801">@derFer</a>:<br />
Das ist doch nun wirklich leicht bei Google zu finden. Unter anderem:<br />
<a href="http://stackoverflow.com/questions/10699265/how-can-i-efficiently-select-a-standard-library-container-in-c11" rel="nofollow">http://stackoverflow.com/questions/10699265/how-can-i-efficiently-select-a-standard-library-container-in-c11</a><br />
Das Bild <strong>und</strong> die Antworten von Matthieu M. und Nicol Bolas (diese Antwort ganz besonders!) sollten alle Fragen beantworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312819</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 11:55:27 GMT]]></title><description><![CDATA[<p>Im Zweifelsfalle kann man ja zum shared_ptr greifen, wenn das Objekt wirklich viel hin und her kopiert werden soll. Wenn man so wie ich einen Anwendungsfall mit einem Durchsatz von 80.000 pro Sekunde hat, überlegt man sich zwei mal ob man die Objekte nackig in einen Container ( egal welcher ) knallt, oder doch lieber smartpointer nutzt <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/2312825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312825</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Fri, 05 Apr 2013 11:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 12:31:06 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>@abweichler:<br />
Super. Du hast eine der beiden Sachen gemessen, die deque besser als vector kann. Einfügen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Nun miss mal die Zugriffszeiten.</p>
<p>Was kommt in normalen Programmen häufiger vor? Einfügen oder Zugriff?</p>
</blockquote>
<p>Klar, Zugriff kommt häufiger vor. Aber der ist ungefähr gleich schnell. Das Einfügen ist das, was Zeit braucht.</p>
<p>10*2^12 Elemente, 2^18 Zugriffe:<br />
<a href="http://ideone.com/XmEcfq" rel="nofollow">Vektor: 0.55s</a><br />
<a href="http://ideone.com/1v4d8Y" rel="nofollow">Deque: 0.23s</a></p>
<p>10*2^12 Elemente, 2^20 Zugriffe:<br />
<a href="http://ideone.com/6CtOTw" rel="nofollow">Vektor: 0.72s</a><br />
<a href="http://ideone.com/qurGTp" rel="nofollow">Deque: 0.43s</a></p>
<p>10*2^12 Elemente, 2^24 Zugriffe:<br />
<a href="http://ideone.com/5jwZ4D" rel="nofollow">Vektor: 4.78s</a><br />
<a href="http://ideone.com/iQJa4H" rel="nofollow">Deque: 4.49s</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312841</guid><dc:creator><![CDATA[abweichler]]></dc:creator><pubDate>Fri, 05 Apr 2013 12:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 12:38:08 GMT]]></title><description><![CDATA[<p>It0101 schrieb:</p>
<blockquote>
<p>Im Zweifelsfalle kann man ja zum shared_ptr greifen, wenn das Objekt wirklich viel hin und her kopiert werden soll. Wenn man so wie ich einen Anwendungsfall mit einem Durchsatz von 80.000 pro Sekunde hat, überlegt man sich zwei mal ob man die Objekte nackig in einen Container ( egal welcher ) knallt, oder doch lieber smartpointer nutzt <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>
</blockquote>
<p>Für shared_ptr ist das nie ein Grund und ein vector&lt;unique_ptr&lt;nackig&gt; &gt; hat in diesem Fall nur Nachteile gegenüber einer deque&lt;nackig&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312846</guid><dc:creator><![CDATA[abweichler]]></dc:creator><pubDate>Fri, 05 Apr 2013 12:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 12:56:03 GMT]]></title><description><![CDATA[<p>abweichler schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>@abweichler:<br />
Super. Du hast eine der beiden Sachen gemessen, die deque besser als vector kann. Einfügen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Nun miss mal die Zugriffszeiten.</p>
<p>Was kommt in normalen Programmen häufiger vor? Einfügen oder Zugriff?</p>
</blockquote>
<p>Klar, Zugriff kommt häufiger vor. Aber der ist ungefähr gleich schnell. Das Einfügen ist das, was Zeit braucht.</p>
<p>10*2^12 Elemente, 2^18 Zugriffe:<br />
<a href="http://ideone.com/XmEcfq" rel="nofollow">Vektor: 0.55s</a><br />
<a href="http://ideone.com/1v4d8Y" rel="nofollow">Deque: 0.23s</a></p>
<p>10*2^12 Elemente, 2^20 Zugriffe:<br />
<a href="http://ideone.com/6CtOTw" rel="nofollow">Vektor: 0.72s</a><br />
<a href="http://ideone.com/qurGTp" rel="nofollow">Deque: 0.43s</a></p>
<p>10*2^12 Elemente, 2^24 Zugriffe:<br />
<a href="http://ideone.com/5jwZ4D" rel="nofollow">Vektor: 4.78s</a><br />
<a href="http://ideone.com/iQJa4H" rel="nofollow">Deque: 4.49s</a></p>
</blockquote>
<p>Dir ist schon klar, dass ideone ohne Optimierungen compiliert? Niemanden interessiert es, wie schnell unoptimierter Code läuft. Wenn ich bei mir am Rechner mit O3 compiliere, dann ist der vector im letzten Beispiel fast 25% schneller als deque. Außerdem misst du hier vor allem die Geschwindigkeit von rand. Die Schachtelung ist ebenfalls verdächtig, wenn man die Performance von Einfügen und Zugriffen vergleichen will. Ich habe stark den Eindruck, du möchtest den Benchmark manipulieren, bloß um Recht zu behalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312858</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 05 Apr 2013 12:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector Specherfreigabe on Fri, 05 Apr 2013 12:54:57 GMT]]></title><description><![CDATA[<p>Edit: Da war SeppJ schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2312859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2312859</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 05 Apr 2013 12:54:57 GMT</pubDate></item></channel></rss>