<?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 Klasse &amp;quot;Point2D&amp;quot; in C++ Set speichern]]></title><description><![CDATA[<p>Aus gegebenem Anlass:</p>
<p>Angenommen ich lese eine Menge an Punkten ein. Es können doppelte Punkte vorkommen und die Punkte werden in einer Klasse Point2D gespeichert. Einzige Attribute sind x und y als double.</p>
<p>Double vergleiche ich wie folgt:</p>
<pre><code>template&lt;class T&gt;
		bool compareFloatingPoint(T first, T second, T epsilon = std::numeric_limits&lt;T&gt;::epsilon()) {
			return std::abs(first - second) &lt; epsilon;
		}
</code></pre>
<p>Frage: Wie kann ich jetzt diese Punkte-Klasse in ein Set &quot;inserten&quot;? Hierfür ist ja der &lt; Operator zu überladen. Nur wie überprüft das Set auf Gleicheit? Würde ggfs. einfach der == Operator genutzt werden, was Fehler in Kombination mit doubles verursachen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337630/wie-klasse-quot-point2d-quot-in-c-set-speichern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 21:15:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337630.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Apr 2016 12:52:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie Klasse &amp;quot;Point2D&amp;quot; in C++ Set speichern on Fri, 15 Apr 2016 12:52:42 GMT]]></title><description><![CDATA[<p>Aus gegebenem Anlass:</p>
<p>Angenommen ich lese eine Menge an Punkten ein. Es können doppelte Punkte vorkommen und die Punkte werden in einer Klasse Point2D gespeichert. Einzige Attribute sind x und y als double.</p>
<p>Double vergleiche ich wie folgt:</p>
<pre><code>template&lt;class T&gt;
		bool compareFloatingPoint(T first, T second, T epsilon = std::numeric_limits&lt;T&gt;::epsilon()) {
			return std::abs(first - second) &lt; epsilon;
		}
</code></pre>
<p>Frage: Wie kann ich jetzt diese Punkte-Klasse in ein Set &quot;inserten&quot;? Hierfür ist ja der &lt; Operator zu überladen. Nur wie überprüft das Set auf Gleicheit? Würde ggfs. einfach der == Operator genutzt werden, was Fehler in Kombination mit doubles verursachen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493238</guid><dc:creator><![CDATA[Rastlos]]></dc:creator><pubDate>Fri, 15 Apr 2016 12:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Klasse &amp;quot;Point2D&amp;quot; in C++ Set speichern on Fri, 15 Apr 2016 14:42:13 GMT]]></title><description><![CDATA[<p>Das wird so nicht funktionieren, weil die C++-Container verlangen, dass dein == transitiv ist: Wenn x == y und y == z ist, dann muss auch x == z sein.</p>
<p>Das funktioniert mit deiner Vergleichsfunktion aber nicht: Nimm z.b. epsilon = 0.1. Dann sind 1.00 und 1.08 äquivalent, und 1.08 und 1.16 sind auch äquivalent, aber 1.00 und 1.16 sind nicht mehr äquivalent.</p>
<p>Das ist nicht nur eine technische Formalität. std::set verhält sich (beim g++, aber bestimmt auch mit anderen Compilern) tatsächlich falsch, wenn == nicht transitiv ist.</p>
<p>Du müsstest dir also erstmal eine Vergleichsfunktion überlegen, die transitiv ist.</p>
<p>Zu deiner Frage: std::set u.ä. Container gehen davon aus, !(x &lt; y) und !(y &lt; x) impliziert, dass x == y ist (und sparen sich dadurch den Aufruf von ==). Du musst einen operator&lt; bereitstellen, der das erfüllt. Insbesondere die Transitivität von == muss gelten, sonst wird dein Set sich weigern Punkte einzufügen, obwohl sie noch nicht drin sind, und ähnliche Fehler machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493246</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Fri, 15 Apr 2016 14:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Klasse &amp;quot;Point2D&amp;quot; in C++ Set speichern on Fri, 15 Apr 2016 14:36:41 GMT]]></title><description><![CDATA[<p>Rastlos schrieb:</p>
<blockquote>
<p>Hierfür ist ja der &lt; Operator zu überladen.</p>
</blockquote>
<p>Nein, du kannst auch einen Funktor angeben.</p>
<p>Rastlos schrieb:</p>
<blockquote>
<p>Nur wie überprüft das Set auf Gleicheit?</p>
</blockquote>
<p>!(a&lt;b) &amp;&amp; !(b&lt;a)</p>
<p>Rastlos schrieb:</p>
<blockquote>
<p>Würde ggfs. einfach der == Operator genutzt werden, was Fehler in Kombination mit doubles verursachen kann?</p>
</blockquote>
<p>Welchen &quot;Fehler&quot; soll == haben, den &lt; nicht hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493247</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 15 Apr 2016 14:36:41 GMT</pubDate></item></channel></rss>