<?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[BinarySearchTree - Vergleichsoperator für gespeichete Zeiger?]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich implementiere zur Zeit aus Übungsgründen einen binären Suchbaum, natürlich mit Templates.</p>
<p>Für's Einfügen habe ich damit einen Vergleich, den ich natürlich auf zwei Variablen ausführe, die vom Templatetyp sind.</p>
<p>Jetzt habe ich bei solch einem Suchbaum natürlich meistens Zeiger auf Objekte drin, also vergleicht er mir z.Z. die Adressen.</p>
<p>Folgende Lösungsideen habe ich:</p>
<ol>
<li>operator&lt; für den jeweiligen Objektzeiger überladen, so was wie:<br />
operator&lt;(const Objekt*&amp; obj1, const Objekt*&amp; obj2)</li>
</ol>
<p>Lässt sich so etwas aber überhaupt implementieren? Ein Vergleichsoperator mit dieser Deklaration scheint nicht zu funktionieren.</p>
<ol start="2">
<li>
<p>Eine Dummyklasse bauen, die einen Zeiger auf das entsprechende Objekt hat und operator&lt; und operator&gt; einfach überlädt. Damit habe ich den gleichen Speicher in der Verwendung wie mit einem direkt gespeicherten Zeiger, also minimal Overhead.</p>
</li>
<li>
<p>Meine Templateklasse allgemein für Zeiger-Templateobjekte spezialisieren. Aber das unterstützt der Standard auch nicht, oder?</p>
</li>
</ol>
<p>Findet ihr Variante 2 gut? Oder habt ihr eine noch bessere Idee. Vielleicht habe ich ja auch nen Designfehler oder vergesse irgendeinen mächtigen Winkel von C++. <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>
<p>Danke und viele Grüße,</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256824/binarysearchtree-vergleichsoperator-für-gespeichete-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 03:32:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256824.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Dec 2009 12:27:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BinarySearchTree - Vergleichsoperator für gespeichete Zeiger? on Fri, 18 Dec 2009 12:27:54 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich implementiere zur Zeit aus Übungsgründen einen binären Suchbaum, natürlich mit Templates.</p>
<p>Für's Einfügen habe ich damit einen Vergleich, den ich natürlich auf zwei Variablen ausführe, die vom Templatetyp sind.</p>
<p>Jetzt habe ich bei solch einem Suchbaum natürlich meistens Zeiger auf Objekte drin, also vergleicht er mir z.Z. die Adressen.</p>
<p>Folgende Lösungsideen habe ich:</p>
<ol>
<li>operator&lt; für den jeweiligen Objektzeiger überladen, so was wie:<br />
operator&lt;(const Objekt*&amp; obj1, const Objekt*&amp; obj2)</li>
</ol>
<p>Lässt sich so etwas aber überhaupt implementieren? Ein Vergleichsoperator mit dieser Deklaration scheint nicht zu funktionieren.</p>
<ol start="2">
<li>
<p>Eine Dummyklasse bauen, die einen Zeiger auf das entsprechende Objekt hat und operator&lt; und operator&gt; einfach überlädt. Damit habe ich den gleichen Speicher in der Verwendung wie mit einem direkt gespeicherten Zeiger, also minimal Overhead.</p>
</li>
<li>
<p>Meine Templateklasse allgemein für Zeiger-Templateobjekte spezialisieren. Aber das unterstützt der Standard auch nicht, oder?</p>
</li>
</ol>
<p>Findet ihr Variante 2 gut? Oder habt ihr eine noch bessere Idee. Vielleicht habe ich ja auch nen Designfehler oder vergesse irgendeinen mächtigen Winkel von C++. <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>
<p>Danke und viele Grüße,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824417</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 18 Dec 2009 12:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to BinarySearchTree - Vergleichsoperator für gespeichete Zeiger? on Fri, 18 Dec 2009 12:50:12 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Lässt sich so etwas aber überhaupt implementieren?</p>
</blockquote>
<p>Nein, bei der Operatorüberladung muss mindestens ein Argument von einem benutzerdefiniertem Typ sein. Für BuiltIn-Typen wie Zeiger funktioniert das nicht.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Oder habt ihr eine noch bessere Idee. Vielleicht habe ich ja auch nen Designfehler oder vergesse irgendeinen mächtigen Winkel von C++. <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>Du denkst nicht daran, dass C++ bereits eingebaute Vergleichsoperatoren für Zeiger besitzt. Du musst also gar nichts tun. Praktisch, oder? <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>P.S. Streng genommen garantiert der Standard das korrekte Resultat von Vergleichsoperationen auf Zeiger, die nicht ins selbe Array zeigen, nicht. Allerdings kann <code>std::less</code> , das Standardprädikat für <code>operator&lt;</code> , diese Garantie erfüllen. In der Praxis stellt das eigentlich nie ein Problem dar. Am besten schreibst du den Code für den Vergleich nicht explizit hin, sondern verwendest einen weiteren Template-Parameter für die Vergleichsfunktion, der standardmässig auf <code>std::less&lt;T&gt;</code> gesetzt ist (schau wenn nötig in die Implementierung von STL-Containern, z.B. <code>std::set</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1824424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824424</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 18 Dec 2009 12:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to BinarySearchTree - Vergleichsoperator für gespeichete Zeiger? on Fri, 18 Dec 2009 12:48:33 GMT]]></title><description><![CDATA[<p>Du könntest so etwas wie ein Funktionsobjekt als weiteren Template Parameter übergeben und den Vergleich über das Objekt machen. Damit bist du wesentlich flexibler, als den &lt; operator zu implementiern, denn damit gibt es genau eine Implementation und du kannst Objekte gleichen Typs nur nach einem Kriterium sortieren.</p>
<pre><code class="language-cpp">template&lt;typename T, typename Pred=std::less&lt;T&gt; &gt; // Default ist std::less
class BinaryTree
{
   // Objekt zum Vergleichen von zwei Typen T
   Pred Comparator;
   ...
};

struct MyPred
{
   bool operator()( const MyType&amp; op1, const MyType&amp; op2 ) const
   {
      return op1.SomeAttribute &lt; op2.SomeAttribute;
   }
};

struct MyOtherPred
{
   bool operator()( const MyType&amp; op1, const MyType&amp; op2 ) const
   {
      return op1.SomeOtherAttribute &lt; op2.SomeOtherAttribute;
   }
};

int main()
{
   // zwei Bäume mit unterschiedlichen Sortierkriterien
   BinaryTree&lt;MyType, MyPred&gt; BT1;
   BinaryTree&lt;MyType, MyOtherPred&gt; BT2;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1824427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824427</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 18 Dec 2009 12:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to BinarySearchTree - Vergleichsoperator für gespeichete Zeiger? on Fri, 18 Dec 2009 14:16:27 GMT]]></title><description><![CDATA[<p>Ah, stimmt, das ist ne top Idee. Danke!</p>
<p>Mir einfach paar STL-Container anzuschauen wäre natürlich schlau gewesen. Werde es jetzt so bauen, danke <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/1824486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1824486</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 18 Dec 2009 14:16:27 GMT</pubDate></item></channel></rss>