<?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[Wie sucht eine map einen bestimmten Key?]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit welchem Kriterium findet eine map keys?</p>
<p>Ich habe eine benutzerdefinierte Klasse als Key hineingepackt und der Suchalrorithmus funktioniert einwandfrei.</p>
<p>Ich hätte eigentlich erwartet dass man da noch den operator == () implementieren muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296734/wie-sucht-eine-map-einen-bestimmten-key</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 19:28:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296734.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Dec 2011 12:21:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:21:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit welchem Kriterium findet eine map keys?</p>
<p>Ich habe eine benutzerdefinierte Klasse als Key hineingepackt und der Suchalrorithmus funktioniert einwandfrei.</p>
<p>Ich hätte eigentlich erwartet dass man da noch den operator == () implementieren muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155691</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:23:55 GMT]]></title><description><![CDATA[<p>Nach dem Prädikat, das du als drittes Template-Argument bei <code>std::map</code> angibst. Standardmässig ist das <code>std::less</code> , d.h. Vergleiche werden mit <code>operator&lt;</code> ausgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155693</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:26:53 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nach dem Prädikat, das du als drittes Template-Argument bei <code>std::map</code> angibst. Standardmässig ist das <code>std::less</code> , d.h. Vergleiche werden mit <code>operator&lt;</code> ausgeführt.</p>
</blockquote>
<p>Sortiren ja. Dafür implementiere ich ja operator&lt;()<br />
Aber wie find() ?<br />
Einmal größer und einmal kleiner vergleichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155694</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:34:13 GMT]]></title><description><![CDATA[<p>Ja, es gibt &quot;Fallback&quot; Operatoren für alle Typen.</p>
<p>Irgendwo existiert ein</p>
<pre><code class="language-cpp">template&lt;class T&gt;
bool operator==(T const&amp; a1, T const&amp; a2)
{
  return !(a1 &lt; a2) &amp;&amp; !(a2 &lt; a1);
}
</code></pre>
<p>So werden verdammt viele Operatoren nachgebildet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155696</guid><dc:creator><![CDATA[Ethon__]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:34:37 GMT]]></title><description><![CDATA[<p>Du brauchst das doch nicht implementieren. Wenn du den operator &lt; implementiert hast, benutzt die map diesen zum Vergleich. Mehr brauchst du nicht machen <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/2155697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155697</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:38:27 GMT]]></title><description><![CDATA[<p>Ethon__ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class T&gt;
bool operator==(T const&amp; a1, T const&amp; a2)
{
  return !(a1 &lt; a2) &amp;&amp; !(a2 &lt; a1);
}
</code></pre>
</blockquote>
<p>Das sieht mir aber nicht so effizient aus...</p>
<p>Bei mir müsste hierfür im Prinzip nur eine int id mit einer zweiten int id verglichen werden. Wäre es dann geschickter einen eigenen operator == () im Sinne von</p>
<pre><code class="language-cpp">bool operator == (  settings const &amp; lhs, settings const &amp; rhs )
{
	return lhs.get() == rhs.get();
}
</code></pre>
<p>zu implementieren um nicht unnötige aufrufe zu generieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155698</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:46:56 GMT]]></title><description><![CDATA[<p>blublub schrieb:</p>
<blockquote>
<p>Sortiren ja. Dafür implementiere ich ja operator&lt;()<br />
Aber wie find() ?</p>
</blockquote>
<p>Binäre Suche mit dem gleichen Kriterium wie fürs Sortieren. Wenn im Sinne des Sortierkriteriums keine Äquivalenz vorliegt, wird der <code>end()</code> -Iterator zurückgegeben.</p>
<p>blublub schrieb:</p>
<blockquote>
<p>Bei mir müsste hierfür im Prinzip nur eine int id mit einer zweiten int id verglichen werden. Wäre es dann geschickter einen eigenen operator == () im Sinne von [...] zu implementieren um nicht unnötige aufrufe zu generieren?</p>
</blockquote>
<p>Nein, die <code>std::map</code> würde den <code>operator==</code> ignorieren. Und geschickter wäre es ohnehin nicht, weil du so die Äquivalenzbedingung ( <code>==</code> mit <code>&lt;</code> ausgedrückt) kaputt machen könntest.</p>
<p>Möglicherweise suchst du aber einen anderen Container wie z.B. <code>std::unordered_map</code> . Allerdings sollte dafür der treibende Faktor die O(1)-Suche sein und sicher nicht die &quot;ineffizienten&quot; zusätzlichen arithmetischen Operationen für den Vergleich. Vergiss nicht, dass Hash-Maps auch was kosten (vor allem Speicher).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155700</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:54:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Das sieht mir aber nicht so effizient aus...</p>
<p>Bei mir müsste hierfür im Prinzip nur eine int id mit einer zweiten int id verglichen werden. Wäre es dann geschickter einen eigenen operator == () im Sinne von zu implementieren um nicht unnötige aufrufe zu generieren?</p>
</blockquote>
<p>Macht prinzipiell Sinn, diese Fallbacks sind ja nur dazu da, nicht implementierte Operatoren nachzubauen.</p>
<p>Aber die Map interessiert sich wirklich nicht, die ist ja intern ein Suchbaum, da sieht das pseudomäßig etwa so aus:</p>
<pre><code class="language-cpp">Foo find(Node node, Bar key)
{
  if(key &gt; node.key)
    return find(node.right, key);

  if(node.key &gt; key)
    return find(node.left, key);

  return node.data;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155702</guid><dc:creator><![CDATA[Ethon__]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 12:59:12 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>... weil du so die Äquivalenzbedingung (== mit &lt; ausgedrückt) kaputt machen könntest ...</p>
</blockquote>
<p>Warum den das?<br />
Ich vergleiche doch nur eine int variable und dieser Vergleich ist in jedem Fall richtig.</p>
<p>Bin jetzt total verwirrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155703</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 12:59:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 13:05:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Elem
{
    int x;
};

bool operator&lt; (Elem lhs, Elem rhs)
{
    return lhs.x &lt; rhs.x;
}

bool operator== (Elem lhs, Elem rhs)
{
    return lhs.x == rhs.x - 5; // niemand hindert dich daran
}

int main()
{
    Elem a = {3}, b = {8};
    assert(a == b); // aha, sie sind gleich, also sicher auch äquivalent
    assert(!(a &lt; b) &amp;&amp; !(b &lt; a)); // wtf, warum doch nicht?
}
</code></pre>
<p>Indem du sowohl <code>operator&lt;</code> als auch <code>operator==</code> bereitstellst, baust du nur unnötige Fehlerquellen ein. <code>operator&lt;</code> alleine reicht vollständig, da es nur um Äquivalenz (im Sinne des Sortierkriteriums) und nicht um Gleichheit geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155706</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 Dec 2011 13:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 14:28:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool operator== (Elem lhs, Elem rhs)
{
    return lhs.x == rhs.x - 5; // niemand hindert dich daran
}
</code></pre>
</blockquote>
<p>Hmm.. das war mir noch gar nicht so in den Sinn gekommen. Ich dachte so etwas wäre ein Bug den man i. d. R. durch Unit Tests zurückverfolgen kann. Zumindest hindert mich ja auch keiner daran so etwas zu machen:</p>
<pre><code class="language-cpp">bool operator&lt; (Elem lhs, Elem rhs)
{
    return lhs.x &lt; rhs.x - 5;
}
</code></pre>
<p>Danke an alle Antwortenden für eure Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155730</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 14:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 14:39:26 GMT]]></title><description><![CDATA[<p>Was heißt Bug? Es kann durchaus manchmal gewollt sein, dass <code>a == b</code> nicht dasselbe ist wie <code>!(a &lt; b) &amp;&amp; !(a &gt; b)</code> . Z.B. gibt NaN == NaN falsch zurück. Wenn du also operator== benutzen würdest, würdest du nie den NaN-Wert aus deiner map finden. Mit operator&lt; findest du ihn aber.</p>
<p>Oder ein anderes (konstruiertes) Beispiel: Ich sage für zwei Mengen A und B, dass A &lt; B genau dann gilt, wenn A weniger Elemente enthält als B. Ich sage aber nur A == B, wenn alle Elemente übereinstimmen (das brauch ich dann woanders im Programm). Wenn ich nun zu jedem Zeitpunkt nur die neueste Menge mit einer bestimmten Kardinalität haben will (ich lösche also alte Mengen mit derselben Kardinalität), kann ich sie in eine map stecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155734</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 11 Dec 2011 14:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 14:37:43 GMT]]></title><description><![CDATA[<p>Mit ein wenig Bedenkzeit glaube ich mittlerweile auch dass nur ein operator&lt; genügt solange der Profiler hier keinen Engpass meldet. Dazu käme ja noch eine weitere Testklasse, UML, Doku usw.</p>
<p>Nein das lohnt sich wirklich nicht.</p>
<p>Danke nochmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155738</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 14:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 14:45:09 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Gleich mal als PDF in die Wertvolle Tips liste einfügen <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/2155742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155742</guid><dc:creator><![CDATA[blublub]]></dc:creator><pubDate>Sun, 11 Dec 2011 14:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie sucht eine map einen bestimmten Key? on Sun, 11 Dec 2011 16:35:51 GMT]]></title><description><![CDATA[<p>blublub schrieb:</p>
<blockquote>
<p>Mit ein wenig Bedenkzeit glaube ich mittlerweile auch dass nur ein operator&lt; genügt solange der Profiler hier keinen Engpass meldet. Dazu käme ja noch eine weitere Testklasse, UML, Doku usw.</p>
<p>Nein das lohnt sich wirklich nicht.</p>
<p>Danke nochmal</p>
</blockquote>
<p>Wie bereits gesagt: In einem binären Suchbaum ist sowieso nur der operator&lt; relevant, da eigentlich nur verglichen werden muss ob man in das linke o. rechte Kind absteigen muss, andernfalls wird der gespeicherte Wert zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155774</guid><dc:creator><![CDATA[Ethon__]]></dc:creator><pubDate>Sun, 11 Dec 2011 16:35:51 GMT</pubDate></item></channel></rss>