<?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[größtmögliche Effizienz &#x2F; vector? &#x2F; boost]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Programm tut folgendes:<br />
- Objekte in eine &quot;Liste&quot; stecken (hinten),<br />
- wieder rausholen (von vorne) und aus der &quot;liste&quot; löschen<br />
- löschen / reinstecken immer im Wechsel bzw am anfang mehr einfügen, am ende mehr löschen<br />
- alle 100 iterationen muss die &quot;Liste&quot; sortiert werden.<br />
- algorithmus terminiert wenn alle knoten gelöscht sind<br />
- insgesamt müssen ca. 400 - 1000 Objekte gleichzeitig gespeichert werden</p>
<p>Ich hoffe das ist verständlich.<br />
So nun meine Frage: Welche Struktur benutze ich am besten für meine &quot;Liste&quot;? Habe bisher einen vector von referenzen genommen.<br />
also:</p>
<pre><code class="language-cpp">vector&lt;obj &amp;&gt; liste
</code></pre>
<p>gibt es noch eine bessere Wahl? Vielleicht auch mit boost?<br />
Ist es sinnvoll von hinten reinzustecken und vorne zu löschen? oder sollte man das eher umdrehen?<br />
Mein Programm dauert noch zu lange.. habt ihr noch tipps worauf ich dabei noch achten kann? Gibt es geeignete Literatur?<br />
Bin über jeden Hinweis dankbar <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/258748/größtmögliche-effizienz-vector-boost</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 20:24:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258748.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Jan 2010 16:54:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Thu, 14 Jan 2010 16:56:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Programm tut folgendes:<br />
- Objekte in eine &quot;Liste&quot; stecken (hinten),<br />
- wieder rausholen (von vorne) und aus der &quot;liste&quot; löschen<br />
- löschen / reinstecken immer im Wechsel bzw am anfang mehr einfügen, am ende mehr löschen<br />
- alle 100 iterationen muss die &quot;Liste&quot; sortiert werden.<br />
- algorithmus terminiert wenn alle knoten gelöscht sind<br />
- insgesamt müssen ca. 400 - 1000 Objekte gleichzeitig gespeichert werden</p>
<p>Ich hoffe das ist verständlich.<br />
So nun meine Frage: Welche Struktur benutze ich am besten für meine &quot;Liste&quot;? Habe bisher einen vector von referenzen genommen.<br />
also:</p>
<pre><code class="language-cpp">vector&lt;obj &amp;&gt; liste
</code></pre>
<p>gibt es noch eine bessere Wahl? Vielleicht auch mit boost?<br />
Ist es sinnvoll von hinten reinzustecken und vorne zu löschen? oder sollte man das eher umdrehen?<br />
Mein Programm dauert noch zu lange.. habt ihr noch tipps worauf ich dabei noch achten kann? Gibt es geeignete Literatur?<br />
Bin über jeden Hinweis dankbar <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/1838932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838932</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Thu, 14 Jan 2010 16:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Thu, 14 Jan 2010 17:02:03 GMT]]></title><description><![CDATA[<p><a href="http://www.liamdevine.co.uk/code/images/container.png" rel="nofollow">http://www.liamdevine.co.uk/code/images/container.png</a><br />
sagt, dass du eine deque willst. Eventuell auch eine Art semi-dynamischer Ringpuffer (ist kein STL-Container, muss man selber machen, gibt's aber wahrscheinlich in boost).</p>
<blockquote>
<p>ist es sinnvoll von hinten reinzustecken und vorne zu löschen? oder sollte man das eher umdrehen?</p>
</blockquote>
<p>Da solltest du dich eher nach den anforderungen des Algorithmus richten, nicht nach dem Container.</p>
<pre><code class="language-cpp">Mein Programm dauert noch zu lange..
</code></pre>
<p>Falls es kurz ist: Zeig mal her. Falls es lang ist: Mach dich mal damit vertraut was ein Profiler ist und zeig dann die Funktion die am meisten Zeit braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1838937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838937</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Jan 2010 17:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 08:13:49 GMT]]></title><description><![CDATA[<p>Wundert mich, dass ein vector Referenzen akzeptiert.... aber egal. Du solltest mal einen Blick auf std::deque werfen, die bietet gutes Laufzeitverhalten für Einfügen/Löschen am Anfang/Ende und Random Access Iteratoren für die schnelle Sortierung (obowhl...std::list sortiert auch ziemlich fix, ich glaube per merge sort. Wenn du also keinen Zugriff auf die &quot;inneren&quot; Elemente brauchst und quasi einen FIFO benötigst ist std::list vielleicht doch die bessere Wahl).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839105</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 15 Jan 2010 08:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 13:40:21 GMT]]></title><description><![CDATA[<p>du hast recht, Referenzen dürften nicht akzeptiert werden, sondern pointer...<br />
eine list ist immer sortiert oder?<br />
bei mir darf die sortierung aber nur zu bestimmten situationen kommen..</p>
<p>Vielen Dank für die Übersicht und dem Tipp mit der deque, ich werde es mal vergleichen und euch berichten.</p>
<p>Ich kann den Code leider nicht öffentlich machen <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="😞"
    /> *gr*<br />
Welche Profiler benutzt ihr so? Ich habe mir mal vor einiger Zeit valgrind angeschaut, könnte das helfen? (ich programmiere unter linux)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839284</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Fri, 15 Jan 2010 13:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 13:55:48 GMT]]></title><description><![CDATA[<p>&quot;eine list ist immer sortiert?&quot;<br />
wäre mir neu... man kann sie jederzeit sortieren, ja - aber imho nicht gerade effektiv...</p>
<p>&quot;bei mir darf die sortierung aber nur zu bestimmten situationen kommen..&quot;<br />
hm?<br />
Es gibt doch ein std::sort und std::stable_sort und so gar std::heap_sort - da wird ja wohl einer passen, um bei Bedarf zu sortieren!?</p>
<p>Falls die Größe bekannt ist: boost::circular_buffer sollte dann ne tolle Wahl sein - wenn du boost nicht nutzen darfst, kannst du dir ja seblst nen Ringpuffer schreiben.<br />
Wenn dir das zu viel Arbeit ist oder die max. Größe nicht gegeben, oder abgeschätzt werden kann, ist wohl std::deque nicht die allerschlechteste Wahl...<br />
Evtl. lohnt sich auch ein nicht-linearer Container(set / map / hash_map / ...)</p>
<p>Mach am besten nen typedef auf deinen Container am Anfang des Codes und dann guck mal, wie sich die Laufzeit mit verschiedenen Containern ändert.</p>
<p>&quot;Ich kann den Code leider nicht öffentlich machen&quot;<br />
Dann gib uns doch wenigsten mal nen Stichwort, was du da mit dem Programm simulieren/... willst - dann findet sich bestimmt irgend jemand, der weiß, dass man da auch Algorithmus xyz nehmen könnte und nicht nur am Container Zeit einsparen könnte...</p>
<p>PS: Du compilierst aber im Release-Mode, ja?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839289</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 15 Jan 2010 13:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 14:57:16 GMT]]></title><description><![CDATA[<p>Listen sind unsortiert, bringen aber ihren eigenen sehr effizienten Sortieralgorithmus mit.</p>
<p>Der übliche Profiler unter Linux ist der eingebaute Profiler vom gcc (gprof).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839334</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 15 Jan 2010 14:57:16 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 15:29:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Listen sind unsortiert, bringen aber ihren eigenen sehr effizienten Sortieralgorithmus mit.</p>
</blockquote>
<p>Oh - da hatte ich mich wohl in der Komplexität geirrt - dachte, die wäre sehr viel höher gewesen, aber auf <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> steht(gerad kein standard hier) N*log N (Vergleich: std::sort idR N*log N aber im worst case so gar N*N).</p>
<p>Damit ist zumindest das entfernen und sortieren bei der liste am schnellsten - wäre noch zu klären, wie das beim hinzufügen ist (hier könnte aber ein eigener allokator sinnvoll sein, damit man nicht mehr für jedes hinzufügen ein new hat)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839366</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 15 Jan 2010 15:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 16:00:21 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Mach am besten nen typedef auf deinen Container am Anfang des Codes und dann guck mal, wie sich die Laufzeit mit verschiedenen Containern ändert.</p>
<p>PS: Du compilierst aber im Release-Mode, ja?</p>
</blockquote>
<p>kannst du mir ein kurzes Bsp geben für typedef?</p>
<p>hmm release mode habe ich nur mal bei eclipse gehört... ich benutze kdevelop 4.<br />
ich habe -02 eingeschaltet, kann ich sonst noch was tunen?</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>(hier könnte aber ein eigener allokator sinnvoll sein, damit man nicht mehr für jedes hinzufügen ein new hat)</p>
</blockquote>
<p>kannst du mir das auch nochmal erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Mir scheint es gibt noch viele Möglichkeiten..</p>
<p>Zum Algorithmus.. ist ist eine Art A*-Algorithmus..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839387</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Fri, 15 Jan 2010 16:00:21 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 16:09:51 GMT]]></title><description><![CDATA[<p><code>typedef</code> :</p>
<pre><code class="language-cpp">typedef std::vector&lt;std::vector&gt; &gt; vector2d;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1839398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839398</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 15 Jan 2010 16:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Fri, 15 Jan 2010 19:20:12 GMT]]></title><description><![CDATA[<p>bsp.:</p>
<pre><code class="language-cpp">#include &lt;deque&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

struct foo{};

typedef std::list&lt;foo&gt; foo_container;
//typedef std::deque&lt;foo&gt; foo_container;
//typedef std::vector&lt;foo&gt; foo_container;

int main()
{
  //mach was mit foo_container
}
</code></pre>
<p>Nur beim sort musst du halt unterscheiden, ob es eine Liste ist oder nicht(das sollte anhand von <code>typename iterator_traits&lt;foo_container::iterator&gt;::category</code> gehen - oder mittels einer extra Überladung für deine sort-Funktion für die Liste:</p>
<pre><code class="language-cpp">template&lt;typename CONTAINER, typename COMPARER&gt;
void sort(CONTAINER&amp; me, const COMPARER&amp; cmp = std::less&lt;typename CONTAINER::value_type&gt;())
{
  std::sort(me.begin(), me.end(), cmp);
}

template&lt;typename VALUE_TYPE, typename ALLOCATOR, typename COMPARER&gt;
void sort(std::list&lt;VALUE_TYPE, ALLOCATOR&gt;&amp; me, const COMPARER&amp; cmp = std::less&lt;VALUE_TYPE&gt;())
{
  me.sort(cmp);
}

/* 1
typedef std::list&lt;foo&gt; foo_container;
*/

/* 2
typedef std::deque&lt;foo&gt; foo_container;
*/

/* 3
typedef std::vector&lt;foo&gt; foo_container;
*/

int main()
{
  foo_container x;

//  x.push_back(foo());

  sort(x);
}
</code></pre>
<p>Vll sollte man die sort-Funktion in dem Fall auch inplace_sort nennen, weil man nicht erwartet, dass auf es das Argument verändert, aber da hab ich jz keine lust, das noch zu ändern^^<br />
Aber so in etwa sollte das funktionieren...</p>
<p>Man muss eben nur noch das typedef ändern und den Rest kann man halt so lassen - unheimlich praktisch, um immermal zu testen, welcher Container optimale Ergebnisse liefert...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839399</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 15 Jan 2010 19:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Sun, 17 Jan 2010 20:25:13 GMT]]></title><description><![CDATA[<p>Das Object das ich speichere speichere besteht aus ca. 5 verschiedenen Werten und einem Array.</p>
<p>Ich habe das jetzt mit einem struct gelöst, bringt das Vorteile gegenüber einer eigenen Klasse? Bei ca. 50.000 Objekten, kann das einen Unterschied machen?</p>
<p>Habe momentan folgendes: (wenn ein ptr eines Obj der liste/enqueue/vector hinzugefügt wird)</p>
<pre><code class="language-cpp">struct foo{ // 5 Werte + Array
};
foo* ptrFoo = NULL;

// hinzufügen
foo tmp = {bla blub};
ptrFoo = &amp;tmp;
foo_container.push_back(prtFoo);
</code></pre>
<p>Gehts noch besser/schlauer?</p>
<p>Thanks!!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840431</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Sun, 17 Jan 2010 20:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Sun, 17 Jan 2010 20:52:27 GMT]]></title><description><![CDATA[<p>noch eine zusätzliche Frage:<br />
wenn ich ptrFoo lösche, muss ich dann auch das struct löschen bzw. wie kann ich das machen?</p>
<p>Bei einer klasse geht es ja mit</p>
<pre><code class="language-cpp">delete *ptrFoo
</code></pre>
<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840443</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Sun, 17 Jan 2010 20:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Sun, 17 Jan 2010 21:43:59 GMT]]></title><description><![CDATA[<p>struct = class - macht also keinen unterschied</p>
<p>das hinzufügen an sich ist schon doof, weil es definitiv was anderes macht, als du denkst...</p>
<p>mach es doch einfach erst mal so, wie man es normalerweise machen würde... danach kannst du es noch immer kaputt-optimieren...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840470</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 17 Jan 2010 21:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Sun, 17 Jan 2010 21:59:32 GMT]]></title><description><![CDATA[<p>Oh was meinst du jetzt..?<br />
So wird es nicht funktionieren?<br />
Ich dachte so kann ich meine Objekte als Pointer speichern... wie denn dann?<br />
Hatte sie vorher als Kopie, wollte das jetzt ändern - bzw bin gerade dabei.<br />
Muss ich sie als Kopien lassen?</p>
<pre><code class="language-cpp">struct foo{ // 5 Werte + Array
};
foo* ptrFoo = NULL;

// hinzufügen
foo tmp = {bla blub};
ptrFoo = &amp;tmp;
foo_container.push_back(prtFoo);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1840478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840478</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Sun, 17 Jan 2010 21:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 00:02:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct foo
{
 /*...*/
};

int main()
{
  foo to_add;
  foo_container.push_back(&amp;to_add);

  ;
}
</code></pre>
<p>so würde das aussehen - aber da musst du halt vor allem gucken, dass du to_add nicht vorher irgendwie zerstörst...</p>
<p>bsp., wie man es _nciht_ macht:</p>
<pre><code class="language-cpp">void add(Tfoo_container &amp;foo_container)
{
  foo to_add;
  foo_container.push_back(&amp;to_add);
}

int main()
{
  Tfoo_container foo_container;
  add(foo_container);
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840535</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 18 Jan 2010 00:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 10:59:19 GMT]]></title><description><![CDATA[<p>Überleg dir mal, wie lange das Objekt lebt, dessen Adresse du speicherst. Und was passiert beim Zugriff auf diese Adresse, wenn das Objekt nicht mehr existiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840662</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 18 Jan 2010 10:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 13:00:06 GMT]]></title><description><![CDATA[<p>Ja das verstehe ich, dass in dem Beispiel das Objekt nicht mehr existiert, ich glaube das dürfte bei mir auch nicht passieren...</p>
<p>Ich habe gerade mal vector und deque gegeneinander getestet, der Unterschied ist ziemlich groß!!!! Vielen vielen Dank für den Tipp <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="🙂"
    /> Ich probiere später nochmal std::list.</p>
<p>Aber wenn ich nur Zeiger anstatt Objekte speichere müßte das auch nochmal sehr viel ausmachen oder was denkt ihr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840714</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Mon, 18 Jan 2010 13:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 18:44:20 GMT]]></title><description><![CDATA[<p>windschief schrieb:</p>
<blockquote>
<p>Aber wenn ich nur Zeiger anstatt Objekte speichere müßte das auch nochmal sehr viel ausmachen oder was denkt ihr?</p>
</blockquote>
<p>Was ausmachen? Was erhoffst du dir davon?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840936</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 18 Jan 2010 18:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 19:03:01 GMT]]></title><description><![CDATA[<p>windschief schrieb:</p>
<blockquote>
<p>Ja das verstehe ich, dass in dem Beispiel das Objekt nicht mehr existiert, ich glaube das dürfte bei mir auch nicht passieren...</p>
<p>Ich habe gerade mal vector und deque gegeneinander getestet, der Unterschied ist ziemlich groß!!!! Vielen vielen Dank für den Tipp <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="🙂"
    /> Ich probiere später nochmal std::list.</p>
<p>Aber wenn ich nur Zeiger anstatt Objekte speichere müßte das auch nochmal sehr viel ausmachen oder was denkt ihr?</p>
</blockquote>
<p>Kommt drauf an. Wenn du die Zeiger jedesmal mit <code>new</code> erstellst und mit <code>delete</code> loescht, dann: ja, wird viel ausmachen, wird naemlich <strong>viel langsamer</strong> sein. Wenn du die Pointer vorher schon alle hast und erst am Ende loescht: ja, wird vermutlich schneller sein, als dauerndes hin/her kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840950</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Mon, 18 Jan 2010 19:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 21:37:09 GMT]]></title><description><![CDATA[<p>hmm, ich glaube ich habe nicht ganz verstanden was du meinst..</p>
<p>ich habe folgendes:<br />
ich erstelle ein objekt, das muss in eine &quot;liste&quot; hinten dran gespeichert werden (momentan deque), dann nehme ich ein neues objekt aus der &quot;liste&quot; von vorne (und lösche es aus der liste) verändere es und stecke es vielleicht wieder rein, bzw vielleicht auch mehrere veränderungen von dem objekt oder es wird ganz verworfen.</p>
<p>Jetzt ist meine Frage, ob es schneller gehen würde von der performance, wenn ich statt dem objekt selbst nur den pointer auf das objekt speichere.. das objekt muss ich ja so oder so erstellen.</p>
<p>Ich hoffe man kann ungefähr verstehen was der algo macht, wie gesagt, eine art A*..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841019</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Mon, 18 Jan 2010 21:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 22:09:25 GMT]]></title><description><![CDATA[<p>Das kommt wohl auf das Objekt an. Ist es eher klein, lohnen sich Zeiger wahrscheinlich nicht. Wenn du hingegen viel Kopieraufwand sparen kannst, wäre der Ansatz schon eine Überlegung wert. Jedoch müsstest du selbst Speicher verwalten, und das kann (abgesehen von der Mühseligkeit) z.B. bei <code>std::deque</code> wie erwähnt auch langsamer sein. Ich würde am besten weiterhin <code>std::deque</code> oder <code>std::list</code> benutzen, es sei denn, du hast wirklich ein Performance-Problem. In diesem Fall misst du am besten die Zeit in beiden Fällen. Aber nur aufgrund vager Vermutungen würde ich mir keine zusätzliche Mühe machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841033</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 18 Jan 2010 22:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 22:50:52 GMT]]></title><description><![CDATA[<p>wie schon gesagt, mein objekt (struct) besteht aus 5 elementen und einem array/vector. Ist das eher klein?</p>
<p>Mein du mit Speicher selbst verwalten new and delete?</p>
<p>Hierzu habe ich noch meine Frage:</p>
<p>wie kann ich wenn ich den pointer habe das struct dahinter löschen?<br />
bsp:</p>
<pre><code class="language-cpp">struct foo
{
 /*...*/
};

int main()
{
  foo to_add;
  foo_container.push_back(&amp;to_add);
  foo* ptr = foo_container[0];
  foo_container.pop_front();
  delete *ptr; // so? funktioniert das auch bei einem struct?
  ..;
}
</code></pre>
<p>Die Performance ist wie gesagt alles, muss schneller als anderes Programm (anderer algo) sein und muss noch ein bisschen was rausholen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841062</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Mon, 18 Jan 2010 22:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 23:07:38 GMT]]></title><description><![CDATA[<p>Bevor du dich an solche Optimierungen machst, solltest du vielleicht schon die Grundkonzepte der Sprache verstehen. Manuelle Speicherverwaltung und Zeiger gehören definitiv dazu. Hast du kein C++-Buch, in dem diese Dinge erklärt werden?</p>
<p>Könnte der Compiler deinen Code kompilieren, dann würdest du undefiniertes Verhalten hervorrufen, weil du <code>delete</code> auf ein Objekt anwendest, das nicht mit <code>new</code> angefordert wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841068</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 18 Jan 2010 23:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 23:08:01 GMT]]></title><description><![CDATA[<p>Was verstehst du unter löschen? - delete braucht man um dynamischen Speicher wieder frei zu geben. Mir schwebt was vor, dass du aber ganz was anderes willst. Wenn du das Element aus dem Container entfernst, dann wird das schon beseitigt. Keine Angst.</p>
<p>Und alleine aufrgrund von Code performance auslesen zu wollen ist völliger schwachsinn. Das ist in 99% der Fälle nutzlos. Benutz einen Profiler, wenn dei Programm fertig ist und dann bessere da nach, wo Engpässe sind. Das ist die korrekte Mehtode Code zu optimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841070</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 18 Jan 2010 23:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 23:31:16 GMT]]></title><description><![CDATA[<blockquote>
<p>Könnte der Compiler deinen Code kompilieren, dann würdest du undefiniertes Verhalten hervorrufen, weil du delete auf ein Objekt anwendest, das nicht mit new angefordert wurde.</p>
</blockquote>
<p>Genau das war ja meine Frage: Das struct wurde nicht mit new erstellt... wie lösche ich es nun.. ich habe in meiner liste nur die adressen, wenn ich jetzt nur den ersten knoten aus der liste lösche, lösche ich doch nur die adresse... wir kann ich das struct dahinter löschen? Od geht das automatisch?</p>
<blockquote>
<p>Und alleine aufrgrund von Code performance auslesen zu wollen ist völliger schwachsinn. Das ist in 99% der Fälle nutzlos. Benutz einen Profiler, wenn dei Programm fertig ist und dann bessere da nach, wo Engpässe sind. Das ist die korrekte Mehtode Code zu optimieren.</p>
</blockquote>
<p>Ich verstehe was du meinst. Nur mein Programm ist fertig und ich habe um Hilfe für Verbesserung gefragt, eine deque anstatt vector zu benutzen war schonmal sehr sehr nützlich.<br />
Die Engstelle liegt darin das ich z.b. bis zu 40.000 Objekte speichern muss. Meine Frage ist nun wie ich die Operationen speichern, löschen, sortieren am effiziesten einsetzen kann.<br />
Deshalb meine Frage auch am Anfang: lieber vorne oder hinten einfügen bzw löschen...</p>
<p>Ich benutze ja gerne einen Profiler, nur leider habe ich nicht verschiedene Methoden die aufgerufen werden, sondern eher eine große schleife mit vielen vielen Objekten..<br />
Ich hoffe mein Problem ist ein wenig klarer geworden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841077</guid><dc:creator><![CDATA[windschief]]></dc:creator><pubDate>Mon, 18 Jan 2010 23:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to größtmögliche Effizienz &#x2F; vector? &#x2F; boost on Mon, 18 Jan 2010 23:39:20 GMT]]></title><description><![CDATA[<p>windschief schrieb:</p>
<blockquote>
<blockquote>
<p>Könnte der Compiler deinen Code kompilieren, dann würdest du undefiniertes Verhalten hervorrufen, weil du delete auf ein Objekt anwendest, das nicht mit new angefordert wurde.</p>
</blockquote>
<p>Genau das war ja meine Frage: Das struct wurde nicht mit new erstellt... wie lösche ich es nun.. ich habe in meiner liste nur die adressen, wenn ich jetzt nur den ersten knoten aus der liste lösche, lösche ich doch nur die adresse... wir kann ich das struct dahinter löschen? Od geht das automatisch?</p>
</blockquote>
<p>Wenn du foo in deinem Container speicherst, dann sind da auch foo Objekte drin. Nicht nur dessen Adressen. (intern wird da wahrscheinlich dynamisch Speicher angefordert und verwaltet, aber die Struktur hält prinzipiell nicht nur Zeiger). Und wenn du automatische Objekte speicherst, dann sind die nach dem entfernen auch wieder weg. (von Optimierungen mal abgesehen, dass der Container nicht wirklich Speicher zurückgibt, aber dein Objekt ist sicher korrekt zerstört). Anderst ist es, wenn du selbst Zeiger drin speicherst. Die werden natürlich nicht mit delete freigegeben, da du ja z.B auch ganzu normale Zeiger drin haben könntest.</p>
<blockquote>
<blockquote>
<p>Und alleine aufrgrund von Code performance auslesen zu wollen ist völliger schwachsinn. Das ist in 99% der Fälle nutzlos. Benutz einen Profiler, wenn dei Programm fertig ist und dann bessere da nach, wo Engpässe sind. Das ist die korrekte Mehtode Code zu optimieren.</p>
</blockquote>
<p>Ich verstehe was du meinst. Nur mein Programm ist fertig und ich habe um Hilfe für Verbesserung gefragt, eine deque anstatt vector zu benutzen war schonmal sehr sehr nützlich.<br />
Die Engstelle liegt darin das ich z.b. bis zu 40.000 Objekte speichern muss. Meine Frage ist nun wie ich die Operationen speichern, löschen, sortieren am effiziesten einsetzen kann.<br />
Deshalb meine Frage auch am Anfang: lieber vorne oder hinten einfügen bzw löschen...</p>
<p>Ich benutze ja gerne einen Profiler, nur leider habe ich nicht verschiedene Methoden die aufgerufen werden, sondern eher eine große schleife mit vielen vielen Objekten..<br />
Ich hoffe mein Problem ist ein wenig klarer geworden.</p>
</blockquote>
<p>40'000 klingt nicht nach sehr viel. Hast du sicher mal im Release Mode gebuildet? - Das bringt dir enorm viel. 40'000 Objekte sind üblicherweise kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841082</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 18 Jan 2010 23:39:20 GMT</pubDate></item></channel></rss>