<?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[Verständnissfrage std::vector]]></title><description><![CDATA[<p>Kurzer Beispielcode:</p>
<pre><code>class Entry
{
...
public:
std::string getData() {...}
...};

class Database
{
std::vector&lt;Entry&gt; m_EntryList;
...

...
Entry* CreateNewEntry() {m_EntryList.push_back(Entry); return &amp;m_EntryList.back();}
</code></pre>
<p>Ich möchte mehrere Entry-Klassen in Database speichern, wenn ich ein Entry erstelle gibt er mir einen Pointer auf den neusten Entry zurück damit ich die Klasse manuell mit Daten auffüllen kann.</p>
<p>PROBLEM:</p>
<pre><code>//...
Entry* Entry1 = MyDatabase-&gt;CreateNewEntry();
Entry* Entry2 = MyDatabase-&gt;CreateNewEntry();
Entry1-&gt;getData(); //FEHLER DA POINTER NICHT MEHR GÜLTIG!

//...
</code></pre>
<p>Liege ich damit richtig dass beim erstellen von Entry2 der erste Eintrag umkopiert wird und damit einen neuen Speicherbereich erhält? Gibt es eine Möglichkeit dieses umkopieren zu verhindern oder muss ich das völlig anders lösen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261686/verständnissfrage-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 03:47:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261686.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Feb 2010 13:39:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 13:39:37 GMT]]></title><description><![CDATA[<p>Kurzer Beispielcode:</p>
<pre><code>class Entry
{
...
public:
std::string getData() {...}
...};

class Database
{
std::vector&lt;Entry&gt; m_EntryList;
...

...
Entry* CreateNewEntry() {m_EntryList.push_back(Entry); return &amp;m_EntryList.back();}
</code></pre>
<p>Ich möchte mehrere Entry-Klassen in Database speichern, wenn ich ein Entry erstelle gibt er mir einen Pointer auf den neusten Entry zurück damit ich die Klasse manuell mit Daten auffüllen kann.</p>
<p>PROBLEM:</p>
<pre><code>//...
Entry* Entry1 = MyDatabase-&gt;CreateNewEntry();
Entry* Entry2 = MyDatabase-&gt;CreateNewEntry();
Entry1-&gt;getData(); //FEHLER DA POINTER NICHT MEHR GÜLTIG!

//...
</code></pre>
<p>Liege ich damit richtig dass beim erstellen von Entry2 der erste Eintrag umkopiert wird und damit einen neuen Speicherbereich erhält? Gibt es eine Möglichkeit dieses umkopieren zu verhindern oder muss ich das völlig anders lösen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859528</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 22 Feb 2010 13:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 13:51:13 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<p>Liege ich damit richtig dass beim erstellen von Entry2 der erste Eintrag umkopiert wird und damit einen neuen Speicherbereich erhält? Gibt es eine Möglichkeit dieses umkopieren zu verhindern oder muss ich das völlig anders lösen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<ol>
<li>Ja, es wird das interne Array umkopiert, wenn der Vector wachsen muss.</li>
<li>Ja, verwende einen Vector mit Pointern. Wenn deine createEntry-Methode eh nen pointer zurück liefert, kannst du die auch gleich im Vector speichern. Der Pointer bleibt dann auch gültig.</li>
</ol>
<pre><code class="language-cpp">class Database
{
std::vector&lt;Entry*&gt; m_EntryList;
...

...
Entry* CreateNewEntry() {
    Entry* e = new Entry;
    m_EntryList.push_back(e);
    return e;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1859541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859541</guid><dc:creator><![CDATA[Bloßfüßler]]></dc:creator><pubDate>Mon, 22 Feb 2010 13:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 13:53:16 GMT]]></title><description><![CDATA[<p>Vielen dank für die schnelle Antwort. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859546</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 22 Feb 2010 13:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 14:06:53 GMT]]></title><description><![CDATA[<p>Ein Umkopieren kannst du auch verhindern, in dem du mit reserve schon einmal bekannt gibst, wie viele Platz du gleich brauchen wirst.<br />
Macht natürlich nur Sinn, wenn du das schon vorher weißt. Bei dir ist das wahrscheinlich jetzt nicht der Fall, sollte man aber im Hinterkopf behalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859556</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 22 Feb 2010 14:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 18:21:45 GMT]]></title><description><![CDATA[<p>Wenn Referenzen, Zeiger und Iteratoren auf die Elemente gültig bleiben müssen, ist <code>std::list</code> eine sehr gute Wahl für einen sequentiellen Container. Mit <code>std::vector::reserve()</code> hat man das gleiche Problem wie mit statischen Arrays: Man kann die Grösse nicht dynamisch vorhersagen, und zu waghalsige Schätzungen können viel Speicher verschwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859702</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Feb 2010 18:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 18:26:02 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Ein Umkopieren kannst du auch verhindern, in dem du mit reserve schon einmal bekannt gibst, wie viele Platz du gleich brauchen wirst.<br />
Macht natürlich nur Sinn, wenn du das schon vorher weißt. Bei dir ist das wahrscheinlich jetzt nicht der Fall, sollte man aber im Hinterkopf behalten.</p>
</blockquote>
<p>Dann lieber std::array, weil man dann nicht ausversehen nochmal die Größe ändern kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859703</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Mon, 22 Feb 2010 18:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnissfrage std::vector on Mon, 22 Feb 2010 19:05:51 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Dann lieber std::array, weil man dann nicht ausversehen nochmal die Größe ändern kann.</p>
</blockquote>
<p>Da muss die Grösse aber schon zur Kompilierzeit bekannt sein. Ausserdem eignet sich der Stack nicht für sehr grosse Speicherbereiche (da der Container seine Objekte auf dem Stack anfordert, wenn er nicht selbst im Freestore/Heap bzw. im statischen Bereich liegt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859726</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Feb 2010 19:05:51 GMT</pubDate></item></channel></rss>