<?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 Alternative zu std::map]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgenden &quot;Algorithmus&quot;: Ich bekomme einen std::vector&lt;IndexHeightPair&gt; elements mit Eingabedaten. Abhängig von bestimmten Attributen dieser IndexHeightPair, wandert jedes Element in mindestens eine &quot;Queue&quot; mit einer bestimmten Nummer. Ein Element kann in eine, zwei oder vier Queues gesteckt werden.</p>
<p>Zum besseren Verständnis hier grob der Algo:</p>
<pre><code class="language-cpp">std::map&lt;int, std::vector&lt;IndexHeightPair&gt; &gt; queues;
IndexHeightPair pair;

for(int i=0, numElments = elements.size(); i &lt; numElments; i++) {

   pair = elements[i];

   index = ... // Errechne index für das aktuelle element

   queues[index].push_back( pair ); // Element kommt immer in mind. 1 &quot;Queue&quot;

   if( .. bestimmte Bedingungen ..) {
       queues[index - 1].push_back( pair );
       queues[index - mNumEdgesAlongSide].push_back( pair );
       queues[index - mNumEdgesAlongSide - 1].push_back( pair );
   }
   else if(.. bedingung ..) {	
      queues[index - mNumEdgesAlongSide].push_back( pair );
   }
   else if(.. bedingung ..) {
      queues[patchIndex - 1].push_back( pair );
   }
}
</code></pre>
<p>Ich denke hier sieht man ganz gut, was ich meine. Für jedes Element wird ein Index berechnet und abhängig von diesem wird dann das Element in einer, zwei oder vier queues gesteckt. Meine Datenstruktur queues ist eine map&lt;&gt;, deren Key die Queue Number ist und der Value ein std::vector&lt;&gt;.<br />
Wenn die schleife beendet ist, sieht die map z.B. so aus:<br />
queues[3] == {element1, element3, element100}<br />
queues[4] == {element1, element44}<br />
queues[11] == {element23}<br />
Die Queue Nummern sind meistens nicht zusammenhängend.<br />
Mein Problem ist nun: Ich hab den Code gestest und er ist extrem langsam (auch im Release Modus). Zu Testzwecken habe ich mal die push_back() auskommentiert, und dann lief meine Anwendung wieder richtig schnell. Kann das eine bestätigen oder sich erklären, wieso das push_back() hier langsam sein könnte?</p>
<p>Offenbar sind also die push_back() der map relativ langsam. Meine Frage ist nun: Wie kann ich meine Datenstruktur mit etwas anderem als std::map abbilden? Meine Queues müssen NICHT sortiert sein. Gibts da eine schnellere Alternative oder was ganz anderes?</p>
<p>Danke für 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/250354/suche-alternative-zu-std-map</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 03:12:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250354.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Sep 2009 22:36:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suche Alternative zu std::map on Wed, 16 Sep 2009 22:36:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgenden &quot;Algorithmus&quot;: Ich bekomme einen std::vector&lt;IndexHeightPair&gt; elements mit Eingabedaten. Abhängig von bestimmten Attributen dieser IndexHeightPair, wandert jedes Element in mindestens eine &quot;Queue&quot; mit einer bestimmten Nummer. Ein Element kann in eine, zwei oder vier Queues gesteckt werden.</p>
<p>Zum besseren Verständnis hier grob der Algo:</p>
<pre><code class="language-cpp">std::map&lt;int, std::vector&lt;IndexHeightPair&gt; &gt; queues;
IndexHeightPair pair;

for(int i=0, numElments = elements.size(); i &lt; numElments; i++) {

   pair = elements[i];

   index = ... // Errechne index für das aktuelle element

   queues[index].push_back( pair ); // Element kommt immer in mind. 1 &quot;Queue&quot;

   if( .. bestimmte Bedingungen ..) {
       queues[index - 1].push_back( pair );
       queues[index - mNumEdgesAlongSide].push_back( pair );
       queues[index - mNumEdgesAlongSide - 1].push_back( pair );
   }
   else if(.. bedingung ..) {	
      queues[index - mNumEdgesAlongSide].push_back( pair );
   }
   else if(.. bedingung ..) {
      queues[patchIndex - 1].push_back( pair );
   }
}
</code></pre>
<p>Ich denke hier sieht man ganz gut, was ich meine. Für jedes Element wird ein Index berechnet und abhängig von diesem wird dann das Element in einer, zwei oder vier queues gesteckt. Meine Datenstruktur queues ist eine map&lt;&gt;, deren Key die Queue Number ist und der Value ein std::vector&lt;&gt;.<br />
Wenn die schleife beendet ist, sieht die map z.B. so aus:<br />
queues[3] == {element1, element3, element100}<br />
queues[4] == {element1, element44}<br />
queues[11] == {element23}<br />
Die Queue Nummern sind meistens nicht zusammenhängend.<br />
Mein Problem ist nun: Ich hab den Code gestest und er ist extrem langsam (auch im Release Modus). Zu Testzwecken habe ich mal die push_back() auskommentiert, und dann lief meine Anwendung wieder richtig schnell. Kann das eine bestätigen oder sich erklären, wieso das push_back() hier langsam sein könnte?</p>
<p>Offenbar sind also die push_back() der map relativ langsam. Meine Frage ist nun: Wie kann ich meine Datenstruktur mit etwas anderem als std::map abbilden? Meine Queues müssen NICHT sortiert sein. Gibts da eine schnellere Alternative oder was ganz anderes?</p>
<p>Danke für 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/1780165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780165</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Wed, 16 Sep 2009 22:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Wed, 16 Sep 2009 22:54:10 GMT]]></title><description><![CDATA[<p>warum kein std::vector&lt;std::vector&lt;IndexHeightPair&gt; &gt; queues ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780172</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 Sep 2009 22:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Wed, 16 Sep 2009 23:01:12 GMT]]></title><description><![CDATA[<p>Ein paar Fragen:</p>
<p>Ist IndexHeightPair ein Typ der langwierig zu kopieren ist? Falls ja solltest du die vielen Kopien vermeiden und lieber mit Zeigern arbeiten.</p>
<p>Werden in einem Durchlauf viele Elemente in die queues gepackt? Falls ja: std::vector ist nicht so ideal, wenn seine Größe schnell wächst. Falls möglich, sollte man vorher schonmal den Speicher reservieren. Falls dies nicht möglich ist, sollte man eine wachstumsfreudigeren Container wie deque oder list verwenden.</p>
<p>Und eine Anmerkung:<br />
Ich glaube nicht, dass map hier das Problem ist. Es ist wohl eher, dass hier sehr viele Kopien von IndexHeightPair Objekten gemacht werden. Einmal bei jedem push_back und immer wenn der vector in der queue neuen Speicher braucht, muss er alle seine Elemente in den neuen Speicherbereich kopieren. Falls IndexHeightPair mehr als nur eine handvoll Datenelemente hat, kommt da ganz schön was zusammen.</p>
<p>Du kannst ja mal einen Profiler benutzen, dann siehst du, welche Unterfunktion es genau ist, die so lange braucht bzw. so oft aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780173</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 16 Sep 2009 23:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Wed, 16 Sep 2009 23:34:03 GMT]]></title><description><![CDATA[<p>Über das Gerücht des lahmen vectors:<br />
Sagen wir mal 2^30 Einfügungen eines int, mehr als eine Milliarde. Sagen wir mal der vector beginnt mit size=1 und verdoppelt seine größe immer, wenn er zu voll ist. Macht wieviele Verdopplungen? Nur 30 Stück. Macht wieviele Kopierungen von int? 2^30-1 Stück. Man zahlt also unabhängig von der Größe des vectors pro push_back nur ein bis zwei zusätzliche Element-Kopierungen fürs Wachsen. Das sind nicht viele Takte. Nicht bei einem einfachen pair&lt;int,int&gt; oder so. Die list hingegen verbruzzelt pro push_back gleich mal hundert Takte für das new. Ein Armutszeugnis.</p>
<p>In der Praxis hat bei mir vector gegen list immer die Nase weit vorn. Wäre das Zeug teuer zu kopieren, dann wäre es Unfug, es in vier Listen zu stopfen, sondern man würde Zeiger stopfen. Mit wieder klarstem Sieg für vector.</p>
<p>Queue oder vector? Hängt von der Datenlage ab. Sind die Objekte eher Schnellkopierer kann vector netter sein. Hier schien mir das so. Und vor allem ist zu hoffen, daß vector weniger Speicher frißt. Ich hatte den Eindruck, als gäbe es zehntausende von queues, manche davon blieben ganz leer, viele hätten sehr wenige Elemente. War nur so ein Gefühl. Da dann immer für die queue eine ganze Speicherseite zu allokieren, würde mir weh tun.</p>
<p>Und man braucht keinen profiler. Es reicht clock().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780175</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 Sep 2009 23:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Wed, 16 Sep 2009 23:36:03 GMT]]></title><description><![CDATA[<p>Schon mal danke für eure Antworten!</p>
<p>volkard schrieb:</p>
<blockquote>
<p>warum kein std::vector&lt;std::vector&lt;IndexHeightPair&gt; &gt; queues ?</p>
</blockquote>
<p>Das würde natürlich gehen, aber ich hielt map erstmal für eleganter, da ich ja teilweise große Lücken in den Queue-Indices habe. Es kann durchaus sein, dass ich in Queue[2] 100 Elemente habe und die nächste Queue ist Queue[80]. Alle Queues dazwischen brauche ich quasi nicht (haben 0 Elemente).<br />
Sehe ich das richtig, dass wenn ich diese verschachtelte vector Datenstruktur nehme, ich zuvor die Größen festlegen muss? Also so z.B:</p>
<pre><code class="language-cpp">queues.resize(mNumQueues); // Die Maximalzahl an Queues kenne ich
   for(uint i=0; i &lt; queues.size(); i++)
      queues[i].resize(mNumElements); // Mögliche Maximalzahl in einer Queue
</code></pre>
<p>?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Die IndexHeightPair Struktur ist sehr simpel:</p>
<pre><code class="language-cpp">struct IndexHeightPair {
   uint  row, col;	
   float height;		
};
</code></pre>
<p>Ich ging davon aus, dass so eine kleine Struktur keine Probleme macht. Das</p>
<pre><code class="language-cpp">pair = elements[i];
</code></pre>
<p>habe ich nur gemacht, weil ich dachte das könnte Performance bringen, wenn ich den vektor nur EINMAL deferenziere und dann nur noch mit pair arbeite. Sonst hätte ich an mehreren Stellen in der Schleife (unter anderem bei allen push_backs) ein elements[i].</p>
<p>Ich könnte mir mittlerweile auch vorstellen, dass garnicht die map das Problem ist, sondern ein mögliches &quot;geresize&quot; der vektoren bei den push_back().<br />
Nur habe ich da 2 Probleme: Ich weiß ja vor Betreten der Schleife nicht, welche Queue-Nummern rauskommen werden - ich kann also nicht im Voraus die entsprechenden Vektoren resizen().<br />
Das 2. Problem: Offenbar ist auch ein manuelles Aufrufen von Resize() langsam. Ich habe nur mal zum Test in meinen schnell ausführenden Code das hier eingefügt:</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt;IndexHeightPair&gt; &gt; queues(mNumQueues, 	std::vector&lt;IndexHeightPair&gt; ( 500 ));
</code></pre>
<p>und sofort war meine Performance wieder im Keller!</p>
<p>So wie ich das im Moment sehe, wäre wohl das das schnellste:<br />
Ich lege EINMAL einen vector&lt;vector&lt;IndexHeightPair&gt;&gt; an und resize ihn.<br />
Vor der Schleife gehe ich dann über den vector und rufe für jeden inneren Vektor clear auf:</p>
<pre><code class="language-cpp">for(uint i=0; i &lt; queues.size(); i++)
   queues[i].clear();
</code></pre>
<p>Meint ihr das ist gut/elegant?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780176</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Wed, 16 Sep 2009 23:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 04:52:30 GMT]]></title><description><![CDATA[<p>mapper schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>warum kein std::vector&lt;std::vector&lt;IndexHeightPair&gt; &gt; queues ?</p>
</blockquote>
<p>Das würde natürlich gehen, aber ich hielt map erstmal für eleganter, da ich ja teilweise große Lücken in den Queue-Indices habe. Es kann durchaus sein, dass ich in Queue[2] 100 Elemente habe und die nächste Queue ist Queue[80]. Alle Queues dazwischen brauche ich quasi nicht (haben 0 Elemente).</p>
</blockquote>
<p>Nicht so schlimm. Ein leerer vector sollte nur 8 Bytes oder so fressen.</p>
<p>mapper schrieb:</p>
<blockquote>
<p>Sehe ich das richtig, dass wenn ich diese verschachtelte vector Datenstruktur nehme, ich zuvor die Größen festlegen muss? Also so z.B:</p>
<pre><code class="language-cpp">queues.resize(mNumQueues); // Die Maximalzahl an Queues kenne ich
   for(uint i=0; i &lt; queues.size(); i++)
      queues[i].resize(mNumElements); // Mögliche Maximalzahl in einer Queue
</code></pre>
<p>?</p>
</blockquote>
<p>Das wäre Bockmist.<br />
Machen nur</p>
<pre><code class="language-cpp">queues.resize(mNumQueues); // Die Maximalzahl an Queues kenne ich
</code></pre>
<p>damit der Indexzugriff queues[index] geht. Dort liegt dann ein korrekter (aber noch leerer) vector. queues[index].push_back( pair ); geht dann auch.</p>
<blockquote>
<p>Ich könnte mir mittlerweile auch vorstellen, dass garnicht die map das Problem ist, sondern ein mögliches &quot;geresize&quot; der vektoren bei den push_back().</p>
</blockquote>
<p>Nein. Was soll das für einen Vorteil haben, das erste new für jeden vector vor der Hauptschleife auszuführen, statt nur für jeden benötigten vector in der Hauptschleife? für das &quot;if(size==capacity) grow();&quot; im pushback muß eh immer ein (sehr billiges, weil praktisch immer richtiggeratenes) if gezahlt werden.</p>
<blockquote>
<p>Nur habe ich da 2 Probleme: Ich weiß ja vor Betreten der Schleife nicht, welche Queue-Nummern rauskommen werden - ich kann also nicht im Voraus die entsprechenden Vektoren resizen().</p>
</blockquote>
<p>Gut. Glück gehabt. Sonst hättest Du noch an Unfug gedacht.</p>
<blockquote>
<p>Das 2. Problem: Offenbar ist auch ein manuelles Aufrufen von Resize() langsam. Ich habe nur mal zum Test in meinen schnell ausführenden Code das hier eingefügt:</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt;IndexHeightPair&gt; &gt; queues(mNumQueues, 	std::vector&lt;IndexHeightPair&gt; ( 500 ));
</code></pre>
<p>und sofort war meine Performance wieder im Keller!</p>
</blockquote>
<p>Jup.</p>
<blockquote>
<p>So wie ich das im Moment sehe, wäre wohl das das schnellste:<br />
Ich lege EINMAL einen vector&lt;vector&lt;IndexHeightPair&gt;&gt; an und resize ihn.<br />
Vor der Schleife gehe ich dann über den vector und rufe für jeden inneren Vektor clear auf:</p>
<pre><code class="language-cpp">for(uint i=0; i &lt; queues.size(); i++)
   queues[i].clear();
</code></pre>
<p>Meint ihr das ist gut/elegant?</p>
</blockquote>
<p>[/quote]<br />
Warum clear für jeden vector aufrufen? Die waren doch schon alle leer. Noch leerer kannst Du sie nicht machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780183</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 17 Sep 2009 04:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 04:56:22 GMT]]></title><description><![CDATA[<p>mapper schrieb:</p>
<blockquote>
<p>Ich könnte mir mittlerweile auch vorstellen, dass garnicht die map das Problem ist, sondern ein mögliches &quot;geresize&quot; der vektoren bei den push_back().</p>
</blockquote>
<p>Das Gerücht des lahmen vectors wiedermal? Ich muß wohl mal ein Bildchen malen, das zeigt, wie unheimlich wenig Resizen benötigt wird und wie unheimlich wenige Takte das braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780185</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 17 Sep 2009 04:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 15:57:56 GMT]]></title><description><![CDATA[<p>Also ehrlich gesagt bin ich kein Stückchen weiter gekommen.</p>
<pre><code>Warum clear für jeden vector aufrufen? Die waren doch schon alle leer. Noch leerer kannst Du sie nicht machen.
</code></pre>
<p>Der Code von oben (die Schleife) steht in einer Methode (nennen wir sie mal Foo), die pro Sekunde ca. 1000 Mal aufgerufen wird (1000 FPS).<br />
Wie ich bereits geschrieben habe, ist bei meinem Test der std::vector&lt;std::vector&lt;IndexHeightPair&gt; &gt; ein Member der Klasse und ich rufe das resize() auf dem vector nur EINMAL auf. Nach jedem Aufruf der Methode ist der vector natürlich gefüllt und ich muss ihn vor dem nächsten Durchlauf leeren. Drum das clear().</p>
<p>[code=&quot;volkard&quot;]Das Gerücht des lahmen vectors wiedermal? Ich muß wohl mal ein Bildchen malen, das zeigt, wie unheimlich wenig Resizen benötigt wird und wie unheimlich wenige Takte das braucht.[/quote]<br />
Naja, was heißt hier Gerücht? Fakt ist: Meine Anwendung hat, wenn ich die Methode Foo (sprich die Schleife) nicht aufrufe ziemlich konstant 1000 fps. Sobald ich Foo aufrufe, brechen die FPS auf 70 (!!) FSP ein.</p>
<p>Mir konnte nach wie vor keiner sagen, WAS denn jetzt eigentlich so extrem langsam ist in meinem Code. Fakt ist:<br />
Wenn ich alle push_back() auskommentiere, dann habe ich wieder meine 1000fps.<br />
Ich habe mal als Test ALLES in Foo auskommentiert und nur das reingeschrieben:</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt;IndexHeightPair&gt; &gt; queueTest;
queueTest.resize(64);
</code></pre>
<p>und alleine diese 2 Zeilen lassen die FPS von 1000 auf ca 100 sinken. Offenbar IST resize() also ein absoluter Performance-Killer, drum wollte ich das ganze resize() EINMAL im Ctor erledigen und dann nie wieder.</p>
<p>Im Moment habe ich jetzt folgenden Code: Ich habe die Datenstruktur als Member der Klasse gemacht:</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt;IndexHeightPair&gt; &gt; queues;
</code></pre>
<p>und reserviere im Ctor EINMAl Speicher:</p>
<pre><code class="language-cpp">queues.resize(mNumQueues);
</code></pre>
<p>Die Schleife sieht dann exakt so aus wie oben, nur das ich vor jedem Schleifendurchlauf noch alle Vektoren leere:</p>
<pre><code class="language-cpp">for(uint i=0; i &lt; queues.size(); i++)
   queues[i].clear();
</code></pre>
<p>Der Code ist jetzt schon schneller, aber noch immer recht lahm (von 1000fps runter auf 200).<br />
Ich würde noch immer gerne wissen:<br />
+ Was nun in meinem alten Code so extrem lahm war (und jetzt auch noch immer ist)<br />
+ ob ich das noch weiter verbessern kann bzgl Performance?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780605</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Thu, 17 Sep 2009 15:57:56 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 16:11:32 GMT]]></title><description><![CDATA[<p>es liegt zwar am resize, aber nicht am vector:</p>
<pre><code class="language-cpp">struct IndexHeightPair { 
   uint  row, col;    
   float height;        
};
</code></pre>
<p>sind also mindestes 12Byte(2x unit = 2x &gt;=4, 1xfloat = 1x4), die jedes mal wieder kopiert werden müssen - evtl solltest du lieber mit Pointern arbeiten!?<br />
imho liegt die grenze zwischen value/pointer(bzw. reference) bei einem DWORD(also 8 Byte auf nem 32bit System) - du kannst ja mal probieren, was rauskommt, wenn du mit pointern darauf arbeitest<br />
Voraussetzung ist natürlich, dass die Objekte irgendwo anders schon existieren und nicht erst auf dem heap konstruiert werden müssen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780609</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 17 Sep 2009 16:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 16:27:40 GMT]]></title><description><![CDATA[<p>mapper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::map&lt;int, std::vector&lt;IndexHeightPair&gt; &gt; queues;
</code></pre>
</blockquote>
<p>boost::tuple()? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780616</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Thu, 17 Sep 2009 16:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Alternative zu std::map on Thu, 17 Sep 2009 18:02:34 GMT]]></title><description><![CDATA[<p>Hallo mapper,</p>
<p>noch ein kleiner Tipp.<br />
Bei</p>
<pre><code class="language-cpp">pair = elements[i];
</code></pre>
<p>kopierst du auch noch mal die Daten.<br />
Benutze besser eine konstante Referenz darauf:</p>
<pre><code class="language-cpp">const IndexHeightPair &amp;pair = elements[i];
</code></pre>
<p>Der push_back wird nicht das Problem sein, sondern der map-Operator [], da dieser ja zuerst den leeren Vector auf dem Heap anlegen muß (mittels new).<br />
Teste mal:</p>
<pre><code class="language-cpp">queues[index - 1]; // .push_back( pair );
</code></pre>
<p>Sollte dann noch genauso 'langsam' sein...</p>
<p>Sofern du noch weiterhin Zugriff auf den Eingangsvector 'elements' hast (und sich dieser nicht ändert), so könntest du auch Indizes bzw. Referenzen auf die Werte benutzen (wie schon von anderen vorgeschlagen).</p>
<p>Und so richtig scheinst du die STL-Klassen noch nicht verstanden zu haben (ich beziehe mich dabei auf deine Wortwahl, z.B. &quot;... push_back() der map ...&quot;):<br />
die push_back-Funktion wird für den vector aufgerufen!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780668</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 17 Sep 2009 18:02:34 GMT</pubDate></item></channel></rss>