<?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[Was passiert beim Einfuegen in eine Datenstrucktur]]></title><description><![CDATA[<p>Hallo, ich habe eine Klasse Node</p>
<pre><code class="language-cpp">class Node {
public:
	int num;
        Node(int tnum):num(tnum) {}
...
...
};
</code></pre>
<p>Ich moechte eine ungerichtete Graphstrucktur aufbauen, wenn ich jetzt</p>
<pre><code class="language-cpp">int main() {
	vector&lt;Node&gt; asd;
	hash_map&lt;int,Node&gt; bla;
	Node * xc = new Node(1);
	asd.push_back(*xc);
	bla[1] = *xc;
	xc-&gt;num = 14;
	cout &lt;&lt; bla[1].num &lt;&lt; &quot;   &quot; &lt;&lt; asd.at(0).num;

}
</code></pre>
<p>Mache, und ich fuege das Node in eine der Datenstruckturen ein, warum ist es dann nicht mehr das gleiche Node so dass ich es von ausserhalb veraendern kann ?<br />
Sprich, bei mir komm beim cout beides mal 1 raus, das heißt doch das Node* vector und hash_map nicht auf den gleichen Speicherbereich zeigen, was fuer mich aber unerlaesslich ist. Was mache ich falsch ?</p>
<p>Hilfe <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/259750/was-passiert-beim-einfuegen-in-eine-datenstrucktur</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 18:09:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259750.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Jan 2010 11:24:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 11:24:56 GMT]]></title><description><![CDATA[<p>Hallo, ich habe eine Klasse Node</p>
<pre><code class="language-cpp">class Node {
public:
	int num;
        Node(int tnum):num(tnum) {}
...
...
};
</code></pre>
<p>Ich moechte eine ungerichtete Graphstrucktur aufbauen, wenn ich jetzt</p>
<pre><code class="language-cpp">int main() {
	vector&lt;Node&gt; asd;
	hash_map&lt;int,Node&gt; bla;
	Node * xc = new Node(1);
	asd.push_back(*xc);
	bla[1] = *xc;
	xc-&gt;num = 14;
	cout &lt;&lt; bla[1].num &lt;&lt; &quot;   &quot; &lt;&lt; asd.at(0).num;

}
</code></pre>
<p>Mache, und ich fuege das Node in eine der Datenstruckturen ein, warum ist es dann nicht mehr das gleiche Node so dass ich es von ausserhalb veraendern kann ?<br />
Sprich, bei mir komm beim cout beides mal 1 raus, das heißt doch das Node* vector und hash_map nicht auf den gleichen Speicherbereich zeigen, was fuer mich aber unerlaesslich ist. Was mache ich falsch ?</p>
<p>Hilfe <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/1845618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845618</guid><dc:creator><![CDATA[quessstion]]></dc:creator><pubDate>Wed, 27 Jan 2010 11:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 11:29:05 GMT]]></title><description><![CDATA[<p>Du schreibst immer nur Kopien in die std::map. Musst mit Pointern arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845621</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 27 Jan 2010 11:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 11:30:59 GMT]]></title><description><![CDATA[<p>Ok, und wie mache ich das ?</p>
<p>weil vector&lt;*Node&gt; hatte ich erst ausprobiert, aber das geht nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845622</guid><dc:creator><![CDATA[q]]></dc:creator><pubDate>Wed, 27 Jan 2010 11:30:59 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 11:31:22 GMT]]></title><description><![CDATA[<p>Weil in deiner hash_map Kopien der Nodes gespeichert werden, da bringt es gar nix wenn du das Objekt vorher mit new anlegst. Im Gegenteil, so handelst du dir ein ordentliches Memoryleak ein!</p>
<pre><code class="language-cpp">int main() {
    vector&lt;Node*&gt; asd;
    hash_map&lt;int,Node*&gt; bla;
    Node * xc = new Node(1);
    asd.push_back(xc);
    bla[1] = xc;
    xc-&gt;num = 14;
    cout &lt;&lt; bla[1]-&gt;num &lt;&lt; &quot;   &quot; &lt;&lt; asd.at(0)-&gt;num;
}
</code></pre>
<p>Aber unbedingt daran denken, dass asd und bla die Pointer nicht besitzen, das heißt du musst dich selber drum kümmern, dass bei Programmende (oder wenn die asd und bla besitzenden Objekte zerstört werden) richtig aufgeräumt wird, also alle Objekte zerstört werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845625</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 27 Jan 2010 11:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 11:55:41 GMT]]></title><description><![CDATA[<p>kann mir mal einer ein kleines Beispiel geben ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845637</guid><dc:creator><![CDATA[qw]]></dc:creator><pubDate>Wed, 27 Jan 2010 11:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:04:20 GMT]]></title><description><![CDATA[<p>qw schrieb:</p>
<blockquote>
<p>kann mir mal einer ein kleines Beispiel geben ?</p>
</blockquote>
<ol>
<li>Hab ich deinen Code 1:1 übernommen und aus dem Node im Container ein Node* gemacht undZugriffe und Einfügen so abgeändert dass es passt.</li>
<li></li>
</ol>
<blockquote>
<p>weil vector&lt;*Node&gt; hatte ich erst ausprobiert, aber das geht nicht</p>
</blockquote>
<p>Schreibt man da dann normalerweise dazu, WAS nicht geht (Fehler und Code)</p>
<ol start="3">
<li>Wenn du möchtest dass dir jemand etwas zeigt wäre ein kleines &quot;Bitte&quot; nicht schlecht, sonst sind &gt;99,9% der Leute nicht gewillt nochmal zu antworten.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1845640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845640</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:15:33 GMT]]></title><description><![CDATA[<p>quessstion schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;Node&gt; asd;
	hash_map&lt;int,Node&gt; bla;
</code></pre>
<p>Mache, und ich fuege das Node in eine der Datenstruckturen ein, warum ist es dann nicht mehr das gleiche Node so dass ich es von ausserhalb veraendern kann ?<br />
Sprich, bei mir komm beim cout beides mal 1 raus, das heißt doch das Node* vector und hash_map nicht auf den gleichen Speicherbereich zeigen,</p>
</blockquote>
<p>Die &quot;zeigen&quot; gar nicht. Die Datenstruktoren speichern keine Zeiger auf Deine Objekte, sondern Kopien. Du hast hier sogar ein Speicherleck, da Du ein Objekt mit new erzeugt, es aber nirgendswo wieder mit delete gelöscht wird.</p>
<p>Dich überrascht das vielleicht, weil Du von anderen Sprachen etwas anderes gewöhnt bist. Anere Sprachen (wie zB Java) nutzen <em>implizit</em> Indirektion. In C++ erreichst Du das durch explizite Verwendung von Zeigern oder anderen &quot;Handles&quot;.</p>
<p>Probier mal folgendes:</p>
<pre><code class="language-cpp">list&lt;Node&gt; nodelist;
    typedef list&lt;Node&gt;::iterator listiter_t;

    hash_map&lt;int,listiter_t&gt; bla;
    nodelist.push_front( Node(23) );
    bla[23] = nodelist.begin();

    bla[23]-&gt;num = 42;

    nodelist.erase(bla[23]);
    bla.erase(23);
</code></pre>
<p>Hier werden die Objekte in der Liste gespeichert und verwaltet. Das erspart Dir die explizite Verwaltung der Lebenszeit -- kein new und kein delete gibt es hier. Wenn die Liste zerstört wird, werden auch automatisch alle Node-Objekte zerstört, die zur Liste gehören. Die Map speichert hier eine Zuordnung von int zu einem List-Iterator, über den man das Node-Objekt erreichen kann.</p>
<p>Warum list statt vector? Nur std::list garantiert Dir, dass, wenn Du neue Objekte hinzufügst oder irgendwelche Objekte aus der Liste löscht, sich die Adressen der anderen Objekte nicht ändert und die anderen Iteratoren noch gültig bleiben. Ein std::vector dagegen kopiert die Elemente schonmal um, wenn neue Elemente hinzugefügt werden sollen aber die Kapazität des aktuellen Vektors nicht ausreicht.</p>
<p>Alternativ könnte man boost::shared_ptr benutzen:</p>
<pre><code class="language-cpp">vector&lt;shared_ptr&lt;Node&gt; &gt; nodelist;
    hash_map&lt;int,shared_ptr&lt;Node&gt; &gt; bla;

    shared_ptr&lt;Node&gt; temp ( new Node(23) );
    nodelist.push_back( temp );
    bla[23] = &amp; nodelist.back();
</code></pre>
<p>Auch hier wird wieder der Verwaltungsaufwand der Lebenszeit der Node-Objekte abgegeben, in diesem Fall an shared_ptr.</p>
<p>Das Problem bei einem Ansatz wie diesem hier:</p>
<pre><code class="language-cpp">vector&lt;Node*&gt; nodelist;
    hash_map&lt;int,Node*&gt; bla;

    nodelist.push_back( new Node(23) );
    bla[23] = nodelist.back();
</code></pre>
<p>dass man sich hier selbst um's &quot;Aufräumen&quot; kümmern muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845653</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:20:46 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Alternativ könnte man boost::shared_ptr benutzen:</p>
<pre><code class="language-cpp">vector&lt;shared_ptr&lt;Node&gt; &gt; nodelist;
    hash_map&lt;int,shared_ptr&lt;Node&gt; &gt; bla;

    shared_ptr&lt;Node&gt; temp ( new Node(23) );
    nodelist.push_back( temp );
    bla[23] = &amp; nodelist.back();
</code></pre>
</blockquote>
<p>Upps, die letzte Zeile sollte heißen</p>
<pre><code class="language-cpp">bla[23] = temp;
</code></pre>
<p>(war ein copy &amp; paste Fehler)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845657</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:20:46 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:22:17 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>qw schrieb:</p>
<blockquote>
<p>kann mir mal einer ein kleines Beispiel geben ?</p>
</blockquote>
<ol>
<li>Hab ich deinen Code 1:1 übernommen und aus dem Node im Container ein Node* gemacht undZugriffe und Einfügen so abgeändert dass es passt.</li>
<li></li>
</ol>
<blockquote>
<p>weil vector&lt;*Node&gt; hatte ich erst ausprobiert, aber das geht nicht</p>
</blockquote>
<p>Schreibt man da dann normalerweise dazu, WAS nicht geht (Fehler und Code)</p>
</blockquote>
<p>Oh man, ja vector&lt;*Node&gt; kann ja auch nicht gehen, vector&lt;Node*&gt; geht wunderbar, das hat mich jetzt viel Zeit gekostet.</p>
<blockquote>
<ol start="3">
<li>Wenn du möchtest dass dir jemand etwas zeigt wäre ein kleines &quot;Bitte&quot; nicht schlecht, sonst sind &gt;99,9% der Leute nicht gewillt nochmal zu antworten.</li>
</ol>
</blockquote>
<p>Hey das sollte nicht fordernd oder so klingen, ich bin hier fuer jede Antwort wirklich sehr dankbar.<br />
Aber du hast schon recht ein Bitte fehlt, aber du bekommst jetzt auf jeden Fall ein Danke! <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/1845659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845659</guid><dc:creator><![CDATA[qwe]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:25:34 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>quessstion schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;Node&gt; asd;
	hash_map&lt;int,Node&gt; bla;
</code></pre>
<p>Mache, und ich fuege das Node in eine der Datenstruckturen ein, warum ist es dann nicht mehr das gleiche Node so dass ich es von ausserhalb veraendern kann ?<br />
Sprich, bei mir komm beim cout beides mal 1 raus, das heißt doch das Node* vector und hash_map nicht auf den gleichen Speicherbereich zeigen,</p>
</blockquote>
<p>Die &quot;zeigen&quot; gar nicht. Die Datenstruktoren speichern keine Zeiger auf Deine Objekte, sondern Kopien. Du hast hier sogar ein Speicherleck, da Du ein Objekt mit new erzeugt, es aber nirgendswo wieder mit delete gelöscht wird.</p>
<p>Dich überrascht das vielleicht, weil Du von anderen Sprachen etwas anderes gewöhnt bist. Anere Sprachen (wie zB Java) nutzen <em>implizit</em> Indirektion. In C++ erreichst Du das durch explizite Verwendung von Zeigern oder anderen &quot;Handles&quot;.</p>
<p>Probier mal folgendes:</p>
<pre><code class="language-cpp">list&lt;Node&gt; nodelist;
    typedef list&lt;Node&gt;::iterator listiter_t;

    hash_map&lt;int,listiter_t&gt; bla;
    nodelist.push_front( Node(23) );
    bla[23] = nodelist.begin();

    bla[23]-&gt;num = 42;

    nodelist.erase(bla[23]);
    bla.erase(23);
</code></pre>
<p>Hier werden die Objekte in der Liste gespeichert und verwaltet. Das erspart Dir die explizite Verwaltung der Lebenszeit -- kein new und kein delete gibt es hier. Wenn die Liste zerstört wird, werden auch automatisch alle Node-Objekte zerstört, die zur Liste gehören. Die Map speichert hier eine Zuordnung von int zu einem List-Iterator, über den man das Node-Objekt erreichen kann.</p>
<p>Warum list statt vector? Nur std::list garantiert Dir, dass, wenn Du neue Objekte hinzufügst oder irgendwelche Objekte aus der Liste löscht, sich die Adressen der anderen Objekte nicht ändert und die anderen Iteratoren noch gültig bleiben. Ein std::vector dagegen kopiert die Elemente schonmal um, wenn neue Elemente hinzugefügt werden sollen aber die Kapazität des aktuellen Vektors nicht ausreicht.</p>
<p>Alternativ könnte man boost::shared_ptr benutzen:</p>
<pre><code class="language-cpp">vector&lt;shared_ptr&lt;Node&gt; &gt; nodelist;
    hash_map&lt;int,shared_ptr&lt;Node&gt; &gt; bla;

    shared_ptr&lt;Node&gt; temp ( new Node(23) );
    nodelist.push_back( temp );
    bla[23] = &amp; nodelist.back();
</code></pre>
<p>Auch hier wird wieder der Verwaltungsaufwand der Lebenszeit der Node-Objekte abgegeben, in diesem Fall an shared_ptr.</p>
<p>Das Problem bei einem Ansatz wie diesem hier:</p>
<pre><code class="language-cpp">vector&lt;Node*&gt; nodelist;
    hash_map&lt;int,Node*&gt; bla;

    nodelist.push_back( new Node(23) );
    bla[23] = nodelist.back();
</code></pre>
<p>dass man sich hier selbst um's &quot;Aufräumen&quot; kümmern muss.</p>
</blockquote>
<p>Ja ums aufraeumen muss ich mich sowieso nicht kuemmern, da mein Programm nachdem der Graph aufgebaut ist nur noch eine Wegsuche macht und dann beendet wird. Der Speicher wird doch dann sowieso wieder frei gegeben oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845662</guid><dc:creator><![CDATA[dasdxy]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:25:34 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:27:37 GMT]]></title><description><![CDATA[<p>An sich ja, aber man sollte dennoch nicht schlurig sein und sowas immer gleich richtig machen. Ist ja auch nicht wirklich Arbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845668</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:27:37 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:38:39 GMT]]></title><description><![CDATA[<p>Und irgendwann muss dein Destruktor DOCH noch mal wichtige Aufgaben erledigen - und du bist es gewohnt dass dein Speicher automatisch vom OS freigegeben wird und löschst deine Objekte immer noch nicht selbständig <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/1845683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845683</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 12:39:58 GMT]]></title><description><![CDATA[<p>Warum auf Klo gehen wenn die Windel so schön alles hält?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845684</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 14:45:33 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Warum auf Klo gehen wenn die Windel so schön alles hält?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> wie recht du doch hast <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>ich habe jetzt aber ein weiteres Problem, ich habe einen Iterator ueber eine HashMap</p>
<pre><code class="language-cpp">for(hash_map&lt;int,Node*&gt;::iterator it = allNodes.begin(); it != allNodes.end();it++) {
  cout &lt;&lt; it-&gt;num &lt;&lt; endl;
}
</code></pre>
<p>Er laeuft bis ganz ans Ende, gibt also noch die letzte Zahl aus und bricht dann einfach ab, ohne Fehlermeldung. Mein debugger sagt Segmentation fault also irgendwas mit ueber Speicherbereich gelesen?!</p>
<pre><code>&lt;terminated&gt;gdb/mi (1/27/10 3:40 PM) (Exited. Signal 'SIGSEGV' received. Description: Segmentation fault.)
</code></pre>
<p>wie kann den sowas passieren also irgendwie ist it++ dann ueber dem Speicherbereich und nicht allNodes.end() oder kann es sein das es allNodes.end() nicht gibt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845777</guid><dc:creator><![CDATA[xasew]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 14:49:29 GMT]]></title><description><![CDATA[<p>Weiß ja nicht wie der Rest deines Codes aussieht, man benutzt aber eigentlich ++it statt it++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845781</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 14:55:14 GMT]]></title><description><![CDATA[<p>Hab ich mal probiert, aendert aber auch nichts. Das ist ja eh eine eigenstaendige Anweisung am Ende einer Iteration.</p>
<p>So sieht der Rest der Schleife aus, das einzige was ich mache sind Zuweisungen, ich loesche nichts und veraendere auch nichts was ich in der Schleife benutze.</p>
<pre><code class="language-cpp">for(hash_map&lt;int,Node*&gt;::iterator it = allNodes.begin(); it != allNodes.end();++it) {
		cout &lt;&lt; it-&gt;first &lt;&lt; &quot; &quot;;
		for(hash_map&lt;int,Node*&gt;::iterator it1 = it-&gt;second-&gt;cameFrom.begin(); it1 != it-&gt;second-&gt;cameFrom.end();++it1) {
			cout &lt;&lt; it1-&gt;first &lt;&lt; &quot; &quot;;
			if(it1-&gt;second-&gt;away == 0) {
				it1-&gt;second-&gt;away = it-&gt;second-&gt;away+1;
				it1-&gt;second-&gt;from = it-&gt;second;

				newAllNodes[it1-&gt;first] = it1-&gt;second;
			}
 		}
		cout &lt;&lt; &quot;ENDE&quot; &lt;&lt; endl;

	}
	cout &lt;&lt; &quot;ENDE ALL&quot; &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1845791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845791</guid><dc:creator><![CDATA[vtj]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 15:07:16 GMT]]></title><description><![CDATA[<p>Ich habe gerade nochmal was ausprobiert, ich mache diese Berechnung in einer Methode also</p>
<pre><code class="language-cpp">hash_map&lt;int,Node*&gt; allNodes;

vonDateiEinlese(allNodes);

findWay(allNodes);
</code></pre>
<pre><code class="language-cpp">findWay(hash_map&lt;int,Node*&gt; allNodes) {
	hash_map&lt;int,Node*&gt; newAllNodes;

	for(hash_map&lt;int,Node*&gt;::iterator it = allNodes.begin(); it != allNodes.end();++it) {
		cout &lt;&lt; it-&gt;first &lt;&lt; &quot; &quot;;
		for(hash_map&lt;int,Node*&gt;::iterator it1 = it-&gt;second-&gt;cameFrom.begin(); it1 != it-&gt;second-&gt;cameFrom.end();++it1) {
			cout &lt;&lt; it1-&gt;first &lt;&lt; &quot; &quot;;
			if(it1-&gt;second-&gt;away == 0) {
				it1-&gt;second-&gt;away = it-&gt;second-&gt;away+1;
				it1-&gt;second-&gt;from = it-&gt;second;

				newAllNodes[it1-&gt;first] = it1-&gt;second;
			}
 		}
		cout &lt;&lt; &quot;ENDE&quot; &lt;&lt; endl;

	}
	cout &lt;&lt; &quot;ENDE ALL&quot; &lt;&lt; endl;
}
</code></pre>
<p>Wenn ich die Berechnung die ich eigentlich in der Methode mache, gleich ohne Methode mache funktioniert es, habe ich da jetzt schon wieder was mit dem Uebergeben von Objekten falsch gemacht ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845794</guid><dc:creator><![CDATA[xaer]]></dc:creator><pubDate>Wed, 27 Jan 2010 15:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 16:06:32 GMT]]></title><description><![CDATA[<p>xasew schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for(hash_map&lt;int,Node*&gt;::iterator it = allNodes.begin(); it != allNodes.end();it++) {
  cout &lt;&lt; it-&gt;num &lt;&lt; endl;
}
</code></pre>
<p>Er laeuft bis ganz ans Ende, gibt also noch die letzte Zahl aus und bricht dann einfach ab, ohne Fehlermeldung. Mein debugger sagt Segmentation fault also irgendwas mit ueber Speicherbereich gelesen?!</p>
<pre><code>&lt;terminated&gt;gdb/mi (1/27/10 3:40 PM) (Exited. Signal 'SIGSEGV' received. Description: Segmentation fault.)
</code></pre>
<p>wie kann den sowas passieren also irgendwie ist it++ dann ueber dem Speicherbereich und nicht allNodes.end() oder kann es sein das es allNodes.end() nicht gibt ?</p>
</blockquote>
<p>Nein. Viel wahrscheinlicher ist, dass Du ungültige Zeiger (oder Nullzeiger) in der map hast, die Du nicht dereferenzieren darfst, was Du aber mit &quot;it-&gt;num&quot; tust.</p>
<p>xaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">findWay(hash_map&lt;int,Node*&gt; allNodes) {
</code></pre>
</blockquote>
<p>Dir ist klar, dass allNodes hier eine lokale Kopie der Argument-Map ist, ja? Und dann zeigen die Elemente der Kopie auch noch auf dieselben Knoten-Objekte (sharing), die Du in der Funktion veränderst.</p>
<pre><code>+-Node--+       +-Node--+
         | daten |       | daten |
         +-------+       +-------+
           A   A           A   A
           |   |           |    \_____________________________
           |    \__________|__________________                \
           |               |                  \                |
+-map------+---------------+-----+  +-map------+---------------+-----+
|          |               |     |  |          |               |     |
| +-pair-------+  +-pair-------+ |  | +-pair-------+  +-pair-------+ |
| | int, Node* |  | int, Node* | |  | | int, Node* |  | int, Node* | |
| +------------+  +------------+ |  | +------------+  +------------+ |
|                                |  |                                |
+--------------------------------+  +--------------------------------+
      (Argument von findWay)            (lokale Kopie in findWay)
</code></pre>
<p>Da kriegt man ja ganz schnell 'nen Knoten im Kopf. Ich muss gestehen, ich verstehe die Funktion findWay nicht. Vielleicht muss man dazu aber auch die Definition von Node kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845840</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 27 Jan 2010 16:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 16:11:55 GMT]]></title><description><![CDATA[<p>Ja, das ist auch ein bischen gekuerzt weil die Methode 2 Seiten lang ist.</p>
<p>Ich habe aber den Fehler gefunden.</p>
<p>Ich hatte ein</p>
<pre><code class="language-cpp">if(allNodes[end]) {

}
</code></pre>
<p>zum ueberpruefen ob der Endknoten enthalten ist benutzt, das Problem ist aber das die HashMap dann falls &quot;end&quot; nicht enthalten ist fuer den Key einen NullPointer anlegt und diesen dann zurueck gibt.<br />
Der zerballert mir natuerlich dann auch die Iteration, das tragische ist aber das es ja manchmal funktioniert, naemlich immer dann wenn der Endknoten wirklich drin war <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="🙂"
    /> das hat die Fehlersuche sehr erschwert...</p>
<p>Also waere es hier sinnvoller mit Pointern zu arbeiten ? gerade wenn es auf die Geschwindigkeit ankommt oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845842</guid><dc:creator><![CDATA[defaef]]></dc:creator><pubDate>Wed, 27 Jan 2010 16:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Was passiert beim Einfuegen in eine Datenstrucktur on Wed, 27 Jan 2010 16:20:42 GMT]]></title><description><![CDATA[<p>defaef schrieb:</p>
<blockquote>
<p>Also waere es hier sinnvoller mit Pointern zu arbeiten ? gerade wenn es auf die Geschwindigkeit ankommt oder ?</p>
</blockquote>
<p>Es wäre sinnvoll, eine vernünftige Datenstruktur anzulegen und die auch soweit zu kapseln, dass man als Nutzer nicht viel falsch machen kann. Zum Bleistift einen &quot;Graph&quot;-Typen anlegen, der entweder nicht kopierbar ist, oder sich &quot;regulär&quot; verhält (--&gt; &quot;tiefe Kopie&quot; wie es std::list, std::map etc auch machen).</p>
<p>Vielleicht kannst Du Dir von den Abstraktionen aus <a href="http://www.boost.org/doc/libs/1_41_0/libs/graph/doc/index.html" rel="nofollow">BGL</a> etwas abgucken oder sogar einfach <a href="http://www.boost.org/doc/libs/1_41_0/libs/graph/doc/index.html" rel="nofollow">BGL</a> benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845846</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 27 Jan 2010 16:20:42 GMT</pubDate></item></channel></rss>