<?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[Wahl des Typs eines std::vector]]></title><description><![CDATA[<p>Wenn meine Klasse einen vector und eine Methode in der Form</p>
<pre><code class="language-cpp">std::vector&lt;Foo&gt; foos;
Foo &amp; createFoo(); // Mit absicht kein const
</code></pre>
<p>Wie würde man am geschicktesten und am performancesparendsten ein neues Foo auf das foos werfen und dessen Referenz returnen?</p>
<pre><code class="language-cpp">Foo &amp; createFoo()
{
 Foo f;
 foos.push_back(f);
 return foos.back();
}
</code></pre>
<p>Das geht, aber hier ist für mich eine Erzeugung von Foo zuviel und irgendwie unnötig, da Foo erzeugt wird und dann direkt kopiert wird.</p>
<p>Kann man das umgehen, ohne auf Pointer zu wechseln? Oder geht das nur mit Pointern oder Smart Pointer (natürlich die ohne ownership <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/topic/226009/wahl-des-typs-eines-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 06:06:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226009.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Oct 2008 08:44:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 08:44:04 GMT]]></title><description><![CDATA[<p>Wenn meine Klasse einen vector und eine Methode in der Form</p>
<pre><code class="language-cpp">std::vector&lt;Foo&gt; foos;
Foo &amp; createFoo(); // Mit absicht kein const
</code></pre>
<p>Wie würde man am geschicktesten und am performancesparendsten ein neues Foo auf das foos werfen und dessen Referenz returnen?</p>
<pre><code class="language-cpp">Foo &amp; createFoo()
{
 Foo f;
 foos.push_back(f);
 return foos.back();
}
</code></pre>
<p>Das geht, aber hier ist für mich eine Erzeugung von Foo zuviel und irgendwie unnötig, da Foo erzeugt wird und dann direkt kopiert wird.</p>
<p>Kann man das umgehen, ohne auf Pointer zu wechseln? Oder geht das nur mit Pointern oder Smart Pointer (natürlich die ohne ownership <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/1605918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605918</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:44:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 08:47:38 GMT]]></title><description><![CDATA[<p>Erm, mal wieder die grundsätzliche Frage: Ist das <em>wirklich</em> ein Performanceengpass? Ansonsten würde ich an sowas keinen Gedanken verschwenden. Mal abgesehen davon ist das was Du da treibst u.U. gefährlich. Das hängt davon ab, was Du mit der zurückgegebenen Referenz treibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605919</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 08:52:43 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Das geht, aber hier ist für mich eine Erzeugung von Foo zuviel und irgendwie unnötig, da Foo erzeugt wird und dann direkt kopiert wird.</p>
</blockquote>
<p>Das dürfte aber wegoptimiert werden. Evtl. kannst Du dem Compiler die Optimierung noch vereinfachen, indem Du ein temporäres Objekt übergibst.</p>
<pre><code class="language-cpp">Foo &amp; createFoo()
{
 foos.push_back(Foo()); // oder:
 foos.resize(foos.size() + 1);
 return foos.back();
}
</code></pre>
<p>EDIT: Ok, zumindest meine Compiler optimieren es nicht weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605920</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 08:50:29 GMT]]></title><description><![CDATA[<p>Wie meinst du das? Es ist absicht, dass es nicht const ist und relevante Teile davon sind protected. Alles andere soll direkt modifiziert werden können, da es keine Accessoren für Foo gibt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605921</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 08:53:51 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Wie meinst du das? Es ist absicht, dass es nicht const ist und relevante Teile davon sind protected. Alles andere soll direkt modifiziert werden können, da es keine Accessoren für Foo gibt</p>
</blockquote>
<p>Rödelst Du dabei zufällig auf einer bestimmten foo-Referenz rum, wärend Du mit createFoo() weitere foos in den Vektor packst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605925</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:04:30 GMT]]></title><description><![CDATA[<p>Oh, meinst du damit, dass ne ref auf vector.back() immer auf den letzten zeigen wird (konnte dazu nichts ind er doku finden)? Wenn ich mit der Ref davon arbeite und ein element pushe, so ändert sich die referenz automatisch und zeigt auf das neue letzte element?</p>
<p>Wenn, wie umgeht man das? Mit Foo &amp; const createFoo() ?</p>
<p>Edit: <a href="http://www.cplusplus.com/reference/stl/vector/back.html" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/back.html</a></p>
<blockquote>
<p>Unlike member vector::end, which returns an iterator just past this element, this function returns a direct reference.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1605930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605930</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:04:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:21:23 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Oh, meinst du damit, dass ne ref auf vector.back() immer auf den letzten zeigen wird (konnte dazu nichts ind er doku finden)? Wenn ich mit der Ref davon arbeite und ein element pushe, so ändert sich die referenz automatisch und zeigt auf das neue letzte element?</p>
</blockquote>
<p>Nein, aber wenn Du ein neues Element hinten anfügst, könnte der Vector vergrößert werden. Damit werden alle Elemente umkopiert und alle Referenzen, die Du Dir zuvor geholt hast werden ungültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605935</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:22:22 GMT]]></title><description><![CDATA[<p>Nein. Die Referenz bleibt schon bestehen. Nun ist es aber so, dass ein <code>std::vector</code> eine Kapazität für eine bestimtme Anzahl an Elementen reserviert hat (ob diese nun bereits vorhanden sind oder nicht, spielt keine Rolle). Diese lässt sich mit <code>std::vector::capacity()</code> herausbekommen.<br />
Wenn man ein Element einfügt, und dadurch mehr Elemente im Vektore gespeichert werden müssen als aktuell an Kapazität vorhanden ist, wird die Kapazität vergrößert. Hierfür wird der Vektor komplett neu (mit größerer Kapazität) angelegt und die Elemente kopiert. Zeiger und Referenzen auf Elemente werden hierdurch höchstwahrscheinlich ungültig, da der Vektor sich nicht mehr an der gleichen Speicherstelle befindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605936</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:22:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:23:19 GMT]]></title><description><![CDATA[<p>Wie würde man dieses Problem gescheit vorbeugen können?<br />
Ich weiß nicht, wieviele Features kommen werden, brauche aber eine gültige Referenz auf die einzelnen Objekte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605938</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:25:55 GMT]]></title><description><![CDATA[<p>1. Du könntest statt einer Referenz den Index zurückgeben, und Dir vor jedem Zugriff (gern auch vor einer Serie von Zugriffen) die Referenz holen und nach dem Zugriff wieder vergessen.<br />
2. Du könntest den Container wechseln. std::list garantiert z.B., dass Referenzen beim Einfügen und Löschen gültig bleiben (ausser die Referenz auf ein gelöschtes Objekt, natürlich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605941</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wahl des Typs eines std::vector on Tue, 28 Oct 2008 09:42:32 GMT]]></title><description><![CDATA[<p>Danke,<br />
ich werde erstmal list probieren.</p>
<p>Hast du nen link bezüglich list, ich konnte bei <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> nicht aus der list definition rauslesen, dass sie sich so verhält</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605945</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 28 Oct 2008 09:42:32 GMT</pubDate></item></channel></rss>