<?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[Welchen Container für optimierten Such- und Durchlaufzugriff]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Ich bräuchte eure Hilfe bzgl. der richtigen Auswahl eines Containers.</p>
<p>Kurz zum Iststand:<br />
Es wird in einem sehr alten Sourcecode eine Art Fernseh-Sendungsprogamm mittels einer selbstgebauten doppeltverketteten Liste abgebildet. Zustäzlich gibt es auch einen Baum (key = Beginndatum der Sendung) und als Datenobjekt der Pointer auf das Listenobjekt.<br />
Der Vorteil dabei war/ist, dass man mittels dem Baum schnell auf ein gewünschtes Datum springen kann und da das gelieferte Objekt auch alle Daten (next/prev pointer) für die Navigation in der doppeltverketteten Liste hat, war eine weitere Navigation in dieser Liste auch sehr schnell (weil man zb. die nächsten 20 Einträge zurückliefern muss).</p>
<p>Kann man das ganze auch irgendwie mit Containern aus der STL oder boost auch abbilden?<br />
Weil mit einer std::map alleine bin ich beim weiteren durchiterieren eher sehr langsam und eine Kombination mit std::vector ist mir leider nicht bekannt.</p>
<p>Ich freue mich auf eure Vorschläge!</p>
<p>vg Johannes</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325509/welchen-container-für-optimierten-such-und-durchlaufzugriff</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 08:19:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325509.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 May 2014 05:45:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 05:45:01 GMT]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Ich bräuchte eure Hilfe bzgl. der richtigen Auswahl eines Containers.</p>
<p>Kurz zum Iststand:<br />
Es wird in einem sehr alten Sourcecode eine Art Fernseh-Sendungsprogamm mittels einer selbstgebauten doppeltverketteten Liste abgebildet. Zustäzlich gibt es auch einen Baum (key = Beginndatum der Sendung) und als Datenobjekt der Pointer auf das Listenobjekt.<br />
Der Vorteil dabei war/ist, dass man mittels dem Baum schnell auf ein gewünschtes Datum springen kann und da das gelieferte Objekt auch alle Daten (next/prev pointer) für die Navigation in der doppeltverketteten Liste hat, war eine weitere Navigation in dieser Liste auch sehr schnell (weil man zb. die nächsten 20 Einträge zurückliefern muss).</p>
<p>Kann man das ganze auch irgendwie mit Containern aus der STL oder boost auch abbilden?<br />
Weil mit einer std::map alleine bin ich beim weiteren durchiterieren eher sehr langsam und eine Kombination mit std::vector ist mir leider nicht bekannt.</p>
<p>Ich freue mich auf eure Vorschläge!</p>
<p>vg Johannes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397593</guid><dc:creator><![CDATA[taff]]></dc:creator><pubDate>Tue, 06 May 2014 05:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 06:00:27 GMT]]></title><description><![CDATA[<p>Einen vector nehmen, nach Datum sortieren, per lower_bound nach Einträgen suchen. Weitere Navigation ist einfach wie bei der Liste und es gibt keinen Overhead durch next/prev-Pointer und Cache-Misses. Wenn du ständig tausende Fernsehprogramme einfügst und löschst ohne was zu suchen könnte es inperformant werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397595</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 06 May 2014 06:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 06:03:21 GMT]]></title><description><![CDATA[<p>Du könntest boost::intrusive benutzen, damit kannst du die pointer der datenstruktur direkt mit in den daten ablegen, und so jederzeit wenn du daten in der hand hast auch auf von dort aus in der entsprechenden datenstruktur navigieren. Einen suchbaum mit Liste zum iterieren lässt sich da relativ leicht bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397596</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Tue, 06 May 2014 06:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 06:42:46 GMT]]></title><description><![CDATA[<p>taff schrieb:</p>
<blockquote>
<p>Es wird in einem sehr alten Sourcecode eine Art Fernseh-Sendungsprogamm mittels einer selbstgebauten doppeltverketteten Liste abgebildet. Zustäzlich gibt es auch einen Baum (key = Beginndatum der Sendung) und als Datenobjekt der Pointer auf das Listenobjekt.<br />
Der Vorteil dabei war/ist, dass man mittels dem Baum schnell auf ein gewünschtes Datum springen kann und da das gelieferte Objekt auch alle Daten (next/prev pointer) für die Navigation in der doppeltverketteten Liste hat, war eine weitere Navigation in dieser Liste auch sehr schnell (weil man zb. die nächsten 20 Einträge zurückliefern muss).</p>
</blockquote>
<p>Der stl-Baum kann schnell durchiterieren! Dazu bauen sie extra noch Aufwärtszeiger ein. Brauchst den Trick mit der parallelen Liste überhaupt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397601</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 06 May 2014 06:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 06:50:19 GMT]]></title><description><![CDATA[<p>Sind denn die Einträge in der Liste auch nach Datum sortiert?<br />
Oder was sind die &quot;nächsten 20 Einträge&quot;, wenn ich von einem beliebigen Element starte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397603</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 06 May 2014 06:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 07:43:45 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>taff schrieb:</p>
<blockquote>
<p>Es wird in einem sehr alten Sourcecode eine Art Fernseh-Sendungsprogamm mittels einer selbstgebauten doppeltverketteten Liste abgebildet. Zustäzlich gibt es auch einen Baum (key = Beginndatum der Sendung) und als Datenobjekt der Pointer auf das Listenobjekt.<br />
Der Vorteil dabei war/ist, dass man mittels dem Baum schnell auf ein gewünschtes Datum springen kann und da das gelieferte Objekt auch alle Daten (next/prev pointer) für die Navigation in der doppeltverketteten Liste hat, war eine weitere Navigation in dieser Liste auch sehr schnell (weil man zb. die nächsten 20 Einträge zurückliefern muss).</p>
</blockquote>
<p>Der stl-Baum kann schnell durchiterieren! Dazu bauen sie extra noch Aufwärtszeiger ein. Brauchst den Trick mit der parallelen Liste überhaupt nicht.</p>
</blockquote>
<p>Dann muss man aber den Baum hoch und runterlaufen. Das geht sicher auch schnell... ist aber halt ein anderes schnell. <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/2397614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397614</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Tue, 06 May 2014 07:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 08:20:46 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten!</p>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Einen vector nehmen, nach Datum sortieren, per lower_bound nach Einträgen suchen. Weitere Navigation ist einfach wie bei der Liste und es gibt keinen Overhead durch next/prev-Pointer und Cache-Misses. <strong>Wenn du ständig tausende Fernsehprogramme einfügst und löschst</strong> ohne was zu suchen könnte es inperformant werden.</p>
</blockquote>
<p>Ja so ist es, dass ständig Einträge gelöscht/geändert/eingefügt werden.</p>
<p>Jester schrieb:</p>
<blockquote>
<p>Du könntest boost::intrusive benutzen, damit kannst du die pointer der datenstruktur direkt mit in den daten ablegen, und so jederzeit wenn du daten in der hand hast auch auf von dort aus in der entsprechenden datenstruktur navigieren. Einen suchbaum mit Liste zum iterieren lässt sich da relativ leicht bauen.</p>
</blockquote>
<p>Irgendwie tue ich mir bisserl schwer, das konzept von boost::intrusive zu verstehen. Also ich ersetze damit den Baum aber nicht die Liste?</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Der stl-Baum kann schnell durchiterieren! Dazu bauen sie extra noch Aufwärtszeiger ein. Brauchst den Trick mit der parallelen Liste überhaupt nicht.</p>
</blockquote>
<p>Ein Test liefert mir folgendes Ergebnis: Vector und Map besitzen jeweils 2000 Elemente. Beide Container werden mittels iterator von begin bis end durchgelaufen. Es ist dann doch ein unterschied bemerkbar, überhaupt wenn man das durchlaufen statt einmal 100mal macht (vec:0,07sec zu map:0,09sec)<br />
Oder muss ich einen bestimmten map-Iterator verwenden?</p>
<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Sind denn die Einträge in der Liste auch nach Datum sortiert?<br />
Oder was sind die &quot;nächsten 20 Einträge&quot;, wenn ich von einem beliebigen Element starte?</p>
</blockquote>
<p>Ja jetzt ist die Liste auch sortiert, wobei ich mir das doppelte sortieren gerne sparen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397619</guid><dc:creator><![CDATA[taff]]></dc:creator><pubDate>Tue, 06 May 2014 08:20:46 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 10:40:55 GMT]]></title><description><![CDATA[<p>taff schrieb:</p>
<blockquote>
<p>Ein Test liefert mir folgendes Ergebnis: Vector und Map besitzen jeweils 2000 Elemente. Beide Container werden mittels iterator von begin bis end durchgelaufen. Es ist dann doch ein unterschied bemerkbar, überhaupt wenn man das durchlaufen statt einmal 100mal macht (vec:0,07sec zu map:0,09sec)<br />
Oder muss ich einen bestimmten map-Iterator verwenden?</p>
</blockquote>
<p>Nee, war schon richtig. Ein wenig langsamer ist die map ohne Liste beim reinen Durchrennen. Dafür aber beim Einfügen und Löschen fast doppelt so schnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397633</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 06 May 2014 10:40:55 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 13:54:29 GMT]]></title><description><![CDATA[<p>Klingt so, als würdest du boost::container::flat_map suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397682</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 13:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 13:56:55 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>taff schrieb:</p>
<blockquote>
<p>Ein Test liefert mir folgendes Ergebnis: Vector und Map besitzen jeweils 2000 Elemente. Beide Container werden mittels iterator von begin bis end durchgelaufen. Es ist dann doch ein unterschied bemerkbar, überhaupt wenn man das durchlaufen statt einmal 100mal macht (vec:0,07sec zu map:0,09sec)<br />
Oder muss ich einen bestimmten map-Iterator verwenden?</p>
</blockquote>
<p>Nee, war schon richtig. Ein wenig langsamer ist die map ohne Liste beim reinen Durchrennen. Dafür aber beim Einfügen und Löschen fast doppelt so schnell.</p>
</blockquote>
<p>Huch, warum sollte sie das denn sein? Ich muss doch beim Einfügen das nächstkleinere Element (oder das nächstgrößere) sowieso bestimmen und kann mich dort dann durch umbiegen von einer Hand voll Zeigern in die Liste einhängen. Wo bezahle ich da denn einen Faktor 2?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10599">@taff</a>: damit müsstest Du schon beide Datenstrukturen ersetzen: Baum und Liste. Ich glaube aber auch nicht, dass für Deine Anwendung der Performancegewinn wirklich groß bist. Und bevor Du jetzt ewig brauchst würde ich's einfach mal mit ner map machen. Wenn Du alles schön kapselst kannst Du die Datenstruktur dann ja irgendwann mal ersetzen wenn sich rausstellen sollte, dass es wirklich nicht schnell genug ist.</p>
<p>Dein Vergleich ist auch nicht ganz fair, weil Du vector mit map vergleichst, du solltest wenn aber eher list mit map vergleichen. Ich glaube nicht, dass Du mit derart kleinen Elementzahlen da einen großen Unterschied sehen wirst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397683</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Tue, 06 May 2014 13:56:55 GMT</pubDate></item><item><title><![CDATA[Reply to Welchen Container für optimierten Such- und Durchlaufzugriff on Tue, 06 May 2014 14:04:02 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Huch, warum sollte sie das denn sein? Ich muss doch beim Einfügen das nächstkleinere Element (oder das nächstgrößere) sowieso bestimmen und kann mich dort dann durch umbiegen von einer Hand voll Zeigern in die Liste einhängen. Wo bezahle ich da denn einen Faktor 2?</p>
</blockquote>
<p>Gar nicht, hatte das intrusive nicht mehr im Sinn. Ich denke, er zahlt eh fast nur für new/delete.</p>
<p>Was wird wohl die Anzeige auf den Bildschirm kosten im Vergleich zum Durchlaufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397685</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 06 May 2014 14:04:02 GMT</pubDate></item></channel></rss>