<?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[Mittiges einfügen bei Deque]]></title><description><![CDATA[<p>Hallo,<br />
ich nutze im Moment einen Vector, in den ich öfters auch in der Mitte einfüge. Obwohl dann der komplette Vector verschoben werden muss hab ich mich nicht für eine Liste entschieden, damit ich durch wahlfreien Zugriff in logarithmischer Zeit suchen kann (binäre-Suche).</p>
<p>Nun wurde mir der Tipp gegeben, dass eine deque besser sein soll, da diese auch einen wahlfreien Zugriff erlaubt aber sie nicht in einem im Speicher stehen muss und somit beim Einfügen nicht immer komplett verschoben wird.<br />
Dies hört sich sinnvoll an, weil im Vector mehrere 10.000 Einträge stehen können.</p>
<p>Nun wollte ich eure Erfahrung hören, ob sich deque wirklich anbieten hier, da mich vor allem der Satz<br />
<a href="http://www.cplusplus.com/reference/stl/deque/" rel="nofollow">&quot;For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse&quot;</a><br />
kann ich noch nicht ganz so viel anfangen. Ist dies allgemein gesprochen oder auch auf Vector vs. Deque bezogen?</p>
<p>Danke für eure Hilfe. Ich würde die verschiedenen Arten gerne besser verstehen, um sie zukünftig passend wählen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285684/mittiges-einfügen-bei-deque</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 06:03:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285684.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Apr 2011 08:04:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 08:04:11 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich nutze im Moment einen Vector, in den ich öfters auch in der Mitte einfüge. Obwohl dann der komplette Vector verschoben werden muss hab ich mich nicht für eine Liste entschieden, damit ich durch wahlfreien Zugriff in logarithmischer Zeit suchen kann (binäre-Suche).</p>
<p>Nun wurde mir der Tipp gegeben, dass eine deque besser sein soll, da diese auch einen wahlfreien Zugriff erlaubt aber sie nicht in einem im Speicher stehen muss und somit beim Einfügen nicht immer komplett verschoben wird.<br />
Dies hört sich sinnvoll an, weil im Vector mehrere 10.000 Einträge stehen können.</p>
<p>Nun wollte ich eure Erfahrung hören, ob sich deque wirklich anbieten hier, da mich vor allem der Satz<br />
<a href="http://www.cplusplus.com/reference/stl/deque/" rel="nofollow">&quot;For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse&quot;</a><br />
kann ich noch nicht ganz so viel anfangen. Ist dies allgemein gesprochen oder auch auf Vector vs. Deque bezogen?</p>
<p>Danke für eure Hilfe. Ich würde die verschiedenen Arten gerne besser verstehen, um sie zukünftig passend wählen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054314</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Tue, 26 Apr 2011 08:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 08:08:41 GMT]]></title><description><![CDATA[<p>Wie immer bei solchen Detailfragen: sicher kann man nur sein, wenn man es nachmisst. Viele überschätzen auch den Kopieroverhead beim vector.</p>
<p>Wenn du aber binäre Suche machst, nehme ich an, dass der vector immer sortiert sein muss? Und deswegen wohl auch Einfügen in die Mitte, damit er sortiert bleibt? In dem Fall wäre eventuell ein <code>set</code> noch besser, das ist automatisch sortiert und Einfügen und Suchen geht jeweils in O(log n).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054317</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 26 Apr 2011 08:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 08:25:30 GMT]]></title><description><![CDATA[<p>Bei einer deque stehen die Elemente auch (mehr oder weniger) hintereinander im Speicher, um den schnellen Index-Zugriff zu gewährleisten. Deshalb muß sie genau wie der vector alle Elemente umkopieren, wenn du etwas in die Mitte einfügen willst.</p>
<p>Die deque verteilt die Daten auf mehrere Blöcke, aber in denen ist jeweils eine feste Element-Anzahl, die ohne Lücken gefüllt wird. Wenn du dort ein Element einfügst, schiebst du ein anderes vorne oder hinten aus dem aktuellen Block heraus, das dann in den Nachbarblock eingefügt werden muß - und auf diese Weise werden dann doch alle Elemente bis zum nächstgelegenen Ende der deque umkopiert, um eine Lücke zu schaffen.</p>
<p>Wenn es dir wirklich um die Suchmöglichkeiten geht, solltest du eher einen Container nehmen, der schon von sich aus sortiert ist ((multi)set oder (multi)map). Bei denen muß beim Einfügen nichts umkopiert werden und die binäre Suche unterstützen sie auch direkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054335</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 26 Apr 2011 08:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 08:30:19 GMT]]></title><description><![CDATA[<p>C Anfänger schrieb:</p>
<blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/deque/" rel="nofollow">&quot;For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse&quot;</a><br />
kann ich noch nicht ganz so viel anfangen. Ist dies allgemein gesprochen oder auch auf Vector vs. Deque bezogen?</p>
</blockquote>
<p>Wenn du den ganzen Satz zitiert hättest, wäre auch klar, dass sich die Aussage auf Deque vs. Listen bezieht.</p>
<blockquote>
<p>For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse and have less consistent iterators and references than lists.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2054337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054337</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Apr 2011 08:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 08:59:22 GMT]]></title><description><![CDATA[<p>vielen lieben Dank für die Antworten.<br />
Ich verstehe deque nun besser</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn es dir wirklich um die Suchmöglichkeiten geht, solltest du eher einen Container nehmen, der schon von sich aus sortiert ist ((multi)set oder (multi)map). Bei denen muß beim Einfügen nichts umkopiert werden und die binäre Suche unterstützen sie auch direkt.</p>
</blockquote>
<p>Ja, ich will eine große Menge von Daten speichern (bei denen im Laufe der Zeit immer mehr dazu kommen und manche auch wieder entnommen werden) und darin nach speziellen Einträgen suchen.</p>
<p>Es ist im Moment auch die Stelle im Programm, die am langsamsten ist.</p>
<p>Ich habe es schon um einiges verschnellert, in dem ich die sequentielle Suche eingebaut habe.</p>
<p>Einen sortierten Container habe ich bis jetzt noch nicht verwendet, da die Elemente Objekte einer eigenen Klasse sind, bei denen intern irgend wo eine eindeutige ID gespeichert ist, nach der sortiert werden.<br />
Nach dem gesuchten Eintrag wird gesucht, in dem ich sage, ich will das Element mit einer speziellen ID.</p>
<p>Wenn ich ein Set hernehmen will, muss ich denke ich einige Operatoren überschreiben, richtig? Ich geh davon aus, &lt;, &gt; und == für die eigene Klasse und die Operatoren für die ID-Klasse.<br />
Würde das funktionieren? Denke das wäre effizienter wie mein selbstimplementierter &quot;Container&quot;.</p>
<p>Ich hoffe ich versteht meine Frage, bin selbst gerade verwirrt <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="🙂"
    /><br />
Versuche es bei Unverständlichkeit nochmals besser zu formulieren.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>C Anfänger schrieb:</p>
<blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/deque/" rel="nofollow">&quot;For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse&quot;</a><br />
kann ich noch nicht ganz so viel anfangen. Ist dies allgemein gesprochen oder auch auf Vector vs. Deque bezogen?</p>
</blockquote>
<p>Wenn du den ganzen Satz zitiert hättest, wäre auch klar, dass sich die Aussage auf Deque vs. Listen bezieht.</p>
<blockquote>
<p>For operations that involve frequent insertion or removals of elements at positions other than the beginning or the end, deques perform worse and have less consistent iterators and references than lists.</p>
</blockquote>
</blockquote>
<p>hm ja, da hast recht. Als ich es gelesen habe, hab ich gar nicht an den Container list gedacht, sondern dachte an lists als Überbegriff für container. Wie peinlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054360</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Tue, 26 Apr 2011 08:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 09:04:18 GMT]]></title><description><![CDATA[<p>Bei <code>set</code> gibt es zwei Möglichkeiten: entweder den <code>&lt;</code> -Operatur für deine Klasse überschreiben (der dann intern die IDs vergleicht) oder, falls das vom Interface her unerwünscht ist, einen Funktor schreiben (im Wesentlichen eine Struktur mit einem überladenen <code>()</code> -Operator, der 2 Objekte der Klasse nimmt und zurückgibt, ob das erste kleiner als das zweite ist - also im Prinzip genau das gleiche wie der <code>&lt;</code> -Operator macht) und diesen als 2. Template-Argument bei dem set übergeben.<br />
Probier es aus. Ich denke du wirst einen ordentlichen Performanceschub bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054364</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 26 Apr 2011 09:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 09:08:44 GMT]]></title><description><![CDATA[<p>Um einen sortierten Container zu verwenden, benötigst du eine Vergleichs-Operation, die aber recht einfach zu schreiben ist (zumindest solange du weißt, wonach die Elemente sortiert werden sollen):</p>
<pre><code class="language-cpp">bool operator&lt;(const ID&amp; lhs, const ID&amp; rhs)
{
  //Vergleich der ID-Werte
}

bool operator&lt;(const element&amp; lhs, const element&amp; rhs)
{
  return lhs.getID() &lt; rhs.getID();
}
</code></pre>
<p>das ist schon alles, was du benötigst, um die Werte in eine set&lt;&gt; eintragen zu können, die übrigen Vergleichsoperatoren sind Luxus. Ich würde eventuell noch einen operator== schreiben (set nutzt übrigens den &lt; Operator zur Feststellung, was &quot;gleich&quot; ist) und den Rest mittels std::rel_ops dazuholen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054367</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 26 Apr 2011 09:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 09:59:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@C</a> Anfänger:<br />
BTW: Insertions <em>nahe</em> dem Anfang sollten bei <code>std::deque</code> mMn. immer schneller sein als bei <code>std::vector</code> .</p>
<p>Insertions die ziemlich gut in der Mitte liegen können dagegen bei <code>std::deque</code> langsamer sein, aber auch viel schneller als bei <code>std::vector</code> . Kommt drauf an wie die <code>std::deque</code> intern implementiert ist. Bei der MSVC Implementierung z.B. ist die &quot;Seitengrösse&quot; abhängig von <code>sizeof(T)</code> , und wenn das gross genug ist werden &quot;Seiten&quot; aus nur einem einzigen Element verwendet. In dem Fall sollten Insertions schneller sein als bei <code>std::vector</code> , vorausgesetzt die Implementierung &quot;erkennt&quot; dass nur der Zeiger-Table verändert werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054400</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Apr 2011 09:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 11:29:12 GMT]]></title><description><![CDATA[<p>dass der &lt; Operator beöntigt wird für Set, hört sich sinnvoll an,<br />
bloß:</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>set nutzt übrigens den &lt; Operator zur Feststellung, was &quot;gleich&quot; ist</p>
</blockquote>
<p>rein interessehalber: wie kann man mit einem &lt; Operator die Gleichheit feststellen?</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@C</a> Anfänger:<br />
BTW: Insertions <em>nahe</em> dem Anfang sollten bei <code>std::deque</code> mMn. immer schneller sein als bei <code>std::vector</code> .</p>
<p>Insertions die ziemlich gut in der Mitte liegen können dagegen bei <code>std::deque</code> langsamer sein, aber auch viel schneller als bei <code>std::vector</code> . Kommt drauf an wie die <code>std::deque</code> intern implementiert ist. Bei der MSVC Implementierung z.B. ist die &quot;Seitengrösse&quot; abhängig von <code>sizeof(T)</code> , und wenn das gross genug ist werden &quot;Seiten&quot; aus nur einem einzigen Element verwendet. In dem Fall sollten Insertions schneller sein als bei <code>std::vector</code> , vorausgesetzt die Implementierung &quot;erkennt&quot; dass nur der Zeiger-Table verändert werden muss.</p>
</blockquote>
<p>danke für den hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054459</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Tue, 26 Apr 2011 11:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 11:33:47 GMT]]></title><description><![CDATA[<p>C Anfänger schrieb:</p>
<blockquote>
<p>rein interessehalber: wie kann man mit einem &lt; Operator die Gleichheit feststellen?</p>
</blockquote>
<p><code>a == b &lt;==&gt; !(a &lt; b) &amp;&amp; !(b &lt; a)</code> .</p>
<p>Tatsächlich kann man ausschließlich mit dem <code>&lt;</code> -Operator und den logischen Verknüpfungen sämtliche anderen Vergleichsoperatoren herleiten, vorausgesetzt der Operator erzeugt eine strenge Totalordnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054463</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 26 Apr 2011 11:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 11:38:03 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>C Anfänger schrieb:</p>
<blockquote>
<p>rein interessehalber: wie kann man mit einem &lt; Operator die Gleichheit feststellen?</p>
</blockquote>
<p><code>a == b &lt;==&gt; !(a &lt; b) &amp;&amp; !(b &lt; a)</code> .</p>
<p>Tatsächlich kann man ausschließlich mit dem <code>&lt;</code> -Operator und den logischen Verknüpfungen sämtliche anderen Vergleichsoperatoren herleiten, vorausgesetzt der Operator erzeugt eine strenge Totalordnung.</p>
</blockquote>
<p>das ist gut <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="🙂"
    /><br />
muss ich mir merken fürs nächste mal, auch wenns grad offtopic ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054470</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 26 Apr 2011 11:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 11:46:03 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>C Anfänger schrieb:</p>
<blockquote>
<p>rein interessehalber: wie kann man mit einem &lt; Operator die Gleichheit feststellen?</p>
</blockquote>
<p><code>a == b &lt;==&gt; !(a &lt; b) &amp;&amp; !(b &lt; a)</code> .</p>
<p>Tatsächlich kann man ausschließlich mit dem <code>&lt;</code> -Operator und den logischen Verknüpfungen sämtliche anderen Vergleichsoperatoren herleiten, vorausgesetzt der Operator erzeugt eine strenge Totalordnung.</p>
</blockquote>
<p>faszinierend<br />
aber ja, logisch. wär ich nicht so schnell drauf gekommen.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054480</guid><dc:creator><![CDATA[C Anfänger]]></dc:creator><pubDate>Tue, 26 Apr 2011 11:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mittiges einfügen bei Deque on Tue, 26 Apr 2011 14:56:19 GMT]]></title><description><![CDATA[<p>Auf so nen Mist kommt man sofort, wenn man Informatik studiert hat. <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>Aus einem beschränkten Satz Bitoperationen andere Bitoperationen zu bauen ist recht Gang und Gebe in der THeorie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054628</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 26 Apr 2011 14:56:19 GMT</pubDate></item></channel></rss>