<?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[Comparator in der eigenen Klasse verwenden]]></title><description><![CDATA[<p>Hallöchen.</p>
<p>Ich schreibe mal wieder an meiner Baum-Klasse weiter und hätte da nochmal ne Designfrage.</p>
<p>Ich hab einen templatisierten Baum Baum&lt;T&gt; geschrieben, der Objekte vom Typ Blatt&lt;T&gt; sortiert, wobei T die eigentlich zu speichernden Daten sind.</p>
<p>Jetzt ist ja für T nicht immer der operator&lt; erklärt. Wenn ich zum Beispiel als T einen Pointer auf irgendwas nehme, dann wirds sowieso Mist, weil operator&lt;(irgendwas*, irtgendwas*) geht ja irgendwie gar nicht. Darum macht man sich eine Compare-Klasse wie zum Beispiel die (zum Vergleich von Vertex-Pointern):</p>
<pre><code class="language-cpp">class VertexPtrComparator
{
  int operator()(const Vertex* v1, const Vertex* v2)
  {
    return *v1 &lt; *v2; // &quot;operator&lt;&quot; wurde sinnvoll in Vertex definiert
  }
}
</code></pre>
<p>Darum wollt ich das wie zum Beispiel bei make_heap aus der STL machen, dass ich einfach ein optionales Argument im KOnstruktor angebe, das so eine VertexPtrComparator-Klasse zum Beispiel annimmt.</p>
<p>Jetzt ist meine Frage wie ich das mache. Ich könnte ja alle Vergleiche ersetzen:</p>
<pre><code class="language-cpp">// Statt
if(node1-&gt;data &lt; node2-&gt;data) //...
// einfach
if(comparator(node1-&gt;data, node2-&gt;data)) // ...
</code></pre>
<p>Ist das klug das so zu machen oder wie würdet ihr das machen?</p>
<p>Für einwas habe ich noch keine Idee. Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?<br />
Oder keinen default-Wert sondern einen zweiten Konstruktor, der dem comparator irgendwas anderes zuweist?</p>
<p>Grüße</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272014/comparator-in-der-eigenen-klasse-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 03:32:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272014.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Aug 2010 17:43:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Comparator in der eigenen Klasse verwenden on Sun, 08 Aug 2010 17:43:40 GMT]]></title><description><![CDATA[<p>Hallöchen.</p>
<p>Ich schreibe mal wieder an meiner Baum-Klasse weiter und hätte da nochmal ne Designfrage.</p>
<p>Ich hab einen templatisierten Baum Baum&lt;T&gt; geschrieben, der Objekte vom Typ Blatt&lt;T&gt; sortiert, wobei T die eigentlich zu speichernden Daten sind.</p>
<p>Jetzt ist ja für T nicht immer der operator&lt; erklärt. Wenn ich zum Beispiel als T einen Pointer auf irgendwas nehme, dann wirds sowieso Mist, weil operator&lt;(irgendwas*, irtgendwas*) geht ja irgendwie gar nicht. Darum macht man sich eine Compare-Klasse wie zum Beispiel die (zum Vergleich von Vertex-Pointern):</p>
<pre><code class="language-cpp">class VertexPtrComparator
{
  int operator()(const Vertex* v1, const Vertex* v2)
  {
    return *v1 &lt; *v2; // &quot;operator&lt;&quot; wurde sinnvoll in Vertex definiert
  }
}
</code></pre>
<p>Darum wollt ich das wie zum Beispiel bei make_heap aus der STL machen, dass ich einfach ein optionales Argument im KOnstruktor angebe, das so eine VertexPtrComparator-Klasse zum Beispiel annimmt.</p>
<p>Jetzt ist meine Frage wie ich das mache. Ich könnte ja alle Vergleiche ersetzen:</p>
<pre><code class="language-cpp">// Statt
if(node1-&gt;data &lt; node2-&gt;data) //...
// einfach
if(comparator(node1-&gt;data, node2-&gt;data)) // ...
</code></pre>
<p>Ist das klug das so zu machen oder wie würdet ihr das machen?</p>
<p>Für einwas habe ich noch keine Idee. Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?<br />
Oder keinen default-Wert sondern einen zweiten Konstruktor, der dem comparator irgendwas anderes zuweist?</p>
<p>Grüße</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937714</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Sun, 08 Aug 2010 17:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Comparator in der eigenen Klasse verwenden on Sun, 08 Aug 2010 18:14:04 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Ist das klug das so zu machen oder wie würdet ihr das machen?</p>
</blockquote>
<p>Ja, unbedingt.<br />
Oder</p>
<pre><code class="language-cpp">if(Comparator()(node1-&gt;data, node2-&gt;data))
</code></pre>
<p>um kein solches Objekt als Attribut halten zu müssen.</p>
<blockquote>
<p>Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?</p>
</blockquote>
<p>std::less</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937732</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 08 Aug 2010 18:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Comparator in der eigenen Klasse verwenden on Sun, 08 Aug 2010 18:31:11 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Max3000 schrieb:</p>
<blockquote>
<p>Ist das klug das so zu machen oder wie würdet ihr das machen?</p>
</blockquote>
<p>Ja, unbedingt.<br />
Oder</p>
<pre><code class="language-cpp">if(Comparator()(node1-&gt;data, node2-&gt;data))
</code></pre>
<p>um kein solches Objekt als Attribut halten zu müssen.</p>
</blockquote>
<p>Auch gut, aber da wird doch jedesmal so ein Objekt erzeugt. Oder wird das wegoptimiert? Hat ja auch keine anderen Member. Da brauch ich ja nicht mal was im Konstruktor machen, sondern mach einfach ein:</p>
<pre><code class="language-cpp">template&lt;typename T, typename Compare=std::less&gt;
class Baum
{
...
};
</code></pre>
<p>, richtig?</p>
<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>Was ist wenn man keinen Comparator mit angibt? Was nehme ich da als default-Wert für dieses Argument?</p>
</blockquote>
<p>std::less</p>
</blockquote>
<p>Genau das hab ich gesucht <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="🙂"
    /> Vielen Dank. Das wars eigentlich auch schon <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/1937745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937745</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Sun, 08 Aug 2010 18:31:11 GMT</pubDate></item></channel></rss>