<?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[Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden?]]></title><description><![CDATA[<p>Die Frage ist rein akademischer Natur, möchte ich trotzdem aber mal geklärt haben.<br />
Folgender Code:</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.resize(10);
vec.resize(0);
vec.clear();
</code></pre>
<p>Meine Frage ist, ob es vom Standard garantiert ist, dass <code>capacity()</code> den gleichen Wert vor und nach <code>resize(0)</code> bzw. <code>clear()</code> zurückgibt.<br />
Laut Standard verhält sich <code>resize(0)</code> wie <code>erase(vec.begin(),vec.end())</code> . erase invalidiert keine Iteratoren vor den gelöschten Elementen - bis zu einem <code>resize(1)</code> müsste also garantiert sein, dass keine Reallokation stattfindet. Problematisch wird es bei <code>resize(0)</code> , denn da ohnehin alle Iteratoren invalidiert werden, kann ich gerade keinen Grund finden, der einer Implementation verbieten würde, die Kapazität in diesem Fall zu verringern. Bei <code>clear()</code> sowieso nicht.<br />
Gibt es diesbezüglich noch Stellen im Standard, die ich nicht gesehen bzw. falsch interpretiert habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306355/kann-in-einem-vector-jemals-eine-verringerung-der-kapazität-beim-löschen-aller-elemente-stattfinden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 07:36:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306355.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jul 2012 21:39:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Wed, 25 Jul 2012 22:27:48 GMT]]></title><description><![CDATA[<p>Die Frage ist rein akademischer Natur, möchte ich trotzdem aber mal geklärt haben.<br />
Folgender Code:</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.resize(10);
vec.resize(0);
vec.clear();
</code></pre>
<p>Meine Frage ist, ob es vom Standard garantiert ist, dass <code>capacity()</code> den gleichen Wert vor und nach <code>resize(0)</code> bzw. <code>clear()</code> zurückgibt.<br />
Laut Standard verhält sich <code>resize(0)</code> wie <code>erase(vec.begin(),vec.end())</code> . erase invalidiert keine Iteratoren vor den gelöschten Elementen - bis zu einem <code>resize(1)</code> müsste also garantiert sein, dass keine Reallokation stattfindet. Problematisch wird es bei <code>resize(0)</code> , denn da ohnehin alle Iteratoren invalidiert werden, kann ich gerade keinen Grund finden, der einer Implementation verbieten würde, die Kapazität in diesem Fall zu verringern. Bei <code>clear()</code> sowieso nicht.<br />
Gibt es diesbezüglich noch Stellen im Standard, die ich nicht gesehen bzw. falsch interpretiert habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235761</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 25 Jul 2012 22:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 07:21:24 GMT]]></title><description><![CDATA[<p>Der vector wird seine capacity bei diesen Aktionen nicht verringern. Um diesen Effekt zu erreichen:</p>
<p>Vor C++11:<br />
vector&lt;foo&gt;(foovector).swap(foovector);</p>
<p>C++11:<br />
<a href="http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit" rel="nofollow">shrink_to_fit()</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235814</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Jul 2012 07:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 07:28:09 GMT]]></title><description><![CDATA[<p>Der Standard garantiert, dass die Capacity nie verringert wird, mit 1 bzw. 2 Ausnahmen:</p>
<ol>
<li>swap() mit einem vector geringerer capacity (swap tauscht eben wirklich <em>alles</em>)</li>
<li>seit C++11 shrink_to_fit(), was genau das macht was der Name sagt: capacity auf die tatsächliche Größe zusammenschrumpfen.</li>
</ol>
<p>Grund: Die Capacity zu reduzieren erfordert eine Neuallokation von Speicher sowie das Kopieren aller Elemente (falls der vector nicht ganz leer ist) sowie das Freigeben des bis dahin belegten Speichers. Da das auf jeden Fall mehr Zeit kostet als einfach bis zum Destruktor auf die Speicherfreigabe zu warten, muss das immer explizit funktionieren.</p>
<p>in C++98 kannst du shrink_to_fit simulieren, indem du den vector in einen temporären vector kopierst und im selben Atemzug mit ihm swapst:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; myvec;
//füllen, löschen,...

std::vector&lt;int&gt;(myvec).swap(myvec);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235818</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 07:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 08:01:47 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Der Standard garantiert, dass die Capacity nie verringert wird, mit 1 bzw. 2 Ausnahmen:</p>
</blockquote>
<p>Kannst Du mir bitte sagen, wo das steht?<br />
Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
<p>Athar schrieb:</p>
<blockquote>
<p>Meine Frage ist, ob es vom Standard garantiert ist, dass <code>capacity()</code> den gleichen Wert vor und nach <code>resize(0)</code> bzw. <code>clear()</code> zurückgibt.</p>
</blockquote>
<p>Bis man mich also mit der Nase daraufstößt, lautet meine Antwort: &quot;Nein, das ist nicht garantiert. Aber sehr wahrscheinlich.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235831</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 26 Jul 2012 08:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 08:12:18 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Der Standard garantiert, dass die Capacity nie verringert wird, mit 1 bzw. 2 Ausnahmen:</p>
</blockquote>
<p>Kannst Du mir bitte sagen, wo das steht?<br />
Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
</blockquote>
<p>Wenn anderswo nicht gesagt wird, dass eine Neuallokation stattfindet, dann darf auch keine Neuallokation stattfinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235835</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 26 Jul 2012 08:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 08:42:16 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Kannst Du mir bitte sagen, wo das steht?</p>
</blockquote>
<p>Hauptsächlich in den Komplexitätsanforderungen der einzelnen Operationen sowie in den Anforderungen an Iteratorstabilität:<br />
Wie gesagt müsste eine Reduzierung der Kapazität durch Deallokation und Neuallokation erfolgen, vor allem die (tendenziell sehr teure) Kopie der Elemente würde mit einen Komplexität von O(N) zu Buche schlagen, was nicht der Fall ist. Außerdem würde eine Reallokation mit Verschiebung aller Elemente sämtliche Iteratoren in den vector invalidieren.</p>
<p>- resize(sz) ist gleichbedeutend mit erase(begin()+sz, end()), falls sz &lt; size() (§23.3.6.3)<br />
- erase(a, b) Effekt: Invalidiert nur Iteratoren auf oder hinter die gelöschten Elemente. Komplexität: ruft den Destruktor von T nur so oft auf, wie Elemente gelöscht wurden (vor allem: keine Erwähnung von Speicherfreigabe)</p>
<p>Zusammen: resize(0) darf keinen Speicher freigeben.</p>
<p>Bei clear() habe ich grade eine Überraschung erlebt: der Standard (zumindest N3291) beschreibt für vector::clear erstaunlich wenig, vor Allem steht da tatsächlich nichts zu Deallokationen und Komplexität, was mir ehrlich gesagt nach einem Fehler im Standard vorkommt. Vielleicht habe ich den betreffenden Paragraphen aber auch übersehen. Typische Implementierungen setzen clear() allerdings gleich mit resize(0).</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn anderswo nicht gesagt wird, dass eine Neuallokation stattfindet, dann darf auch keine Neuallokation stattfinden.</p>
</blockquote>
<p>Jein. Wenn keine expliziten Komplexitätsanforderungen vorhanden sind (wie bei clear()), wäre eine Deallokation/Neuallokation in meinen Augen standardkonform (wenn auch unsinnig).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235842</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 08:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 09:00:04 GMT]]></title><description><![CDATA[<p>shrink_to_fit ist ein &quot;non-binding request to reduce capacity() to size(). [Note: The request is non-binding to allow latitude for implementation-specific optimizations. - end note]&quot;</p>
<p>Also so richtig verlassen kann man sich da scheinbar auch nicht drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235850</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 26 Jul 2012 09:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 09:10:58 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Der Standard garantiert, dass die Capacity nie verringert wird, mit 1 bzw. 2 Ausnahmen:</p>
</blockquote>
<p>Kannst Du mir bitte sagen, wo das steht?<br />
Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
</blockquote>
<p>Und das genügt.<br />
capacity ändert sich nicht, es sei denn:<br />
- eine Operation ändert sie ausdrücklich (reserve, shrink_to_fit), oder<br />
- dies wird durch die Operation impliziert (einfügen bis size&gt;capacity (da immer gilt capacity()&gt;=size() ), swap, oder wenn der vector gemoved wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235856</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 26 Jul 2012 09:10:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 09:08:51 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Also so richtig verlassen kann man sich da scheinbar auch nicht drauf.</p>
</blockquote>
<p>Ist im Grunde das Selbe wie bei reserve(): resere(N) garantiert nur, dass capacity() &gt;= N, nicht capacity() == N.</p>
<p>Konstruiertes Beispiel: Ich implementiere eine Standardbibliothek für ein System, auf dem Speicher nur in 8-byte-Blöcken angefordert werden kann. Eine capacity() von 4 oder 5 macht dann keinen Sinn. Einen vector mit ehemals 16 Elementen auf 9 Elemente zu resizen lässt und dann shrink_to_fitten hat beim shrink_to_fit keinen Effekt, die capacity() bleibt bei 16...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235857</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 09:08:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 09:21:11 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Hauptsächlich in den Komplexitätsanforderungen der einzelnen Operationen sowie in den Anforderungen an Iteratorstabilität:</p>
</blockquote>
<p>Du meinst:</p>
<p>C++11 schrieb:</p>
<blockquote>
<p>23.2.1 General container requirements<br />
[...]<br />
11 Unless otherwise specified (either explicitly or by defining a function in terms of other functions), invoking a container member function or passing a container as an argument to a library function shall not invalidate iterators to, or change the values of, objects within that container.</p>
</blockquote>
<p>Sowohl <code>erase()</code> als auch <code>clear()</code> invalidieren allerdings (alle) Iteratoren.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Wie gesagt müsste eine Reduzierung der Kapazität durch Deallokation und Neuallokation erfolgen, vor allem die (tendenziell sehr teure) Kopie der Elemente würde mit einen Komplexität von O(N) zu Buche schlagen, was nicht der Fall ist. Außerdem würde eine Reallokation mit Verschiebung aller Elemente sämtliche Iteratoren in den vector invalidieren.</p>
<p>- resize(sz) ist gleichbedeutend mit erase(begin()+sz, end()), falls sz &lt; size() (§23.3.6.3)<br />
- erase(a, b) Effekt: Invalidiert nur Iteratoren auf oder hinter die gelöschten Elemente. Komplexität: ruft den Destruktor von T nur so oft auf, wie Elemente gelöscht wurden (vor allem: keine Erwähnung von Speicherfreigabe)</p>
<p>Zusammen: resize(0) darf keinen Speicher freigeben.</p>
</blockquote>
<p>Zur Erinnerung: im OP war die Frage nach capacity an zwei Stellen, wo der Vektor keinen Speicher mehr für die Nutzdaten benötigt, weil <code>size()==0</code> .</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.resize(10);
const auto cap = vec.capacity(); // 9 &lt; cap
vec.resize(0);  // Vektor leer, D'tor fuer alle aufgerufen, alle(!) Iteratoren invalide
assert(cap == vec.capacity());
vec.clear(); // dto.
assert(cap == vec.capacity());
</code></pre>
<p>Der TE hat - wie ich auch - das Problem jetzt irgendeinen Hinweis dafür zu finden, dass nachdem eh alle Iteratoren, Referenzen und Pointer ungültig sind eine Implementierung garantiert die Kapazität beibehält...</p>
<p>Athar schrieb:</p>
<blockquote>
<p>[...]<br />
Problematisch wird es bei <code>resize(0)</code> , denn da ohnehin alle Iteratoren invalidiert werden, kann ich gerade keinen Grund finden, der einer Implementation verbieten würde, die Kapazität in diesem Fall zu verringern. Bei <code>clear()</code> sowieso nicht.<br />
Gibt es diesbezüglich noch Stellen im Standard, die ich nicht gesehen bzw. falsch interpretiert habe?</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Kann sein, dass Du recht hast. Und keine Implementierung wird es wohl anders machen, aber da es eine &quot;akademische Frage&quot; ist kann man schon noch ein wenig Standard lesen und diskutieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235861</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 26 Jul 2012 09:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 09:50:05 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
</blockquote>
<p>Und das genügt.</p>
</blockquote>
<p>Stimmt, einfaches Beispiel:</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.reserve(12); //N = 12
vec.resize(10);  //size &lt; N
vec.resize(0);   //size &lt; N, a)
vec.clear();     //size &lt; N, b)
vec.resize(11);  //size &lt; N, c)
</code></pre>
<p>Wenn a) oder b) hier Kapazität freigegeben hätten, müsste bei c) eine Neuallokation stattfinden =&gt; darf nicht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235868</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 09:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 11:08:57 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wenn a) oder b) hier Kapazität freigegeben hätten, müsste bei c) eine Neuallokation stattfinden =&gt; darf nicht sein.</p>
</blockquote>
<p>In der Tat, mit reserve() ist das garantiert. Aber was passiert, wenn du reserve weglässt?<br />
Der vector könnte sich merken, ob reserve aufgerufen wurde oder nicht - falls nicht, dann wäre er nicht mehr an diese Anforderung gebunden.</p>
<p>Mir fehlt da im Standard eine klare Aussage, zum Beispiel ein Hinweis darauf, dass Reallokation nur dann stattfinden darf, wenn es explizit erwähnt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235888</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 26 Jul 2012 11:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 11:11:53 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Die Capacity zu reduzieren erfordert eine Neuallokation von Speicher</p>
</blockquote>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235894</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 26 Jul 2012 11:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 11:13:38 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Der vector könnte sich merken, ob reserve aufgerufen wurde oder nicht - falls nicht, dann wäre er nicht mehr an diese Anforderung gebunden.</p>
</blockquote>
<p>Ah, also 1) zusätzlichen Platz verbraten, um sich den reserve zu merken, und 2) zusätzliche Zeit verbraten, um zu schauen, was das reserve-Flag sagt und ggf. noch mehr Zeit verbraten, um den Speicher freizugeben, weil der Standard es ja nicht verbietet.</p>
<p>Ja, das dürfte der vector durchaus machen.</p>
<p>Er dürfte auch alle Primzahlen &lt; 2^18 berechnen bei jeder Operation. Wäre zwar lahm, aber nicht abhängig von der Größe, also O(1), durchaus erlaubt. Und hey, er könnte ich rein theoretisch noch ein paar Flags speichern, z.B. im Ctor das Betriebssystem fragen, ob vielleicht eine Webcam angeschlossen ist. Könnte ja sein. Ist ja nicht verboten...</p>
<p>Wie abstrus darf es werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235895</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 11:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 11:16:29 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Die Capacity zu reduzieren erfordert eine Neuallokation von Speicher</p>
</blockquote>
<p>Warum?</p>
</blockquote>
<p>Ok, ungenau ausgedrückt.</p>
<p>Die Capacity <em>auf einen Wert != 0</em> zu reduzieren erfordert eine Neuallokation von Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235896</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 Jul 2012 11:16:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 11:26:53 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wie abstrus darf es werden?</p>
</blockquote>
<p>Beliebig. Es ist eigentlich klar, dass das kaum ein vernünftiger Mensch so implementieren würde - wobei die Vorstellung, dass ein vector den Speicher bei einem clear() komplett freigibt, nicht völlig abstrus ist - viele Anfänger rechnen sogar damit. Im Prinzip geht es nur darum, ob man einen konformierenden vector bauen kann, der das tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235899</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 26 Jul 2012 11:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 14:40:18 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Die Capacity <em>auf einen Wert != 0</em> zu reduzieren erfordert eine Neuallokation von Speicher.</p>
</blockquote>
<p>Es sei denn, der vector kann einige Elemente selbst enthalten (small-string-Optimierung).</p>
<p>Edit: stellt ein paar zusätzliche Bedingungen an die Elemente (noexcept-move), sonst gibts Probleme beim swap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235959</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 26 Jul 2012 14:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 14:39:19 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Ok, ungenau ausgedrückt.</p>
<p>Die Capacity <em>auf einen Wert != 0</em> zu reduzieren erfordert eine Neuallokation von Speicher.</p>
</blockquote>
<p>Darum gings mir jetzt gar nicht. Woraus folgt denn, dass neuer Speicher allokiert werden muss? Die Laufzeitumgebung könnte auch*, wenn die erste Hälfte des allozierten Speichers für den vector ausreicht, in die zweite Hälfte ein anderes Objekt speichern. Somit ist die Kapazität gesunken, aber es wurde kein neuer Speicher alloziert.</p>
<p>*: Keine Ahnung, ob sie es kann und ob es erlaubt ist. Deshalb frage ich ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235960</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 26 Jul 2012 14:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 14:42:31 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
</blockquote>
<p>Und das genügt.</p>
</blockquote>
<p>Stimmt, einfaches Beispiel:</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.reserve(12); //N = 12
vec.resize(10);  //size &lt; N
vec.resize(0);   //size &lt; N, a)
vec.clear();     //size &lt; N, b)
vec.resize(11);  //size &lt; N, c)
</code></pre>
<p>Wenn a) oder b) hier Kapazität freigegeben hätten, müsste bei c) eine Neuallokation stattfinden =&gt; darf nicht sein.</p>
</blockquote>
<p>Die Argumentation würde doch genau so gut für <code>vector&lt;int&gt;().swap(vec)</code> funktionieren, und das implementieren wohl alle (sinnvollerweise) so, dass <code>vec</code> danach <code>capacity() == 0</code> (bzw. <code>capacity() == smallConstantValue</code> , bei SSO).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235962</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 26 Jul 2012 14:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 14:46:53 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Ich finde nur die Garantie, dass nach <code>reserve(N)</code> keine Neuallokation stattfindet bis <code>size() &gt; N</code> . (Siehe C++11 23.3.6.3 vector capacity).</p>
</blockquote>
<p>Und das genügt.</p>
</blockquote>
<p>Stimmt, einfaches Beispiel:</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec;
vec.reserve(12); //N = 12
vec.resize(10);  //size &lt; N
vec.resize(0);   //size &lt; N, a)
vec.clear();     //size &lt; N, b)
vec.resize(11);  //size &lt; N, c)
</code></pre>
<p>Wenn a) oder b) hier Kapazität freigegeben hätten, müsste bei c) eine Neuallokation stattfinden =&gt; darf nicht sein.</p>
</blockquote>
<p>Die Argumentation würde doch genau so gut für <code>vector&lt;int&gt;().swap(vec)</code> funktionieren, und das implementieren wohl alle (sinnvollerweise) so, dass <code>vec</code> danach <code>capacity() == 0</code> (bzw. <code>capacity() == smallConstantValue</code> , bei SSO).</p>
</blockquote>
<p>swap vertauscht die Resourcen der beiden Container. In diesem Fall ist die Änderung von capacity durch die Operation impliziert, bzw. es ist garantiert dass der reservierte Speicher im anderen Container weiterlebt.</p>
<pre><code class="language-cpp">vector&lt;int&gt; vec, vec2;
vec.reserve(12); //N = 12
vec.resize(10);  //size &lt; N
vec.swap(vec2);
vec2.resize(0);   //size &lt; N, a)
vec2.clear();     //size &lt; N, b)
vec2.resize(11);  //size &lt; N, c)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235965</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 26 Jul 2012 14:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 14:54:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Mir ist klar was passiert.<br />
Hier ging es aber glaube ich um die Frage was und vor allem wo der Standard das garantiert bzw. vorschreibt.</p>
<p>Gibt es eine Passage in der Beschreibung von <code>vector::swap</code> (oder sonstwo) die das wirklich klar sagt, oder ist es nur impliziert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235968</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 26 Jul 2012 14:54:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 15:10:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Gibt es eine Passage in der Beschreibung von <code>vector::swap</code> (oder sonstwo) die das wirklich klar sagt, oder ist es nur impliziert?</p>
</blockquote>
<p>Es steht explizit im Std., dass capacity() mitgetauscht wird. (kein Exemplar zur Hand... <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="😞"
    /> )<br />
Etwas unterspezifiziert, bzw. ungenau finde ich jetzt, ob in campers Beispiel, die Eigenschaft &quot;für diesen Vector wurde reserve() aufgerufen&quot; &quot;mitgeswapped&quot; wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235973</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 26 Jul 2012 15:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 15:14:09 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Gibt es eine Passage in der Beschreibung von <code>vector::swap</code> (oder sonstwo) die das wirklich klar sagt, oder ist es nur impliziert?</p>
</blockquote>
<p>Der Standard verlangt, dass iteratoren gültig bleiben nur eben jetzt auf den anderen Container verweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235976</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 26 Jul 2012 15:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 15:50:51 GMT]]></title><description><![CDATA[<p>OK, das sollte dann reichen <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/2235985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235985</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 26 Jul 2012 15:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 21:51:31 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>OK, das sollte dann reichen <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>
</blockquote>
<p>Also sind wir uns einig, dass es die geforderte Garantie nicht gibt?<br />
Diejenigen, die das Gegenteil behauptet haben sind schließlich einen Beweis schuldig geblieben.<br />
Was fuer den Standard spricht: eine definitive Aussage in die eine oder andere Richtung wäre eine Einschränkung der Implementierung. (Speicher wird immer<br />
freigebeben/nie freigegeben).</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Polemik ignoriert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2236086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2236086</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 26 Jul 2012 21:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kann in einem vector jemals eine Verringerung der Kapazität beim Löschen aller Elemente stattfinden? on Thu, 26 Jul 2012 23:30:38 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>OK, das sollte dann reichen <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>
</blockquote>
<p>Also sind wir uns einig, dass es die geforderte Garantie nicht gibt?</p>
</blockquote>
<p>Weiss nicht.<br />
Von welcher Garantie sprichst du jetzt genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2236104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2236104</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 26 Jul 2012 23:30:38 GMT</pubDate></item></channel></rss>