<?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[Suche geeigneten Container oder sonstige Speichermöglichkeit]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich kämpfe mal wieder seit Ewigkeiten mit einem Problem rum. Und zwar geht es um Folgendes:</p>
<p>Ein Graph besteht aus Knoten und Kanten. Eine Kante wird beschrieben durch einen Anfangs- und einen Endknoten. Jeder Kante ist ein Gewicht zugeordnet. Ich möchte nun in einem Container die Kanten und ihre Gewichte speichern, d.h. ich will Tripel von Ganzzahlen speichern, z.B. (1,2,1) = Kante mit Anfangsknoten 1, Endknoten 2 und Gewicht 1. Und davon halt jede Menge.</p>
<p>Am geschicktesten wäre ne Lösung der Art</p>
<pre><code>map&lt;pair&lt;int, int&gt;, int&gt;
</code></pre>
<p>, aber so Konstrukte gibt es ja in C++ nicht. Weiß da jemand Rat?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274323/suche-geeigneten-container-oder-sonstige-speichermöglichkeit</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 17:15:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274323.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Sep 2010 19:44:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 19:44:50 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich kämpfe mal wieder seit Ewigkeiten mit einem Problem rum. Und zwar geht es um Folgendes:</p>
<p>Ein Graph besteht aus Knoten und Kanten. Eine Kante wird beschrieben durch einen Anfangs- und einen Endknoten. Jeder Kante ist ein Gewicht zugeordnet. Ich möchte nun in einem Container die Kanten und ihre Gewichte speichern, d.h. ich will Tripel von Ganzzahlen speichern, z.B. (1,2,1) = Kante mit Anfangsknoten 1, Endknoten 2 und Gewicht 1. Und davon halt jede Menge.</p>
<p>Am geschicktesten wäre ne Lösung der Art</p>
<pre><code>map&lt;pair&lt;int, int&gt;, int&gt;
</code></pre>
<p>, aber so Konstrukte gibt es ja in C++ nicht. Weiß da jemand Rat?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956621</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Thu, 23 Sep 2010 19:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 19:50:14 GMT]]></title><description><![CDATA[<p>boost::graph. Das kommt auch mit einer ganzen Reihe von nützlichen Algorithmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956622</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 23 Sep 2010 19:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 19:54:28 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>boost::graph. Das kommt auch mit einer ganzen Reihe von nützlichen Algorithmen.</p>
</blockquote>
<p>Ja, die kenn ich, aber die soll ich nicht benutzen. Nur die STL nach Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956627</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Thu, 23 Sep 2010 19:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 20:05:17 GMT]]></title><description><![CDATA[<p>Euler schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>boost::graph. Das kommt auch mit einer ganzen Reihe von nützlichen Algorithmen.</p>
</blockquote>
<p>Ja, die kenn ich, aber die soll ich nicht benutzen. Nur die STL nach Möglichkeit.</p>
</blockquote>
<p>Warum das denn nicht? Der Sinn von boost::graph ist ja gerade der, dass es in der STL keinen geeigneten Container gibt. Wenn du das nicht benutzen willst, dann wirst du dir etwas eigenes schreiben müssen. Du kannst dir ja bei boost angucken wie die das gemacht haben (wobei der boost-Code wegen der vielen Templateprogrammierung meistens recht schwer leserlich ist). Die üblichen Verfahren, von denen man sich normalerweise das passende aussucht (sie haben alle Vor- und Nachteile), sind:<br />
<a href="http://en.wikipedia.org/wiki/Adjacency_list" rel="nofollow">http://en.wikipedia.org/wiki/Adjacency_list</a><br />
<a href="http://en.wikipedia.org/wiki/Incidence_list" rel="nofollow">http://en.wikipedia.org/wiki/Incidence_list</a><br />
<a href="http://en.wikipedia.org/wiki/Adjacency_matrix" rel="nofollow">http://en.wikipedia.org/wiki/Adjacency_matrix</a><br />
<a href="http://en.wikipedia.org/wiki/Incidence_matrix" rel="nofollow">http://en.wikipedia.org/wiki/Incidence_matrix</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956629</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 23 Sep 2010 20:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 20:11:49 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Warum das denn nicht? Der Sinn von boost::graph ist ja gerade der, dass es in der STL keinen geeigneten Container gibt.</p>
</blockquote>
<p>Man sagte mir, ich solle &quot;keine exotischen Bibliotheken nutzen&quot;. Die boost::graph gehört da leider dazu <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> War nicht meine Idee. Ich glaube, ich probier es jetzt mal mit ner eigenen Klasse für Kanten. Eventuell klappt ja mal was auf Anhieb bei mir <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956630</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Thu, 23 Sep 2010 20:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Thu, 23 Sep 2010 20:32:53 GMT]]></title><description><![CDATA[<p>Naja, wenn man boost schon exotisch nennt, dann musst du wohl wirklich alles selbst schreiben. Dein Glück, dass wenigstens die STL mittlerweile zum Sprachstandard gehört (zumindest größtenteils). Immerhin kannst du dich darauf freuen, dass im nächsten Standard auch viele Teile von boost in den Sprachumfang aufgenommen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956636</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 23 Sep 2010 20:32:53 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 08:15:08 GMT]]></title><description><![CDATA[<p>Euler schrieb:</p>
<blockquote>
<p>Am geschicktesten wäre ne Lösung der Art</p>
<pre><code>map&lt;pair&lt;int, int&gt;, int&gt;
</code></pre>
<p>, aber so Konstrukte gibt es ja in C++ nicht.</p>
</blockquote>
<p>Sehe ich gerade den Wald nicht? Warum soll das nicht gehen?</p>
<p>Ansonsten, wie wäre</p>
<pre><code class="language-cpp">struct tripel
{
    int anfang, ende, gewicht;
};

vector&lt;tripel&gt; kanten
</code></pre>
<p>?</p>
<p>Oder habe ich jetzt das Problem falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956745</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 24 Sep 2010 08:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 11:44:44 GMT]]></title><description><![CDATA[<p>weil imho der op&lt; von pair auf beides prüft.<br />
(also <code>lhs.first &lt; rhs.first &amp;&amp; lhs.second &lt; rhs.second</code> )<br />
also gilt idR !(paar1 &lt; paar2) &amp;&amp; !(paar2 &lt; paar1), so ist aber gleichheit definiert.<br />
also muss man nur einen eigenen op&lt; übergeben (und davor definieren^^):</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
bool pair_less(const T&amp; lhs, const T&amp; rhs)
{
  if(lhs.first == rhs.first)
    return lhs.second &lt; rhs.second;

  return lhs.first &lt; rhs.first;
}
</code></pre>
<p>ging das nicht auch mal schöner zu schreiben?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956851</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 24 Sep 2010 11:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 11:50:49 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>also muss man nur einen eigenen op&lt; übergeben (und davor definieren^^):</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
bool pair_less(const T&amp; lhs, const T&amp; rhs)
{
  if(lhs.first == rhs.first)
    return lhs.second &lt; rhs.second;

  return lhs.first &lt; rhs.first;
}
</code></pre>
</blockquote>
<p>Die selbe Semantik hat aber auch <code>operator&lt;</code> für <code>std::pair</code> aus der Standardbibliothek. Zuerst wird <code>first</code> verglichen, bei Gleichheit wird <code>second</code> verglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956853</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 24 Sep 2010 11:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 12:19:08 GMT]]></title><description><![CDATA[<p>hmm... stimmt - zumindest wenn man <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> glaubt - wieder was dazu gelernt... ^^</p>
<p>also spricht ja wirklich nix ggn die map mit pair&lt;int,int&gt; als schlüssel!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956867</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 24 Sep 2010 12:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 12:46:33 GMT]]></title><description><![CDATA[<p>Euler schrieb:</p>
<blockquote>
<p>Am geschicktesten wäre ne Lösung der Art</p>
<pre><code>map&lt;pair&lt;int, int&gt;, int&gt;
</code></pre>
<p>, aber so Konstrukte gibt es ja in C++ nicht.</p>
</blockquote>
<p>Was wäre daran jetzt geschickt? Ich sehe nur, dass es recht kurz wäre.</p>
<p>In deinem Fall hast du nur schnellen Zugriff auf ausgehende Kante, nicht auf eingehende. Je nach dem, wie du hast du außerdem logarithmische Zugriffszeiten auf bestimme Informationen, statt konstanter.</p>
<p>Eine bessere Implementierung wäre wohl eine mit einer <em>doubly connected edge list</em>. Falls du nur ausgehende Kanten brauchst, geht es noch ein wenig einfacher.</p>
<p>Edit: Das soll natürlich nicht heißen, dass du deine Lösung nicht verwenden sollst, falls sie für deinen Fall ausreichend ist. Eine bessere Implementierung ist auch mit mehr Implementierungsaufwand verbunden, wenn du boost nicht verwenden darfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956884</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Sep 2010 12:46:33 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 16:34:44 GMT]]></title><description><![CDATA[<p>Ich habe das jetzt mit ner eigenen Klasse geregelt, also kann ich jetzt auch nen normalen Vektor nehmen, so in etwa:</p>
<pre><code>vector&lt;Kante *&gt; kanten
</code></pre>
<p>Das Problem, was ich damit halt habe, ist, dass in diesem Vektor gewisse Kanten doppelt eingefügt werden im Laufe meines Programms. Ich könnte zwar das Programm so umschreiben, dass das nicht passiert, aber das ist zur Laufzeit ziemlich aufwendig und kompliziert. Dann habe ich versucht mit unique die doppelten Kanten zu entfernen. Aber das funktioniert bei mir irgendwie nur, wenn im Vektor Ganzzahlen sind. Ich hab das folgendermaßen probiert:</p>
<pre><code class="language-cpp">vector&lt;int&gt; kanten;
// ... füge Kanten ein
  vector&lt;int&gt;::iterator it;
  it = unique (kanten.begin(), kanten.end()); 
  kanten.resize( it - kanten.begin() );
</code></pre>
<p>Wenn ich das so mache, dann entfernt er doppelte Elemente. Speichere ich jetzt meine Kanten im Vektor als Kanten (bestehend aus 3 int-Werten), dann entfernt er die doppelten leider nicht. Deswegen - und weil ich halt die boost nicht verwenden darf - wollte ich eben sowas wie die multimap&lt;int, int, int&gt; oder so haben. Das war eigentlich die ursprüngliche Motivation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956987</guid><dc:creator><![CDATA[euler (nicht eingeloggt)]]></dc:creator><pubDate>Fri, 24 Sep 2010 16:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Suche geeigneten Container oder sonstige Speichermöglichkeit on Fri, 24 Sep 2010 16:42:27 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht <code>std::set</code> ? Und warum Zeiger auf Kanten statt Kanten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956992</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 24 Sep 2010 16:42:27 GMT</pubDate></item></channel></rss>