<?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[Baeume mit vector und das Speichern von Pfaden]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielleicht ist dies ja ein Standardproblem, und falls mich jemand auf entprechende Literatur hinweisen kann, waere ich sehr dankbar.</p>
<p>Ich moechte einen Baum aufbauen und verschiedene Pfade durch Pfade durch den Baum speichern (um sie spaeter bearbeiten zu koennen). Ich weiss zur Zeit der Implementierung noch nicht, wieviele Kinder ein Knoten bekommt, deswegen habe ich sie als vector&lt;Foo&gt; vorliegen, etwa so:</p>
<pre><code>class Foo {
  [...]
  private: std::vector&lt;Foo&gt;  children;
  [...]
}
</code></pre>
<p>Um die Pfade zu speichern, benutze ich einen</p>
<pre><code>vector&lt;vector&lt;Foo*&gt; &gt; paths;
</code></pre>
<p>(oder auch einen iterator statt Foo*).</p>
<p>Das Problem:<br />
Wenn 'children' ueber seine Kapazitaet waechst, werden die Zeiger in 'paths', die auf die Foos in dem entsprechenden vector zeigen, ungueltig.</p>
<p>Ich sehe drei Moeglichkeiten:</p>
<ol>
<li>Bevor ich ein 'children' durch push_back <a href="http://o.ae" rel="nofollow">o.ae</a>. veraendere, vergleiche ich capacity() und size(). Wenn der vector vergroessert werden muss, passe ich die entsprechenden Zeiger an - das erscheint mir sehr, sehr aufwendig, v.a. das Herausfinden, welche Zeiger aus paths gerade auf das 'children' zeigen, welches veraendert wird.</li>
<li>Ich reserviere viel Platz fuer 'children', damit es waehrend der Laufzeit nicht zu einem 'resize' kommt - falls doch, koennte ich eine exception werfen und das Programm zumindest abbrechen lassen</li>
<li>Ich lasse 'children' ganz weg und speichere die Wege durch den Baum direkt als Objecte, also 'vector&lt;vector&lt;Foo&gt;&gt; - dadurch wird der Baum jedoch doppelt und dreifach gespeichert.</li>
</ol>
<p>Obwohl mein Baum vermutlich nicht sehr gross wird, so dass 2)+3) moeglich waeren, bin ich mit diesen beiden Punkten als Loesung sehr unzufrieden.<br />
Und bei Punkt 1 koennte ich dann doch auf Fortran oder C zurueckgreifen und statische Arrays benutzen. Das wirkt mir auch nicht korrekt.</p>
<p>Die Frage:</p>
<p>Kann mir jemand sagen, wie man so ein Problem korrekt und elegant in C++ implementiert?<br />
Vielen Dank fuer jegliche Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153761/baeume-mit-vector-und-das-speichern-von-pfaden</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 16:13:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153761.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Jul 2006 10:36:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 10:36:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielleicht ist dies ja ein Standardproblem, und falls mich jemand auf entprechende Literatur hinweisen kann, waere ich sehr dankbar.</p>
<p>Ich moechte einen Baum aufbauen und verschiedene Pfade durch Pfade durch den Baum speichern (um sie spaeter bearbeiten zu koennen). Ich weiss zur Zeit der Implementierung noch nicht, wieviele Kinder ein Knoten bekommt, deswegen habe ich sie als vector&lt;Foo&gt; vorliegen, etwa so:</p>
<pre><code>class Foo {
  [...]
  private: std::vector&lt;Foo&gt;  children;
  [...]
}
</code></pre>
<p>Um die Pfade zu speichern, benutze ich einen</p>
<pre><code>vector&lt;vector&lt;Foo*&gt; &gt; paths;
</code></pre>
<p>(oder auch einen iterator statt Foo*).</p>
<p>Das Problem:<br />
Wenn 'children' ueber seine Kapazitaet waechst, werden die Zeiger in 'paths', die auf die Foos in dem entsprechenden vector zeigen, ungueltig.</p>
<p>Ich sehe drei Moeglichkeiten:</p>
<ol>
<li>Bevor ich ein 'children' durch push_back <a href="http://o.ae" rel="nofollow">o.ae</a>. veraendere, vergleiche ich capacity() und size(). Wenn der vector vergroessert werden muss, passe ich die entsprechenden Zeiger an - das erscheint mir sehr, sehr aufwendig, v.a. das Herausfinden, welche Zeiger aus paths gerade auf das 'children' zeigen, welches veraendert wird.</li>
<li>Ich reserviere viel Platz fuer 'children', damit es waehrend der Laufzeit nicht zu einem 'resize' kommt - falls doch, koennte ich eine exception werfen und das Programm zumindest abbrechen lassen</li>
<li>Ich lasse 'children' ganz weg und speichere die Wege durch den Baum direkt als Objecte, also 'vector&lt;vector&lt;Foo&gt;&gt; - dadurch wird der Baum jedoch doppelt und dreifach gespeichert.</li>
</ol>
<p>Obwohl mein Baum vermutlich nicht sehr gross wird, so dass 2)+3) moeglich waeren, bin ich mit diesen beiden Punkten als Loesung sehr unzufrieden.<br />
Und bei Punkt 1 koennte ich dann doch auf Fortran oder C zurueckgreifen und statische Arrays benutzen. Das wirkt mir auch nicht korrekt.</p>
<p>Die Frage:</p>
<p>Kann mir jemand sagen, wie man so ein Problem korrekt und elegant in C++ implementiert?<br />
Vielen Dank fuer jegliche Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1100980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100980</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 10:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 10:40:27 GMT]]></title><description><![CDATA[<p>Weis jetzt nicht was das denn für Objekte Foo sind,<br />
aber würde es gehen, wenn Du (const) Referenzen statt Zeiger im Vector speicherst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1100986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100986</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Thu, 20 Jul 2006 10:40:27 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 10:55:54 GMT]]></title><description><![CDATA[<p>Das koennte gehen, ich werde mal versuchen, es zu implementieren. Vielen Dank fuer den Tip!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101020</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 10:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 11:41:23 GMT]]></title><description><![CDATA[<p>Ich muss doch noch mal nachfragen, wie man korrekt einen vector aus Referenzen aufsetzt. Ich habe ein paar Sachen probiert, und ellenlange STL-Fehlermeldungen bekommen, weil ich versuchte, zeiger zuf referenzen oder referenzen auf referenzen zu erzeugen usw.</p>
<pre><code>std::vector&lt;int&amp;&gt; refs;
</code></pre>
<p>Das allein erzeugt schon Unmengen an Fehlermeldungen.<br />
Der zweite Versuch,</p>
<pre><code>std::vector&lt;int&gt; refs;
int i = 4;
int &amp;r = i;

refs.push_back(r);
</code></pre>
<p>Speichert (wie erwartet) eine Kopie von r, und nicht r selber, so dass Aenderungen an i oder r nicht in refs widergespiegelt werden.</p>
<p>Koennte ich da noch einen Hinweis bekommen, bitte?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101083</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 11:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 11:46:24 GMT]]></title><description><![CDATA[<p>Referenzen können nicht in einem Vector gespeichert werden, da sie sich nicht kopieren lassen! Du musst da mit Zeigern arbeiten:<br />
vector&lt;int *&gt; Vector;</p>
<p>Das funktioniert ohne Probleme!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101095</guid><dc:creator><![CDATA[KPC]]></dc:creator><pubDate>Thu, 20 Jul 2006 11:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 12:07:21 GMT]]></title><description><![CDATA[<p>Nein, das tut es nicht. Vielleicht illustriert folgendes Programm mein Problem ein wenig:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

int main() {
    std::vector&lt;int&gt; vec;
    std::vector&lt;int*&gt; vptr;

    vec.reserve(3);

    for(int run = 0; run &lt; 2; ++run) {
        std::cout &lt;&lt; &quot;Kapazitaet von vec: &quot; &lt;&lt; vec.capacity()
            &lt;&lt; &quot; Groesse: &quot; &lt;&lt; vec.size() &lt;&lt; '\n';
        for(int i = 0; i &lt; 3; ++i) {
            vec.push_back(i);
            vptr.push_back(&amp; vec.back());
        }

        // Kontrolle:
        std::cout &lt;&lt; &quot;Adressenvergleich:\n&quot;;
        for (unsigned int i = 0; i &lt; vec.size(); ++i) {
            std::cout &lt;&lt; &quot;vec[&quot; &lt;&lt; i &lt;&lt; &quot;]: &quot; &lt;&lt; &amp;(vec[i])
                &lt;&lt; &quot; vptr[&quot; &lt;&lt; i &lt;&lt; &quot;]: &quot; &lt;&lt; vptr[i] &lt;&lt; '\n';
        }
    }

    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Kapazitaet von vec: 3 Groesse: 0
Adressenvergleich:
vec[0]: 0x804c008 vptr[0]: 0x804c008
vec[1]: 0x804c00c vptr[1]: 0x804c00c
vec[2]: 0x804c010 vptr[2]: 0x804c010
Kapazitaet von vec: 3 Groesse: 3
Adressenvergleich:
vec[0]: 0x804c1e8 vptr[0]: 0x804c008
vec[1]: 0x804c1ec vptr[1]: 0x804c00c
vec[2]: 0x804c1f0 vptr[2]: 0x804c010
vec[3]: 0x804c1f4 vptr[3]: 0x804c1f4
vec[4]: 0x804c1f8 vptr[4]: 0x804c1f8
vec[5]: 0x804c1fc vptr[5]: 0x804c1fc
</code></pre>
<p>Beim zweiten Durchlauf muss 'vec' vergroessert werden. Da er dadurch an einen nichtdefinierten, neuen Bereich im Speicher verschoben wird (damit er weiter zusammenhaengend bleiben kann), verlieren die gespeicherten Zeiger ihre Bedeutung.<br />
Ich muesste vor jeden 'vec.push_back' die Kapazitaet abfragen, und wenn sie die Groesse des vectors erreicht hat, vptr neu erstellen, nachdem vec reallokiert wurde.<br />
Das suchte ich zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101131</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 12:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 12:11:08 GMT]]></title><description><![CDATA[<p>Das Problem kannst du mit vector'en nicht lösen - die Adresse der Elemente ändert sich, wenn der Vector mehr Speicherplatz anfordern muß.</p>
<p>Als Lösung kannst du entweder verhindern, daß der Vector neuen Speicher anfordert (dazu sagst du ihm vorher per reserve(), wieviel er benötigen wird), oder einen anderen Container verwenden (wenn du nur mit push_back() Elemente einfügen willst, geht ein deque&lt;&gt;, ansonsten mußt du eine list&lt;&gt; verwenden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101149</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 20 Jul 2006 12:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 12:12:57 GMT]]></title><description><![CDATA[<p>Oder im vector nicht die Foos sondern Foo* speichern. Und als Pfad dann eben auch Foo* und nicht die Adressen der Foo* im vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101155</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Thu, 20 Jul 2006 12:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 12:37:31 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Das Problem kannst du mit vector'en nicht lösen - die Adresse der Elemente ändert sich, wenn der Vector mehr Speicherplatz anfordern muß.</p>
</blockquote>
<p>Das hatte ich ja auch schon erkannt und beschrieben.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Als Lösung kannst du entweder verhindern, daß der Vector neuen Speicher anfordert (dazu sagst du ihm vorher per reserve(), wieviel er benötigen wird),</p>
</blockquote>
<p>Mit reserve() kann ich nur die Mindest-Kapazitaet festlegen, nicht verhindern, dass der vector darueber hinaus waechst.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>oder einen anderen Container verwenden (wenn du nur mit push_back() Elemente einfügen willst, geht ein deque&lt;&gt;, ansonsten mußt du eine list&lt;&gt; verwenden).</p>
</blockquote>
<p>deque scheint mein Problem zu loesen. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101197</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 12:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 12:49:04 GMT]]></title><description><![CDATA[<p>tim_g schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Als Lösung kannst du entweder verhindern, daß der Vector neuen Speicher anfordert (dazu sagst du ihm vorher per reserve(), wieviel er benötigen wird),</p>
</blockquote>
<p>Mit reserve() kann ich nur die Mindest-Kapazitaet festlegen, nicht verhindern, dass der vector darueber hinaus waechst.</p>
</blockquote>
<p>Nein, dafür mußt du selber sorgen. (Der Ansatz mit reserve() funktioniert nur, wenn du vorher die maximale Füllung deines Vector's kennst)</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>oder einen anderen Container verwenden (wenn du nur mit push_back() Elemente einfügen willst, geht ein deque&lt;&gt;, ansonsten mußt du eine list&lt;&gt; verwenden).</p>
</blockquote>
<p>deque scheint mein Problem zu loesen. Vielen Dank!</p>
</blockquote>
<p>Na dann ist es doch in Ordnung <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>(Aber Jesters Vorschlag hat auch etwas für sich, wenn du dich persönlich um die Speicherverwaltung kümmern willst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101212</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 20 Jul 2006 12:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 13:07:21 GMT]]></title><description><![CDATA[<p>Ueber Jesters Vorschlag habe ich auch ein wenig nachgedacht. Im Moment versuche ich es aber erst mit der deque - ist naeher an dem, was ich bisher implementiert habe und ich kann es mir besser vorstellen.</p>
<p>Kann ich sicher davon ausgehen, dass die Elemente ihre Adresse waehrend der Laufzeit des Programmes / innerhalb des Scopes nicht aendern, oder koennte die Compiler-abhaengig sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101230</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 20 Jul 2006 13:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Baeume mit vector und das Speichern von Pfaden on Thu, 20 Jul 2006 13:11:41 GMT]]></title><description><![CDATA[<p>Nach meinem Wissen ändern die vorhandenen Deque-Elemente ihre Position nur, wenn du neue Elemente dazwischenquetschst (per insert()) oder rauslöschst. Einfügen am Anfang oder Ende (push_Back(), push_front()) kann zwar auch neuen Speicher anfordern, aber die vorhandenen Elemente bleiben an ihrem Platz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1101233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1101233</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 20 Jul 2006 13:11:41 GMT</pubDate></item></channel></rss>