<?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[Frage zur Verbesserung der Performance von bestimmtem Algorithmus]]></title><description><![CDATA[<p>Hallo, ich habe folgendes Problem:<br />
Ich lese Daten aus einer Database aus. Diese Daten werden dann in Objekte einer Klasse eingelesen und in einem std::vector gespeichert. Eine Eigenschaft der Klasse ist eine id. Nun darf in dem vector jede id nur einmal vorkommen. Das klingt jetzt sehr nach dem Aufgabenfeld für std::set oder std::map, <strong>allerdings ist die Vorgabe, dass std::vector benutzt werden soll</strong>. Hier ein Minimalbeispiel:</p>
<pre><code class="language-cpp">class Klasse
{
    std::string id;
    //...
};

std::vector&lt;KLASSE&gt; vec;

int main()
{
    vec.reserve(20000);
    std::ifstream lesen(&quot;Database&quot;);
    while(!lesen.eof())
    {
        Klasse objekt;
        lesen&gt;&gt;objekt;
        for(size_t a(0), b(vec.size()); a!=b; ++a)
        {
            if(objekt.id == vec[a].id)
                break;
        }
    }
}
</code></pre>
<p>Die Laufzeit deses Algorithmus steigt natürlich mit zunehmender Database größe exponentiell. In meinem Fall hat die Database ca. 15.000 Einträge und der Einlesevorgang benötigt ca. 5 Sekunden.<br />
Hat jemand eine Idee, wie man das einlesen performanter gestalten könnte? Ich hatte schon die Idee, den vector nach jedem neu eingelesenem Objekt zu sortieren, um bei der suche nach objekten den Suchbereich eingrenzen zu können. Was haltet ihr davon? Der Code ist relativ komplex, daher habe ich diese Änderung noch nicht probiert. Was haltet ihr davon? Gibt es andere Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245091/frage-zur-verbesserung-der-performance-von-bestimmtem-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 22:44:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245091.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Jul 2009 16:55:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 16:55:49 GMT]]></title><description><![CDATA[<p>Hallo, ich habe folgendes Problem:<br />
Ich lese Daten aus einer Database aus. Diese Daten werden dann in Objekte einer Klasse eingelesen und in einem std::vector gespeichert. Eine Eigenschaft der Klasse ist eine id. Nun darf in dem vector jede id nur einmal vorkommen. Das klingt jetzt sehr nach dem Aufgabenfeld für std::set oder std::map, <strong>allerdings ist die Vorgabe, dass std::vector benutzt werden soll</strong>. Hier ein Minimalbeispiel:</p>
<pre><code class="language-cpp">class Klasse
{
    std::string id;
    //...
};

std::vector&lt;KLASSE&gt; vec;

int main()
{
    vec.reserve(20000);
    std::ifstream lesen(&quot;Database&quot;);
    while(!lesen.eof())
    {
        Klasse objekt;
        lesen&gt;&gt;objekt;
        for(size_t a(0), b(vec.size()); a!=b; ++a)
        {
            if(objekt.id == vec[a].id)
                break;
        }
    }
}
</code></pre>
<p>Die Laufzeit deses Algorithmus steigt natürlich mit zunehmender Database größe exponentiell. In meinem Fall hat die Database ca. 15.000 Einträge und der Einlesevorgang benötigt ca. 5 Sekunden.<br />
Hat jemand eine Idee, wie man das einlesen performanter gestalten könnte? Ich hatte schon die Idee, den vector nach jedem neu eingelesenem Objekt zu sortieren, um bei der suche nach objekten den Suchbereich eingrenzen zu können. Was haltet ihr davon? Der Code ist relativ komplex, daher habe ich diese Änderung noch nicht probiert. Was haltet ihr davon? Gibt es andere Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739916</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 16:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 16:59:48 GMT]]></title><description><![CDATA[<p><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/1739920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739920</guid><dc:creator><![CDATA[hah]]></dc:creator><pubDate>Thu, 09 Jul 2009 16:59:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 17:02:56 GMT]]></title><description><![CDATA[<p>*edit:<br />
Natürlich fehlt das &quot;vec.push_back(objekt);&quot; nach der inneren for-schleife</p>
<p>@ hah: komischer Vorschlag Oo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739924</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 17:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 17:25:50 GMT]]></title><description><![CDATA[<p>1. Deine Schleife funktioniert nicht richtig. Das <code>eofbit</code> Flag wird erst gesetzt, wenn über das Ende hinaus gelesen wurde. Du wirst dadurch einen Eintrag zu viel lesen, bzw. wahrscheinlich einfach doppelt eintragen. Frag nach dem Einlesen ab, ob das Einlesen korrekt verlaufen ist, bzw. ob der Stream noch gültig ist. Nutze dazu den Rückgabewert von <code>operator &gt;&gt;</code> aus <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="😉"
    /><br />
2. Ich würde alle Einträg einfach einlesen. Danach mit<a href="http://www.cplusplus.com/reference/algorithm/sort/" rel="nofollow"> <code>std::sort</code> </a>Soriteren und am Ende mit<a href="http://www.cplusplus.com/reference/algorithm/unique/" rel="nofollow"> <code>std::unique</code> </a>doppelte Einträge rauslöschen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739947</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 09 Jul 2009 17:25:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 17:33:22 GMT]]></title><description><![CDATA[<p>Ok, Dravere's Problemlösung ist gut, allerdings in meinem Fall nicht anwendbar. Dazu muss ich etwas ausholen:<br />
Die Klasse hat neben id weitere Eigenschaften. Unter andem eine... nenn wir sie version. Wenn ein eingelesenes Objekt eine id besitzt, die es schon im Vector gibt, dann wird die version der schon vorhandenen id hinzugefügt:</p>
<pre><code class="language-cpp">class Klasse
{
    std::string id;
    std::vector&lt;int&gt; version;
    //...
};

std::vector&lt;Klasse&gt; vec;

int main()
{
    vec.reserve(20000);
    std::ifstream lesen(&quot;Database&quot;);
    bool gefunden = false;
    while(!lesen.eof())
    {
        Klasse objekt;
        lesen&gt;&gt;objekt;
        for(size_t a(0), b(vec.size()); a!=b; ++a)
        {
            if(objekt.id == vec[a].id)
            {
                vec[a].version.push_back(objekt.version[0]);
                gefunden=true;
                break;
            }
        }
        if(gefunden)
        {
            gefunden=false;
            continue;
        }
        vec.push_back(objekt);
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1739952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739952</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 17:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 17:51:19 GMT]]></title><description><![CDATA[<p>Muss die Klasse so sein wie sie ist mit dem Version-vector? Was du da fabrizierst ist nämlich reichlich umständlich und sieht ein wenig nach suboptimalem Design aus. Was genau ist denn die Aufgabenstellung/was genau willst du erreichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739960</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 09 Jul 2009 17:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 18:10:42 GMT]]></title><description><![CDATA[<p>Abgesehen von dem was pumuckl gesagt hat, könntest du deinen eigenen <code>unique</code> Algorithmus einbauen. Es gibt sogar bereits andere Algorithmen, welche dir dabei behilflich sein könnten. Zum Beispiel:<br />
<a href="http://www.cplusplus.com/reference/algorithm/adjacent_find/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/adjacent_find/</a></p>
<p>So kompliziert ist der Algorithmus ja wirklich nicht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739974</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 09 Jul 2009 18:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 18:13:23 GMT]]></title><description><![CDATA[<p>[Edit] Was übersehen...</p>
<p>Genauso wie es Draveres Vorschlag tut. Lies alle Werte ein, sortier und füll dann erst den Versionsvektor auf mit den doppelten Elementen, die folgen. Zum Schluss die doppelten Objekte entfernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739975</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 09 Jul 2009 18:13:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 18:20:00 GMT]]></title><description><![CDATA[<p>Die idee mit adjacent_find und dann die doppelten Elemente über unique löschen find ich gut! Werd die gleich mal implementieren!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739986</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 18:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 19:49:57 GMT]]></title><description><![CDATA[<p>adjacent_find hat sich als nicht so gut herausgestellt, da von einer id durchaus mehr als 2 vorkommen können. Ich habe jetzt versucht das selbst zu implementieren. Allerdings habe ich am ende statt ca. 15000 Objekten nur ca. 5000 im vector. Sieht jemand den Denkfehler?</p>
<pre><code class="language-cpp">class Klasse
{
    std::string id;
    std::vectir&lt;int&gt; version;
    //...
}

inline bool sort_all ( const Klasse&amp; a, const Klasse&amp; b){ return (a.id &lt; b.id); }
inline bool operator==(const Klasse&amp; a, const Klasse&amp; b){ return (a.id == b.id); }

std::vector&lt;Klasse&gt; vec;

int main()
{
    vec.reserve(20000);
    while(!lesen.eof())
    {
        Klasse objekt;          //
        lesen&gt;&gt;objekt;          // alle einlesen
        vec.push_back(objekt);  //
    }
    lesen.close()

    std::vector&lt;Klasse&gt;::iterator it=vec.begin(), end=vec.end(), at, unique_it;

    sort(it, et, sort_all); //vec sortieren

    at = it;
    ++it;

    while(at != end)
    {
        if(*it == *at)
        { 
            (*it).version.push_back( (*at).version[0] );
            ++at;
            continue;
        }
        it = at;
        ++at;
    }

    unique_it = unique(vec.begin(), end);
    vec.resize(end-unique_it);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1740029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740029</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 19:49:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 19:51:16 GMT]]></title><description><![CDATA[<p>*edit: ++it in Zeile 29 sollte ++at heißen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740030</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 19:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 20:03:49 GMT]]></title><description><![CDATA[<p>Was hast du denn gegen adjacent_find()=</p>
<pre><code class="language-cpp">typedef vector&lt;Klasse&gt;::iterator Iter;

Iter pos1 = vec.begin();
Iter pos2;

while((pos1 = adjacent_find(pos1, vec.end())) != vec.end())
{
	pos2 = pos1 + 1;
	while(*pos2 == *pos1)
	{
		pos1-&gt;version.push_back(pos2-&gt;version[0]);
		++pos2;
		if(pos2 == vec.end())
			return;	// aus beiden Schleifen raus
	}
	pos1 = pos2 + 1;
}
</code></pre>
<p>Wie immer ungetestet.</p>
<p>[Edit] OK, hier kann man sich adjacent_find() wirklich sparen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1740031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740031</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 09 Jul 2009 20:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 20:11:10 GMT]]></title><description><![CDATA[<p>Offensichtlich hast du meinen &quot;falschen&quot; Code 1:1 mit adjacent_find umgesetzt <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="😃"
    /> Mit deinem und meinem Ansatz bekomme ich genau 5697 Elemente in den vector, obwohl am ende ca. 15000 drin sein sollten <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/1740033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740033</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 20:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Verbesserung der Performance von bestimmtem Algorithmus on Thu, 09 Jul 2009 20:34:38 GMT]]></title><description><![CDATA[<p>Michael E.'s code funktioniert wunderbar. Hatte mich mit unique() vertan. Jetzt geht das einlesen in unter einer sekunde. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740042</guid><dc:creator><![CDATA[PerformanceProblem]]></dc:creator><pubDate>Thu, 09 Jul 2009 20:34:38 GMT</pubDate></item></channel></rss>