<?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[std::set compare funktioniert nicht so recht]]></title><description><![CDATA[<p>ich benutz nen std::set und will da drin eine menge von pointern auf disjunkte 3D punkte (grob) speichern.</p>
<p>also hab ich mir eine eigene compare funktion gebaut:</p>
<pre><code class="language-cpp">struct Vertex
{
	float x,y,z;
	// konstruktoren und so krams
};

struct cmpVertex
{
	bool operator()(const Vertex *lhs, const Vertex *rhs)
	{
		return lhs-&gt;x &lt; rhs-&gt;x || lhs-&gt;y &lt; rhs-&gt;y || lhs-&gt;z &lt; rhs-&gt;z;
	}
};
</code></pre>
<p>und dem set übergeben:</p>
<pre><code class="language-cpp">set&lt;Vertex*, cmpVertex&gt; vertices;
</code></pre>
<p>eingefügt wird dann an anderer stelle:</p>
<pre><code class="language-cpp">Vertex *A = new Vertex((*iter).A); // der iterator liefert die daten der punkte aus ner anderen liste, das funktioniert auch wunderbar
vertices.insert(A);
</code></pre>
<p>und so werden zwar einige doppelte punkte aussortiert (habs mit ner testmenge probiert), aber nicht alle.</p>
<p>die vergleichsfunktion entspricht meiner ansicht nach der strict weak ordering anforderung.</p>
<p>also dachte ich mir, vielleicht funkt mir float dazwischen, da man diese werte nicht einfach so vergleich kann und hab die vergleichsfunktion testweise umgeschrieben zu:</p>
<pre><code class="language-cpp">struct cmpVertex
{
	bool operator()(const Vertex *lhs, const Vertex *rhs)
	{
		float t = 1e-3; // schwellwert
		return fabs(lhs-&gt;x - rhs-&gt;x) &gt; t || fabs(lhs-&gt;y - rhs-&gt;y) &gt; t || fabs(lhs-&gt;z - rhs-&gt;z) &gt; t;
	}
};
</code></pre>
<p>aber das ergebnis ist immer noch murks.</p>
<p>hab ich irgendwas offensichtliches übersehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/144546/std-set-compare-funktioniert-nicht-so-recht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 16:20:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144546.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Apr 2006 10:40:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::set compare funktioniert nicht so recht on Wed, 19 Apr 2006 10:40:56 GMT]]></title><description><![CDATA[<p>ich benutz nen std::set und will da drin eine menge von pointern auf disjunkte 3D punkte (grob) speichern.</p>
<p>also hab ich mir eine eigene compare funktion gebaut:</p>
<pre><code class="language-cpp">struct Vertex
{
	float x,y,z;
	// konstruktoren und so krams
};

struct cmpVertex
{
	bool operator()(const Vertex *lhs, const Vertex *rhs)
	{
		return lhs-&gt;x &lt; rhs-&gt;x || lhs-&gt;y &lt; rhs-&gt;y || lhs-&gt;z &lt; rhs-&gt;z;
	}
};
</code></pre>
<p>und dem set übergeben:</p>
<pre><code class="language-cpp">set&lt;Vertex*, cmpVertex&gt; vertices;
</code></pre>
<p>eingefügt wird dann an anderer stelle:</p>
<pre><code class="language-cpp">Vertex *A = new Vertex((*iter).A); // der iterator liefert die daten der punkte aus ner anderen liste, das funktioniert auch wunderbar
vertices.insert(A);
</code></pre>
<p>und so werden zwar einige doppelte punkte aussortiert (habs mit ner testmenge probiert), aber nicht alle.</p>
<p>die vergleichsfunktion entspricht meiner ansicht nach der strict weak ordering anforderung.</p>
<p>also dachte ich mir, vielleicht funkt mir float dazwischen, da man diese werte nicht einfach so vergleich kann und hab die vergleichsfunktion testweise umgeschrieben zu:</p>
<pre><code class="language-cpp">struct cmpVertex
{
	bool operator()(const Vertex *lhs, const Vertex *rhs)
	{
		float t = 1e-3; // schwellwert
		return fabs(lhs-&gt;x - rhs-&gt;x) &gt; t || fabs(lhs-&gt;y - rhs-&gt;y) &gt; t || fabs(lhs-&gt;z - rhs-&gt;z) &gt; t;
	}
};
</code></pre>
<p>aber das ergebnis ist immer noch murks.</p>
<p>hab ich irgendwas offensichtliches übersehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040417</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Wed, 19 Apr 2006 10:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::set compare funktioniert nicht so recht on Wed, 19 Apr 2006 10:44:42 GMT]]></title><description><![CDATA[<p>Folgende zwei Punkte sind nach Deiner Sortierung äquivalent:</p>
<p>(1, 2, 3) und (2, 1, 3)</p>
<p>Weil 1 &lt; 2 (1. Koordinate) ist der Vergleich links &lt; rechts true.<br />
Weil 2 &gt; 1 (2. Koordinate) ist der Vergleich rechts &lt; links auch true.</p>
<pre><code class="language-cpp">if (lhs-&gt;x &lt; rhs-&gt;x) return true;
else {
  if (lhs-&gt;y &lt; rhs-&gt;y) return true;
  else
    return lhs-&gt;z &lt; rhs-&gt;z;
}
</code></pre>
<p>Das wäre IMHO ein korrektes Strict Weak Ordering.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040420</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 19 Apr 2006 10:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::set compare funktioniert nicht so recht on Wed, 19 Apr 2006 10:46:23 GMT]]></title><description><![CDATA[<p>Nein, das ist keine strikt weak ordering - z.B. gilt sowohl (0,1,0)&lt;(1,0,0) (l.x&lt;r.y) als auch (1,0,0)&lt;(0,1,0) (l.y&lt;r.y). D.h. du müsstest nochmal zurück ans Zeichenbrett und deinen Vergleichsoperator nochmal überdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040422</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 19 Apr 2006 10:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::set compare funktioniert nicht so recht on Wed, 19 Apr 2006 11:35:37 GMT]]></title><description><![CDATA[<p>ihr habt ja so recht *schäm* bastel mir nu aus den punkten sowas ähnliches wie nen hash und vergleich die. funzt exzellent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040465</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Wed, 19 Apr 2006 11:35:37 GMT</pubDate></item></channel></rss>