<?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[operator&amp;lt; definieren [gelöst]]]></title><description><![CDATA[<p>Hallo,</p>
<p>Um meinen Vector zu sortieren möchte ich gerne den &lt; operator meiner Klasse definieren und dann das Ganze via std::sort sortieren:</p>
<pre><code class="language-cpp">typedef std::vector&lt;Node*&gt; NodeVec;
NodeVec * final_leafs;
</code></pre>
<p>Die Node sollte anhand ihrer x/y position sortiert werden. Zuerst nach X, dann nach Y.</p>
<pre><code class="language-cpp">bool operator &lt; (const Node&amp; rhs) {
	 if(xPos == rhs.getX()) {
		 return (yPos &lt; rhs.getY());
	 }
	 else {
		 return xPos &lt; rhs.getX();
	 };
}
</code></pre>
<p>Nun sollte der &lt; Operator doch beim sortieren aufgerufen werden?<br />
Was allerdings nicht geschieht.</p>
<pre><code class="language-cpp">std::sort(final_leafs-&gt;begin(),final_leafs-&gt;end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/245298/operator-lt-definieren-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 21:55:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245298.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Jul 2009 13:32:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 17:16:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Um meinen Vector zu sortieren möchte ich gerne den &lt; operator meiner Klasse definieren und dann das Ganze via std::sort sortieren:</p>
<pre><code class="language-cpp">typedef std::vector&lt;Node*&gt; NodeVec;
NodeVec * final_leafs;
</code></pre>
<p>Die Node sollte anhand ihrer x/y position sortiert werden. Zuerst nach X, dann nach Y.</p>
<pre><code class="language-cpp">bool operator &lt; (const Node&amp; rhs) {
	 if(xPos == rhs.getX()) {
		 return (yPos &lt; rhs.getY());
	 }
	 else {
		 return xPos &lt; rhs.getX();
	 };
}
</code></pre>
<p>Nun sollte der &lt; Operator doch beim sortieren aufgerufen werden?<br />
Was allerdings nicht geschieht.</p>
<pre><code class="language-cpp">std::sort(final_leafs-&gt;begin(),final_leafs-&gt;end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1741491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741491</guid><dc:creator><![CDATA[vittel]]></dc:creator><pubDate>Sun, 12 Jul 2009 17:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 13:41:43 GMT]]></title><description><![CDATA[<p>Wenn die Bedeutung des <code>operator&lt;</code> nicht ganz klar ist, würde ich ihn nicht überladen, und stattdessen eine Vergleichsfunktion schreiben. Wie soll ein Vektor-ähnliches Konstrukt verglichen werden? Da könnte man den Betrag meinen, die Summe von X und Y, oder zuerst X und dann Y, oder umgekehrt, oder...</p>
<p>Ausserdem solltest du dafür eine freie Funktion einrichten.</p>
<pre><code class="language-cpp">bool CompareNodes(const Node&amp; Left, const Node&amp; Right)
{
    if (Left.getX() == Right.getX())
        return Left.getY() &lt; Right.getY();
    else
        return Left.getX() &lt; Right.getX();
}

std::sort(final_leafs-&gt;begin(), final_leafs-&gt;end(), CompareNodes);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1741500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741500</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 12 Jul 2009 13:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 13:43:44 GMT]]></title><description><![CDATA[<p>Eas geschieht denn dann? Fehlermeldung? Woan siehst du dass er nciht aufgerufen wird? Schon mit dem Debugger durchgegangen? Ohne mehr Infos gibts dazu nicht viel zu sagen. Siehe auch den Thread &quot;<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html" rel="nofollow">Du brauchst Hilfe?</a>&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741502</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 12 Jul 2009 13:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 14:10:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Wenn die Bedeutung des <code>operator&lt;</code> nicht ganz klar ist, würde ich ihn nicht überladen, und stattdessen eine Vergleichsfunktion schreiben. Wie soll ein Vektor-ähnliches Konstrukt verglichen werden? Da könnte man den Betrag meinen, die Summe von X und Y, oder zuerst X und dann Y, oder umgekehrt, oder...</p>
</blockquote>
<p>.. ich meinte angegeben zu haben, was ich vergleichen will.<br />
Wenn nicht, dann scheint mir der Operator&lt; wirklich nicht ganz klar zu sein <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>[quote=&quot;Nexus&quot;]<br />
Ausserdem solltest du dafür eine freie Funktion einrichten.</p>
<pre><code class="language-cpp">bool CompareNodes(const Node&amp; Left, const Node&amp; Right)
{
    if (Left.getX() == Right.getX())
        return Left.getY() &lt; Right.getY();
    else
        return Left.getX() &lt; Right.getX();
}

std::sort(final_leafs-&gt;begin(), final_leafs-&gt;end(), CompareNodes);
</code></pre>
<p>... ähm, sorry. Aber ich scheine momentan grad unfähig zu sein das zu verwirklichen. Die Funktion habe ich so übernommen. Das Ganze ist allerdings in einer Klasse eingebunden:</p>
<pre><code class="language-cpp">void Quadtree::printTree(){
	NodeVec::iterator it;
	/* sort vector */
	std::sort(final_leafs-&gt;begin(),final_leafs-&gt;end(),CompareNodes);

	for(it = final_leafs-&gt;begin();it&lt;final_leafs-&gt;end();++it){
		(*it)-&gt;printNode();
	}
}
</code></pre>
<pre><code class="language-cpp">class Quadtree {
public:
/*
* . 
* . 
*/
	bool CompareNodes(const Node&amp; Left, const Node&amp; Right)
	{
	    if (Left.getX() == Right.getX())
	        return Left.getY() &lt; Right.getY();
	    else
	        return Left.getX() &lt; Right.getX();
	}
/*
* . 
* . 
*/

};
</code></pre>
<p>Ergibt den Fehler: error: argument of type 'bool (Quadtree::)(const Node&amp;, const Node&amp;)' does not match 'bool (Quadtree::*)(const Node&amp;, const Node&amp;)'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741513</guid><dc:creator><![CDATA[vittel]]></dc:creator><pubDate>Sun, 12 Jul 2009 14:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 14:12:11 GMT]]></title><description><![CDATA[<p>/* edit - sorry war ein doppelpost */</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741514</guid><dc:creator><![CDATA[vittel]]></dc:creator><pubDate>Sun, 12 Jul 2009 14:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 14:16:22 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Eas geschieht denn dann? Fehlermeldung? Woan siehst du dass er nciht aufgerufen wird? Schon mit dem Debugger durchgegangen? Ohne mehr Infos gibts dazu nicht viel zu sagen. Siehe auch den Thread &quot;<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html" rel="nofollow">Du brauchst Hilfe?</a>&quot;</p>
</blockquote>
<p>Ja, ich setzte einen Breakpoint in meinem operator&lt;. .. der allerdings nie erreicht wurde. Es gibt keine Fehlermeldung aus, allerdings sind die nodes in der liste bei mehrmaligen füllen mit den gleichen nodes immer anders angeordnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741515</guid><dc:creator><![CDATA[vittel]]></dc:creator><pubDate>Sun, 12 Jul 2009 14:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 14:20:27 GMT]]></title><description><![CDATA[<p>vittel schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef std::vector&lt;Node*&gt; NodeVec;
</code></pre>
</blockquote>
<p>Das sagt doch schon alles. Bei <code>Node*</code> wird der <code>operator &lt;</code> für Zeiger genommen.</p>
<p>Verwende die zweite Version von <code>std::sort</code> , wo du einen Funktor übergeben kannst.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741516</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 12 Jul 2009 14:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt; definieren [gelöst] on Sun, 12 Jul 2009 17:15:36 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>vittel schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef std::vector&lt;Node*&gt; NodeVec;
</code></pre>
</blockquote>
<p>Das sagt doch schon alles. Bei <code>Node*</code> wird der <code>operator &lt;</code> für Zeiger genommen.</p>
<p>Verwende die zweite Version von <code>std::sort</code> , wo du einen Funktor übergeben kannst.</p>
<p>Grüssli</p>
</blockquote>
<p>... und es funktioniert! <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>Vielen Dank für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741597</guid><dc:creator><![CDATA[vittel]]></dc:creator><pubDate>Sun, 12 Jul 2009 17:15:36 GMT</pubDate></item></channel></rss>