<?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 zu std::unordered_set]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benötige einen container, in dem ich schnell suchen kann. eine map kommt nicht in frage. nun habe ich überlegt eine std::unordered_set einzusetzen. die frage ist, wenn ich eine klasse A habe, die ich in den std::unordered_set reinstecken will, wie sieht dann die methode aus, die dafür implementiert werden muss.</p>
<p>ich denke A muss irgend einen hash liefern oder? <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/topic/318046/frage-zu-std-unordered_set</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 14:24:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318046.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Jun 2013 23:27:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:27:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benötige einen container, in dem ich schnell suchen kann. eine map kommt nicht in frage. nun habe ich überlegt eine std::unordered_set einzusetzen. die frage ist, wenn ich eine klasse A habe, die ich in den std::unordered_set reinstecken will, wie sieht dann die methode aus, die dafür implementiert werden muss.</p>
<p>ich denke A muss irgend einen hash liefern oder? <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/2335136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335136</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:33:21 GMT]]></title><description><![CDATA[<p><a href="http://stackoverflow.com/questions/9927208/requirements-for-elements-in-stdunordered-set" rel="nofollow">http://stackoverflow.com/questions/9927208/requirements-for-elements-in-stdunordered-set</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335138</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:34:12 GMT]]></title><description><![CDATA[<p><a href="http://en.cppreference.com/w/cpp/utility/hash" rel="nofollow">http://en.cppreference.com/w/cpp/utility/hash</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335139</guid><dc:creator><![CDATA[urlpaste]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:40:09 GMT]]></title><description><![CDATA[<p>bobo7788 schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich benötige einen container, in dem ich schnell suchen kann.</p>
</blockquote>
<p>Erzähl mal mehr.</p>
<blockquote>
<p>eine map kommt nicht in frage.</p>
</blockquote>
<p>map? Meinst du set? Warum kommt es nicht in Frage?</p>
<blockquote>
<p>nun habe ich überlegt eine std::unordered_set einzusetzen. die frage ist, wenn ich eine klasse A habe, die ich in den std::unordered_set reinstecken will, wie sieht dann die methode aus, die dafür implementiert werden muss.</p>
<p>ich denke A muss irgend einen hash liefern oder? <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>Ja. Du kannst die Hashfunktion entweder als zweiten Templateparameter des unordered_set angeben oder du kannst std::hash für deine Klasse spezialisieren. Dies ist eine der ausnahmen, wo man selber neue Funktionalität in den Namensraum std einbringen darf.</p>
<p>Je nachdem, was du auf die erste Gegenfrage antwortest, kommen aber eventuell auch ganz andere Strukturen in Frage. Zum Beispiel ein sortierter Sequenzcontainer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335140</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:42:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Je nachdem, was du auf die erste Gegenfrage antwortest, kommen aber eventuell auch ganz andere Strukturen in Frage. Zum Beispiel ein sortierter Sequenzcontainer.</p>
</blockquote>
<p>ok, die klasse A hat ein member, das eindeutig ist, nämlich einen string.</p>
<p>in der regel wird nach einem objekt mit einem spezifischen string gesucht, aber eben nicht immer.</p>
<p>dennoch soll beispielsweise die suche nach einem objekt mit dem string &quot;adam&quot; möglichst sehr schnell ablaufen.</p>
<p>es werden sehr viele objekte vom typ A im container landen. deshalb scheidet std::vector aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335141</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Fri, 28 Jun 2013 23:54:16 GMT]]></title><description><![CDATA[<blockquote>
<p>es werden sehr viele objekte vom typ A im container landen. deshalb scheidet std::vector aus.</p>
</blockquote>
<p>Die Aussage ist nicht wirklich plausibel.</p>
<p>Manchmal kann es sinvoll sein, eindeutige Strings in fortlaufende IDs zu mappen. Dann muss jeder String nur einmal gesucht werden und dann geht der Zugriff enorm schnell.</p>
<pre><code class="language-cpp">typedef int class_id;

struct string_mappers {
  std::unordered_map&lt;std::string, class_id&gt; strings;
  class_id get(std::string const&amp; s) {
    class_id&amp; id = strings[s];
    if (id == 0) id = strings.size(); // new element
    return id;
  }
};

class KlasseA { // von der du geredet hast
  class_id id;
};

string_mappers allIds;
std::vector&lt;KlasseA&gt; sehrVieleObjekteVomTypA;

KlasseA&amp; search_for(class_id id) { return sehrVieleObjekteVomTypA[id]; }

// nach &quot;adam&quot; suchen:
static class_id adam_id = allIds.get(&quot;adam&quot;); // muss ich nur einmal suchen
KlasseA&amp; adam = search_for(adam_id);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2335142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335142</guid><dc:creator><![CDATA[undeva]]></dc:creator><pubDate>Fri, 28 Jun 2013 23:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Sat, 29 Jun 2013 07:17:38 GMT]]></title><description><![CDATA[<p>Nimm die unordered_map, mit dem eindeutigen string als key und der Klasse als value, wobei hier das string-Element natürlich redundant ist und du Speicher sparen kannst, wenn du es hier einfach weglässt.<br />
Zunächst kannst du erstmal die von deinem Compiler eingebaute string-Hashfunktion nehmen und wenn du einen repräsentativen Datenbestand simulieren kannst, kannst du immer noch eigene Hash-Funktionen ausprobieren, ob sie denn schneller arbeiten.<br />
Das Suchen nach anderen Kriterien als dem String in deiner großen Map wird dann allerdings langsam sein und sollte auf Ausnahmefälle beschränkt bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335165</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Sat, 29 Jun 2013 07:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Sat, 29 Jun 2013 19:06:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Nimm die unordered_map, mit dem eindeutigen string als key und der Klasse als value, wobei hier das string-Element natürlich redundant ist und du Speicher sparen kannst, wenn du es hier einfach weglässt.</p>
</blockquote>
<p>Sehr böse. Redundanz kann alle möglichen &quot;Anomalien&quot; begünstigen und den String aus der Klasse zu nehmen, <s>um Speicher zu sparen</s> um diese &quot;Anomalien&quot; (keine DB, aber der Begriff passt hier trotzdem, finde ich) zu vermeiden verstümmelt die Klasse auf Grund der Einsatzmethode, das kann man doch nicht empfehlen.</p>
<p>Ich fände std::inordered_set okay, dann ist der Hash eben nur vom string abhängig und gut. Leider sind Sets ... &quot;ungeschickt&quot; implementiert und man kann nicht so einfach Werte ändern, selbst wenn diese die Ordnung nicht ändern, das ist bei unordered_set auch so. Wenn sich eh nichts ändern, sondern nur löschen oder einfügen lassen soll, ist das natürlich egal.</p>
<p>Wonach soll sonst gesucht werden? boost::multiindex legt auch Hierarchien an, man kann aber eben mehrere Indizes anlegen und hat die Probleme mit der Set-Unlogik nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335169</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 19:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 13:44:32 GMT]]></title><description><![CDATA[<p>Ja, Redundanzen will ich natürlich vermeiden.</p>
<p>Bei einem unordered_set habe ich natürlich das Problem, dass ich nicht genau nach einen Key vom Typ std::string suchen kann.</p>
<p>Die Objekte A innerhalb von dem set haben zwar den std::string als Member, aber der Aufruf set.find() erwartet natürlich ein Objekt A und kein std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335759</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:44:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 15:25:17 GMT]]></title><description><![CDATA[<p>Du kannst doch eigene Vergleichsoperatoren für das Set definieren. Oder für die Klasse selbst eben, wenn das eben das Haupt-Vergleichskriterium ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335783</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 01 Jul 2013 15:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 18:34:29 GMT]]></title><description><![CDATA[<p>Was spricht denn gegen ein normales set? Da gibt es keinen Overhead wegen doppelten Strings oder Hashfunktionen.</p>
<pre><code>struct A{
    std::string name;
    //anderer Kram
};

std::set&lt;A, [](const A &amp;a1, const A &amp;a2){return a1.name &lt; a2.name;}&gt; Aset;

//noch eine Hilfsfunktion dazu:
const A *findObject(const std::string &amp;s){
    static A a; //dummy A zum Suchen
    a.name = s;
    auto it = Aset.find(a);
    if (it == Aset.end()) //das kann man sicher noch hübscher machen, vielleicht einfach den Iterator zurück geben
        return 0;         //oder den Dummy oder den entsprechenden Wert ins set einfügen und eine Referenz darauf zurück geben
    return &amp;(*it);
}
</code></pre>
<p>Dann noch eine Changefunktion bauen, die bei Ändern von A::name das Element aus dem Set entfernt, den Namen ändert und wieder hinzufügt und ansonsten per const_cast direkt ändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335810</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Mon, 01 Jul 2013 18:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 19:55:20 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Du kannst doch eigene Vergleichsoperatoren für das Set definieren. Oder für die Klasse selbst eben, wenn das eben das Haupt-Vergleichskriterium ist.</p>
</blockquote>
<p>Richtig. Ich kann aber nicht nach dem Objekt meiner Wahl mit set.find(&quot;MyKey&quot;) suchen. Ich muss mit set.find(MyObject) suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335819</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Mon, 01 Jul 2013 19:55:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 19:58:47 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/libs/intrusive/" rel="nofollow">http://www.boost.org/libs/intrusive/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335822</guid><dc:creator><![CDATA[intrusive]]></dc:creator><pubDate>Mon, 01 Jul 2013 19:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 21:54:26 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Was spricht denn gegen ein normales set?</p>
</blockquote>
<p>Eigentlich nicht viel. <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>Ich habe es jetzt tatsächlich mit einem std::set realisiert und verwende einfach ein static Objekt, dem ich den key zuweise.</p>
<p>Die Laufzeit bei vielen Elementen (&gt;100000) ist mit set.find einfach deutlich besser, als mit std::find_if.</p>
<p>Es ist sogar noch besser, als bei einer std::map mit direktem Indexzugriff mymap[key]. Das hat mich erstaunt. Beide liegen aber im selben Bereich, die Abweichung betrifft nur die Zahl hinter dem Komma.</p>
<p>=&gt; Die Laufzeit ist ja bei beiden O(logn) <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/2335844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335844</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Mon, 01 Jul 2013 21:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Mon, 01 Jul 2013 22:11:23 GMT]]></title><description><![CDATA[<p>bobo7788 schrieb:</p>
<blockquote>
<p>Es ist sogar noch besser, als bei einer std::map mit direktem Indexzugriff mymap[key]. Das hat mich erstaunt. Beide liegen aber im selben Bereich, die Abweichung betrifft nur die Zahl hinter dem Komma.</p>
<p>=&gt; Die Laufzeit ist ja bei beiden O(logn) <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>
</blockquote>
<p>Das ist sicherlich nur eine Messschwankung. map <em>sollte</em> (wenn die Macher einigermaßen faul waren) als ein <code>set&lt;pair&lt;key, value&gt;&gt;</code> mit passender Vergleichsfunktion und den map-Methoden implementiert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335847</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 22:11:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 01:13:06 GMT]]></title><description><![CDATA[<p>bobo7788 schrieb:</p>
<blockquote>
<p>Ich habe es jetzt tatsächlich mit einem std::set realisiert und verwende einfach ein static Objekt, dem ich den key zuweise.</p>
</blockquote>
<p>Bin mir noch unsicher, ob ich mich freuen oder ärgern soll, dass du dasselbe erfunden hast was ich gepostet hatte. Ich sag einfach mal &quot;Great minds think alike&quot; und freue mich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335864</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 02 Jul 2013 01:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 06:19:04 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>bobo7788 schrieb:</p>
<blockquote>
<p>Es ist sogar noch besser, als bei einer std::map mit direktem Indexzugriff mymap[key]. Das hat mich erstaunt. Beide liegen aber im selben Bereich, die Abweichung betrifft nur die Zahl hinter dem Komma.</p>
<p>=&gt; Die Laufzeit ist ja bei beiden O(logn) <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>
</blockquote>
<p>Das ist sicherlich nur eine Messschwankung. map <em>sollte</em> (wenn die Macher einigermaßen faul waren) als ein <code>set&lt;pair&lt;key, value&gt;&gt;</code> mit passender Vergleichsfunktion und den map-Methoden implementiert sein.</p>
</blockquote>
<p>Die Schwankung scheint aber regelmäßig zu sein. Bei 500000 Elementen habe ich im Release mit std::find_if eine Zeit von 0.00465415, mit set.find 1.20115e-006 und mit map[key] einer Zeit von 4.20402e-006.</p>
<p>map uns set sind praktisch gleichauf, aber dennoch schneidet set immer ein klitzewenig besser ab. <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/2335870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335870</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Tue, 02 Jul 2013 06:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 07:32:56 GMT]]></title><description><![CDATA[<p>Ist 10^-6 Sekunden überhaupt noch innerhalb der Auflösung des Timers? Eventuell misst du hier die kleine if-Abfrage, die bei der map bei nicht-finden ein neues Element anlegt, wohingegen set dann einfach end() liefert. Versuch doch mal das find von der map anstatt operator[].</p>
<p>P.S.: Das heißt, deine set- und map-Codes sind nicht äquivalent, falls ein Element nicht vorhanden sein sollte. Ich nehme an, das hast du schon bedacht, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335877</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 02 Jul 2013 07:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 07:45:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Laufzeit bei vielen Elementen (&gt;100000) ist mit set.find einfach deutlich besser, als mit std::find_if.</p>
</blockquote>
<p>Ja ach, find_if ist ja eine lineare Suche. Vergleich's mit std::binary_search (Sortierung natürlich vorausgesetzt).</p>
<p>Set ist schon echt okay, wenn man nichts ändern will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335888</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 02 Jul 2013 07:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 07:50:06 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ist 10^-6 Sekunden überhaupt noch innerhalb der Auflösung des Timers? Eventuell misst du hier die kleine if-Abfrage, die bei der map bei nicht-finden ein neues Element anlegt, wohingegen set dann einfach end() liefert. Versuch doch mal das find von der map anstatt operator[].</p>
<p>P.S.: Das heißt, deine set- und map-Codes sind nicht äquivalent, falls ein Element nicht vorhanden sein sollte. Ich nehme an, das hast du schon bedacht, oder?</p>
</blockquote>
<p>Jup, das hatte ich berücksichtigt. Die Messung habe ich mit dem QueryPerformanceCounter durchgeführt.</p>
<p>Aber wie gesagt, sowohl set, als auch map haben O(logn) und liegen praktisch gleichauf. Man merkt bei std::find_if deutlich O(n).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335891</guid><dc:creator><![CDATA[bobo7788]]></dc:creator><pubDate>Tue, 02 Jul 2013 07:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 09:31:39 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<pre><code>std::set&lt;A, [](const A &amp;a1, const A &amp;a2){return a1.name &lt; a2.name;}&gt; Aset;
</code></pre>
</blockquote>
<p>Das müsstest Du nochmal üben. <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="😉"
    /> std::set will als zweiten Templateparameter auch einen Typen haben, kein &quot;Lambda-Objekt&quot;.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Vergleich's mit std::binary_search (Sortierung natürlich vorausgesetzt).</p>
</blockquote>
<p>wobei binary_search einem nur sagt, ob das Element vorhanden ist oder nicht. Was er will ist std::lower_bound -- wenn ich mich da richtig erinnere. Habe jetzt nicht nochmal extra nachgeguckt.</p>
<p>Bleibt vielleicht noch zu sagen, dass bei std::set und std::map die Laufzeit auch im schlechtesten Fall O(log(n)) ist, wohingegen die Laufzeit bei std::unordered_* im Durchschnitt O(1) und im schlechtesten Fall O(n) ist, je nachdem, wie viele Hash-Kollisionen es gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335904</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Jul 2013 09:31:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 13:19:38 GMT]]></title><description><![CDATA[<blockquote>
<p>&quot;Lambda-Objekt&quot;</p>
</blockquote>
<p><em>closure-object</em>. Allerdings ist die Idee nicht falsch - einfach den <em>closure-type</em> übergeben. Und dann muss noch eine Kopie des <em>closure-object</em>s an den Konstruktor von <code>set</code> übergeben werden, denn der default-Konstruktor ist <code>deleted</code> .</p>
<pre><code>auto cap_obj = [](int a, int b){ return a &lt; b; };
	std::set&lt;int, decltype(cap_obj)&gt; set{cap_obj};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2335938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335938</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 02 Jul 2013 13:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 11:51:26 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>&quot;Lambda-Objekt&quot;</p>
</blockquote>
<p><em>capture-object</em>.</p>
</blockquote>
<p>Wenn du es genau haben willst, also Standardsprech, dann heißt das <em>closure object</em>, siehe §5.1.2/2. Ich habe aber <em>bewusst</em> &quot;Lambda-Objekt&quot; gesagt und mit Anführungszeichen umschlossen.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>capture-type</p>
</blockquote>
<p>Du meinst <em>closure type</em>. <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/2335948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335948</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Jul 2013 11:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu std::unordered_set on Tue, 02 Jul 2013 13:20:20 GMT]]></title><description><![CDATA[<p>Ich hab mich <strong>völlig</strong> verdaddelt.* Natürlich closure. Ich habe gerade nur schon wieder etwas für das lambda-capture nach gesehen, und die Worte sind recht ähnlich.... <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="🙂"
    /> Das ist mir peinlich.</p>
<p>*Passiert mir öfter. <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/2335965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335965</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 02 Jul 2013 13:20:20 GMT</pubDate></item></channel></rss>