<?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[Probleme mit priority_queue Compare Funktion!]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich arbeite momentan an einer C++ Implementierung des Dijkstra Algorithmus und verwende dazu eine priority_queue.</p>
<p>Die Compare Funktion der queue soll die Nodes absteigend nach der Distanz sortieren (also Knoten mit niedriger Distanz zuerst)</p>
<p>die Knoten Klasse sieht folgendermaßen aus (vereinfacht)</p>
<pre><code>class Node
	{
	private:
		string _name;
		unsigned int _distance;
		Node * _precursor;
		vector&lt;Edge*&gt; _edges;
	public:
		Node();
		Node(string name);

		unsigned int GetDistance() const;
		void SetDistance(unsigned int dist);

		bool less(const Node &amp; other) const
		{
			return ( this-&gt;_distance &lt; other.GetDistance() );
		}
		bool operator&lt; (const Node * other) const
		{
			return ( this-&gt;_distance &lt; other-&gt;GetDistance() );
		}
	};
</code></pre>
<p>Die queue erstelle ich folgendermaßen:</p>
<pre><code>priority_queue&lt; Node*, vector&lt;Node*&gt;, std::less&lt;Node*&gt; &gt; pqueue;
		Node * n = start;

		start-&gt;SetDistance(0);		// Root Distanz ist 0
		start-&gt;SetPrecursor(*start);	// Root Vorgaenger ist Root selbst

		// priority queue fuellen
		for (vector&lt;Node*&gt;::iterator iter = _nodes.begin(); 
			iter != _nodes.end();
			iter++)
		{
			pqueue.push(*iter);
		}
</code></pre>
<p>Leider funktioniert die Sortierung (das Einhalten der Prioritäten) aber überhauptnicht.. die queue wird ??irgendwie?? komisch angeordnet.. ich habe keine Ahnung.. sitze nun schon mehrer Stunden und weiß keine Lösung mehr ich habe schon viele andere Comparer probiert aber immer wieder das gleiche seltsame Ergebniss.</p>
<p>Welche Operatoren muss ich überschreiben und was muss ich bei der queue als Comparer Funktion angeben?</p>
<p>bitte um Hilfe, bin verzweifelt</p>
<p>mfg david</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176291/probleme-mit-priority_queue-compare-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:15:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176291.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Mar 2007 17:59:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit priority_queue Compare Funktion! on Mon, 19 Mar 2007 17:59:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich arbeite momentan an einer C++ Implementierung des Dijkstra Algorithmus und verwende dazu eine priority_queue.</p>
<p>Die Compare Funktion der queue soll die Nodes absteigend nach der Distanz sortieren (also Knoten mit niedriger Distanz zuerst)</p>
<p>die Knoten Klasse sieht folgendermaßen aus (vereinfacht)</p>
<pre><code>class Node
	{
	private:
		string _name;
		unsigned int _distance;
		Node * _precursor;
		vector&lt;Edge*&gt; _edges;
	public:
		Node();
		Node(string name);

		unsigned int GetDistance() const;
		void SetDistance(unsigned int dist);

		bool less(const Node &amp; other) const
		{
			return ( this-&gt;_distance &lt; other.GetDistance() );
		}
		bool operator&lt; (const Node * other) const
		{
			return ( this-&gt;_distance &lt; other-&gt;GetDistance() );
		}
	};
</code></pre>
<p>Die queue erstelle ich folgendermaßen:</p>
<pre><code>priority_queue&lt; Node*, vector&lt;Node*&gt;, std::less&lt;Node*&gt; &gt; pqueue;
		Node * n = start;

		start-&gt;SetDistance(0);		// Root Distanz ist 0
		start-&gt;SetPrecursor(*start);	// Root Vorgaenger ist Root selbst

		// priority queue fuellen
		for (vector&lt;Node*&gt;::iterator iter = _nodes.begin(); 
			iter != _nodes.end();
			iter++)
		{
			pqueue.push(*iter);
		}
</code></pre>
<p>Leider funktioniert die Sortierung (das Einhalten der Prioritäten) aber überhauptnicht.. die queue wird ??irgendwie?? komisch angeordnet.. ich habe keine Ahnung.. sitze nun schon mehrer Stunden und weiß keine Lösung mehr ich habe schon viele andere Comparer probiert aber immer wieder das gleiche seltsame Ergebniss.</p>
<p>Welche Operatoren muss ich überschreiben und was muss ich bei der queue als Comparer Funktion angeben?</p>
<p>bitte um Hilfe, bin verzweifelt</p>
<p>mfg david</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248630</guid><dc:creator><![CDATA[david.leo]]></dc:creator><pubDate>Mon, 19 Mar 2007 17:59:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit priority_queue Compare Funktion! on Tue, 20 Mar 2007 07:17:34 GMT]]></title><description><![CDATA[<p>std::less&lt;Node*&gt; nutzt den op&lt; für zwei Node-Zeiger. Den kannst du nicht überladen (weil nur Build-In's beteiligt sind). Also müsstest du dir einen eigenen Comparator schreiben und mitgeben:</p>
<pre><code class="language-cpp">class Node
{
  ... wie bisher
public:
  ...
  //wichtig - der &quot;normale&quot; op&lt; bekommt seinen zweiten Parameter per Referenz
  //dein op&lt; würde einen Node mit einem Node* vergleichen
  bool operator&lt;(const Node&amp; other) const
  { return distance&lt;other.distance; }
};

struct NodePtr_Compare : public binary_function&lt;bool,Node*,Node*&gt;
{
  bool operator()(const Node* l,const Node* r)
  { return *l&lt;*r; }
};

...
priority_queue&lt;Node*,vector&lt;Node*&gt;,NodePtr_Compare&gt; pqueue;
...
</code></pre>
<p>(PS: Für später solltest du aus dem NodePtr_Compare ein Template machen und es gut aufheben ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248884</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 20 Mar 2007 07:17:34 GMT</pubDate></item></channel></rss>