<?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[Referenzen auf im vector verwaltete Elemente]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe einen Fehler gemacht, ich habe das getan, was ich im Topic beschrieb: Referenzen auf im vector verwaltete Elemente vergeben. Später ändere ich den vector -&gt; Referenzen ungültig. Und bis ich das Problem gefunden hatte, verging auch noch einige Zeit. <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>Die Frage lautet: Wie löst ihr das architektonisch oder wieso passieren euch solche Probleme nicht? Habt ihr schon einen Satz im Kopf wie &quot;Referenzen auf Vector-Elemente - VORSICHT&quot;? Ich glaube, den habe ich ab jetzt (hatte ich, aber er war nicht laut genug)</p>
<p>Und wie löst ihr das, wenn ihr die Referenzierung beibehalten wollt? Einfach eine list statt einem vector nehmen?</p>
<p>Die Fragen erscheinen trivial, aber ich würde gerne hören, ob jemandem (wie so oft :)) etwas einfällt, was mich wieder etwas erhellen kann.</p>
<p>Vielen Dank und beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308543/referenzen-auf-im-vector-verwaltete-elemente</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 18:05:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308543.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2012 08:40:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 08:40:58 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe einen Fehler gemacht, ich habe das getan, was ich im Topic beschrieb: Referenzen auf im vector verwaltete Elemente vergeben. Später ändere ich den vector -&gt; Referenzen ungültig. Und bis ich das Problem gefunden hatte, verging auch noch einige Zeit. <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>Die Frage lautet: Wie löst ihr das architektonisch oder wieso passieren euch solche Probleme nicht? Habt ihr schon einen Satz im Kopf wie &quot;Referenzen auf Vector-Elemente - VORSICHT&quot;? Ich glaube, den habe ich ab jetzt (hatte ich, aber er war nicht laut genug)</p>
<p>Und wie löst ihr das, wenn ihr die Referenzierung beibehalten wollt? Einfach eine list statt einem vector nehmen?</p>
<p>Die Fragen erscheinen trivial, aber ich würde gerne hören, ob jemandem (wie so oft :)) etwas einfällt, was mich wieder etwas erhellen kann.</p>
<p>Vielen Dank und beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255222</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 28 Sep 2012 08:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 09:04:02 GMT]]></title><description><![CDATA[<p>Das lässt sich so pauschal nicht beantworten, es hängt von der konkreten Aufgabe ab.</p>
<p>Evtl. ist ein shared_ptr passend für deine Situation. Dieser ist beliebig kopierbar und RAII ist gleich mit eingebaut <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/2255228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255228</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 28 Sep 2012 09:04:02 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 09:12:24 GMT]]></title><description><![CDATA[<p>Das kommt drauf an, <em>was</em> Du am Vektor änderst. Du könntest zum Beispiel einfach den Index des Objekts im Vektor benutzen, anstatt eine Referenz auf das Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255231</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 28 Sep 2012 09:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 09:22:52 GMT]]></title><description><![CDATA[<p>Vielleicht so:</p>
<pre><code class="language-cpp">struct Knoten : boost::noncopyable
{
  std::vector&lt;Knoten*&gt; nachbarn;
};

struct Graph : boost::noncopyable
{
  boost::ptr_vector&lt;Knoten&gt; alle_knoten;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2255234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255234</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 28 Sep 2012 09:22:52 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 11:57:24 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und wie löst ihr das, wenn ihr die Referenzierung beibehalten wollt? Einfach eine list statt einem vector nehmen?</p>
</blockquote>
<p>Offen gesagt sind die einzigen Fälle in denen ich sowas bisher brauchte immer container&lt;unique_ptr&lt;T&gt;&gt; gewesen, was das Problem irgendwie von alleine löst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255276</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 28 Sep 2012 11:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 12:35:01 GMT]]></title><description><![CDATA[<p>Sorry! Ich vergaß zu erwähnen, dass das durchaus copyable bleiben soll. Brauchte nur etwas, um wieder im Kopf zu haben, wieso ich das so machte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255284</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 28 Sep 2012 12:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 12:43:20 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ich vergaß zu erwähnen, dass das durchaus copyable bleiben soll.</p>
</blockquote>
<p>Das ändert im Prinzip nichts an den Vorschlägen. Wenn du z.b. so ein Graphobjekt kopieren willst, muss der entsprechende Kopierkonstruktor neue Knoten anlegen und diese auch neu verlinken. Mit 'nem automatisch generierten Konstruktor ist das schwer. <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="😉"
    /> boost::noncopyable bzw unique_ptr verhindert ja nur, dass die Dinger wie Kopierkonstruktor und Zuweisungsoperator automatisch generiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255288</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 28 Sep 2012 12:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 12:54:07 GMT]]></title><description><![CDATA[<p>Bislang hat die autogenerierte Variante aber blendend funktioniert. Ich habe eine Art Tree, wobei es keine Polymorphie gibt. Wenn man die Referenzierung von außen außer acht lässt, dann kann ich einen neuen Root einfach mit einem anderen initialisieren und der automatische copy ctor erledigt, was ich möchte.</p>
<p>Wenn ich nun statt container&lt;Object&gt; auf container&lt;Object*&gt; oder container&lt;unique_ptr&lt;Object&gt;&gt; oder boost::ptr_container&lt;Object&gt; wechsle, dann muss ich für meine Hierarchie überall eigene Constructoren und =-Operatoren einsetzen. Macht es da nicht mehr Sinn vector einfach durch list zu ersetzen? Oder wo genau liegt der Vorteil? Die Indirektion habe ich bei list&lt;O&gt; und bei vector&lt;unique_ptr&lt;O&gt;&gt; und Konsorten doch genau so. Die Konvertierbarkeit in ein Array benötigt ich nicht und die Iterationen selbst sind doch nicht schneller, wenn ich keinen Random Access nutze, oder? Und besonders viel steckt auch nicht je container drin, also ist so was wie Cache-Lokalität vermutlich auch zu vernachlässigen, oder? (wobei ich jetzt gar nicht weiß, ob und warum das bei list schlechter wäre)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255293</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 28 Sep 2012 12:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:04:15 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Referenzierung von <strong>außen</strong></p>
</blockquote>
<p>Aha. Das ist eine neue Information für mich.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Wenn ich nun statt container&lt;Object&gt; auf container&lt;Object*&gt; oder container&lt;unique_ptr&lt;Object&gt;&gt; oder boost::ptr_container&lt;Object&gt; wechsle, dann muss ich für meine Hierarchie</p>
</blockquote>
<p>Was für eine Hierarchie?</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>überall eigene Constructoren und =-Operatoren einsetzen. Macht es da nicht mehr Sinn vector einfach durch list zu ersetzen?</p>
</blockquote>
<p>Das kann u.U. Sinn machen, ja.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Oder wo genau liegt der Vorteil?</p>
</blockquote>
<p>Hängt sicherlich davon ab, was du machen willst. bei boost::ptr_vector hast du allerdings noch random access und kopierbar ist das ding auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255298</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:13:43 GMT]]></title><description><![CDATA[<p>Okay, sorry, da hatte ich wieder Details vergessen.</p>
<p>Also die Hierarchie ist so, dass ich quasi eine Klasse A, eine Klasse B und eine Klasse C habe. A hält einen container an Bs, B hält einen Container an Cs. Aufgebaut wird das durch jeweilige Add-Methoden, die B bzw. C als Parameter erwarten.</p>
<p>ptr_vector klingt bei Kopierbarkeit dann wohl doch besser. Besonders viel einfügen und löschen tue ich nicht. Zwar kann man beides machen, aber nur auf einzelne Elemente, also performanceunkritisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255300</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:17:17 GMT]]></title><description><![CDATA[<p>Du solltest ein paar mehr Informationen rausrücken, wenn du hilfreiche Antworten haben möchtest. Ich verlange ja noch nichtmal ein kompilierfähiges Beispiel, aber<br />
zumindest die Randbedingungen solltest du schon angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255301</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:28:01 GMT]]></title><description><![CDATA[<p>Ja, tut mir Leid, ich bin nie so ganz sicher, was relevant ist.</p>
<p>Was wäre denn noch wichtig? Also die Hierarchie basiert eben auf den drei Klassen, bisher hat eben jede Klasse ein Attribut eines Vectors auf die jeweils niedrigere Klasse (also A hat vector auf B, B hat vector auf C, rückwärts nicht; also kein Graph, sondern nur ein Baum). Gehalten werden die Bäume (also Instanzen von A) von einer vierten Klasse, nennen wir diese Mal X. X ist nur einmal instanziiert (entspricht einem Tab im UI in einem nur einmal geöffnetem Fenster) und hat noch Instanzen von anderen Klassen. Niemand weiß, ob das hilft, aber diese benenne ich jetzt Mal mit Y und Z... und diese anderen Klassen halten eben Referenzen auf die As, Bs und Cs.</p>
<p>Veränderungen der As, Bs und Cs geschehen einerseits durch Erweiterung (und außerhalb von Z... nämlich von dem, der Z instanziiert). Andererseits können in Y und Z auch Kinder von As (also Bs) gelöscht/geändert/hinzugefügt werden.</p>
<p>Kopierbarkeit bietet sich deswegen an, weil man Duplikate erstellen können soll, die man dann leicht ändert. Einerseits zur Laufzeit, aber andererseits auch bei Initialisierung, weil ich dort die Hierarchie fix im Quellcode erstelle.</p>
<p>Ich weiß nicht, ob das jetzt geholfen hat, die Strukturen sind ja schon eher komplex. Vielleicht irgendwas Bestimmtes, was ich noch beitragen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255303</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:43:56 GMT]]></title><description><![CDATA[<p>boost::stable_vector?<br />
<a href="http://www.boost.org/doc/libs/1_51_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.stable_vector" rel="nofollow">http://www.boost.org/doc/libs/1_51_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.stable_vector</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255310</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 13:46:33 GMT]]></title><description><![CDATA[<p>Ich hab für genau so ein Problem mal ne Smartpointerklasse geschrieben. Die hält intern statt eines direkten Pointers auf das vector-Element einen Pointer auf den vector und den Index des Elements im vector. Lässt sich einfach als POD implementieren, mit allen möglichen Operatoren usw. Overhead ist die doppelte Größe im Vergleich zum C-Pointer und die zusätzliche Dereferenzierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255313</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 28 Sep 2012 13:46:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 14:24:18 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Die Frage lautet: Wie löst ihr das architektonisch oder wieso passieren euch solche Probleme nicht?</p>
</blockquote>
<p>Passiert mir nicht weil ich weiss dass es Probleme macht, und daher sowas nicht machen :^)<br />
Wie man es &quot;löst&quot; kommt drauf an was man genau braucht. Manchmal kann man einfach nen Index statt ner Referenz speichern, manchmal nimmt man ne std::deque statt nem Vektor, manchmal nimmt man shared_ptr oder unique_ptr oder ptr_vector, manchmal nimmt man ne map. Kommt halt drauf an...</p>
<blockquote>
<p>Und wie löst ihr das, wenn ihr die Referenzierung beibehalten wollt? Einfach eine list statt einem vector nehmen?</p>
</blockquote>
<p>std::list nehm ich quasi nie. Eher noch deque.<br />
Meistens mach ich aber einfach statt Referenzen was anderes, wie gesagt Index speichern oder map oder sowas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255325</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 28 Sep 2012 14:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen auf im vector verwaltete Elemente on Fri, 28 Sep 2012 14:43:58 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Also die Hierarchie basiert eben auf den drei Klassen ... (also A hat vector auf B, B hat vector auf C, rückwärts nicht ... Y und Z... und diese anderen Klassen halten eben Referenzen auf die As, Bs und Cs ... Andererseits können in Y und Z auch Kinder von As (also Bs) gelöscht/geändert/hinzugefügt werden</p>
</blockquote>
<p>Verpass deinen Objekten irgend wie eine Identität.<br />
Entweder über eine unveränderliche Adresse (implizites Kopieren/Moven verbieten, Pointer-Container oder Container aus Smart-Pointern).<br />
Oder über einen eindeutigen Schlüssel (also irgend ein Attribut oder Attribut-Tuple über das du sie eindeutig identifizieren und dann in einer Map/Set/... finden kannst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255336</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 28 Sep 2012 14:43:58 GMT</pubDate></item></channel></rss>