<?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[Welcher STL Container?]]></title><description><![CDATA[<p>Hallo,<br />
ich schreibe gerade ein Programm, das Daten aus einer Database ausliest. Dazu habe ich eine Klasse erstellt, deren Objekte die Daten der Database repräsentieren, und den &gt;&gt; Operator zum einlesen überladen.</p>
<pre><code class="language-cpp">//Ausschnitt aus der Klasse
class Information
{
   public:
    std::string name;
    std::multmimap&lt;int, int&gt; Eigenschaft2;
};
</code></pre>
<p>Nehmen wir an, die Daten in der Database hätten folgende Aufteilung: Ein name, einen int-Wert für das Jahr und einen int-wert für den Monat, in dem sie eingetgragen wurden. Da die beiden int-werte ein Paar bilden und zusammen gehören, habe ich sie in eine multimap gesteckt.<br />
Eingelesen werden die Daten in einen std::vector&lt;Information&gt; vec;</p>
<p>Dabei ergibt sich das eigentliche Problem:<br />
Jedes objekt soll nur einmal im vector vorkommen. Daher würde sich ja eigentlich eine std::map anbieten (zB std::map&lt;name, Eigenschaft2&gt;). Allerdings brauche ich sehr oft random acces (also Elemente über rand() zugreifen), weshalb eine std::map nicht (performant) funktioniert. Mein aktueller Algorithmus beim Einlesen der Daten sieht so aus:</p>
<pre><code class="language-cpp">std::ifstream lesen(name, std::ios::in);
bool gefunden(false);
while(!lesen.eof())
{
    Information info;
    lesen&gt;&gt;info;
    for(size_t h(0);h!=vec.size();++h)
    {
        if(karte.name == vec[h].name)
        {
            std::multimap&lt;std::string, char&gt;::const_iterator it = info.Eigenschaft2.begin();
            vec[h].Eigenschaft2.insert(make_pair( (*it).first, (*it).second) );
            gefunden=true;
            break;
        }
    }
    if(gefunden)
    {
        gefunden=false;
        continue;
    }
    vec.push_back(info);
}
</code></pre>
<p>Dabei kann man sich leicht vorstellen, dass dieser Teil exponentiell viel Zeit verschlingt, da nach jeder neuen Info der komplette vector durchsucht werden muss und bei jeder neuen Info wächst.</p>
<pre><code class="language-cpp">for(size_t h(0);h!=vec.size();++h)
{
    if(karte.name == vec[h].name)
    {
        //...
    } 
}
vec.push_back(info);
</code></pre>
<p>Hat jemand eine alternative Idee, Daten in einen Container einzulesen, der permormant random access unterstützt, wobei jedes element nur einmal vorkommt?<br />
Schonmal Danke für Anregungen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243228/welcher-stl-container</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:48:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243228.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Jun 2009 12:41:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welcher STL Container? on Sun, 14 Jun 2009 12:41:45 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich schreibe gerade ein Programm, das Daten aus einer Database ausliest. Dazu habe ich eine Klasse erstellt, deren Objekte die Daten der Database repräsentieren, und den &gt;&gt; Operator zum einlesen überladen.</p>
<pre><code class="language-cpp">//Ausschnitt aus der Klasse
class Information
{
   public:
    std::string name;
    std::multmimap&lt;int, int&gt; Eigenschaft2;
};
</code></pre>
<p>Nehmen wir an, die Daten in der Database hätten folgende Aufteilung: Ein name, einen int-Wert für das Jahr und einen int-wert für den Monat, in dem sie eingetgragen wurden. Da die beiden int-werte ein Paar bilden und zusammen gehören, habe ich sie in eine multimap gesteckt.<br />
Eingelesen werden die Daten in einen std::vector&lt;Information&gt; vec;</p>
<p>Dabei ergibt sich das eigentliche Problem:<br />
Jedes objekt soll nur einmal im vector vorkommen. Daher würde sich ja eigentlich eine std::map anbieten (zB std::map&lt;name, Eigenschaft2&gt;). Allerdings brauche ich sehr oft random acces (also Elemente über rand() zugreifen), weshalb eine std::map nicht (performant) funktioniert. Mein aktueller Algorithmus beim Einlesen der Daten sieht so aus:</p>
<pre><code class="language-cpp">std::ifstream lesen(name, std::ios::in);
bool gefunden(false);
while(!lesen.eof())
{
    Information info;
    lesen&gt;&gt;info;
    for(size_t h(0);h!=vec.size();++h)
    {
        if(karte.name == vec[h].name)
        {
            std::multimap&lt;std::string, char&gt;::const_iterator it = info.Eigenschaft2.begin();
            vec[h].Eigenschaft2.insert(make_pair( (*it).first, (*it).second) );
            gefunden=true;
            break;
        }
    }
    if(gefunden)
    {
        gefunden=false;
        continue;
    }
    vec.push_back(info);
}
</code></pre>
<p>Dabei kann man sich leicht vorstellen, dass dieser Teil exponentiell viel Zeit verschlingt, da nach jeder neuen Info der komplette vector durchsucht werden muss und bei jeder neuen Info wächst.</p>
<pre><code class="language-cpp">for(size_t h(0);h!=vec.size();++h)
{
    if(karte.name == vec[h].name)
    {
        //...
    } 
}
vec.push_back(info);
</code></pre>
<p>Hat jemand eine alternative Idee, Daten in einen Container einzulesen, der permormant random access unterstützt, wobei jedes element nur einmal vorkommt?<br />
Schonmal Danke für Anregungen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726358</guid><dc:creator><![CDATA[STLFan]]></dc:creator><pubDate>Sun, 14 Jun 2009 12:41:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container? on Sun, 14 Jun 2009 12:51:30 GMT]]></title><description><![CDATA[<p>STLFan schrieb:</p>
<blockquote>
<p>Allerdings brauche ich sehr oft random acces (also Elemente über rand() zugreifen), weshalb eine std::map nicht (performant) funktioniert.</p>
</blockquote>
<p>Was soll random zugriff bedeuten? Du kannst auch mehrere maps haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726360</guid><dc:creator><![CDATA[BattleForTheSun]]></dc:creator><pubDate>Sun, 14 Jun 2009 12:51:30 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container? on Sun, 14 Jun 2009 12:56:53 GMT]]></title><description><![CDATA[<p>Hash-Map hat einen wunderbar O(1) RA-Zugriff.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726362</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 14 Jun 2009 12:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container? on Sun, 14 Jun 2009 13:02:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Was soll random zugriff bedeuten?</p>
</blockquote>
<p>Das bedeutet, das ich aus dem vector, der sämtliche Elemente enthält, zufällig Elemente aussuche und in einen neuen vector packe, zB:</p>
<pre><code class="language-cpp">std::vector&lt;Information) neuer_vector;
neuer_vector.push_back( rand() % vec.size() );
</code></pre>
<p>Und solche Aktionen werden recht häufig durchgeführt</p>
<blockquote>
<p>Hash-Map hat einen wunderbar O(1) RA-Zugriff.</p>
</blockquote>
<p>Was ist eine Hash-map? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1726368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726368</guid><dc:creator><![CDATA[STLFAN]]></dc:creator><pubDate>Sun, 14 Jun 2009 13:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Welcher STL Container? on Sun, 14 Jun 2009 13:32:15 GMT]]></title><description><![CDATA[<p>STLFAN schrieb:</p>
<blockquote>
<blockquote>
<p>Was soll random zugriff bedeuten?</p>
</blockquote>
<p>Das bedeutet, das ich aus dem vector, der sämtliche Elemente enthält, zufällig Elemente aussuche und in einen neuen vector packe, zB:</p>
<pre><code class="language-cpp">std::vector&lt;Information) neuer_vector;
neuer_vector.push_back( rand() % vec.size() );
</code></pre>
<p>Und solche Aktionen werden recht häufig durchgeführt</p>
</blockquote>
<p>Was soll das bringen? Suchst du random shuffle?</p>
<blockquote>
<blockquote>
<p>Hash-Map hat einen wunderbar O(1) RA-Zugriff.</p>
</blockquote>
<p>Was ist eine Hash-map? <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>
</blockquote>
<p><a href="https://www.google.de/search?&amp;q=hashmap" rel="nofollow">Google: hashmap</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726394</guid><dc:creator><![CDATA[BattleForTheSun]]></dc:creator><pubDate>Sun, 14 Jun 2009 13:32:15 GMT</pubDate></item></channel></rss>