<?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[set aus struct - wie sortiert man nach einem structelement?]]></title><description><![CDATA[<p>Es existiert ein set aus structs:</p>
<pre><code class="language-cpp">struct SetElem{
float Elem1;
int Elem2;
int Elem3;
}

std::set&lt; SetElem &gt; MySet;
</code></pre>
<p>Wenn das set jetzt gefüllt wird (Myset.insert(...)), wie kann ich das Set nach einem der drei Elemente ordnen lassen?</p>
<p>Ideen wären fett!</p>
<p>ANGS_Pino</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231993/set-aus-struct-wie-sortiert-man-nach-einem-structelement</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 11:08:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231993.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Jan 2009 10:45:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Sun, 18 Jan 2009 10:45:52 GMT]]></title><description><![CDATA[<p>Es existiert ein set aus structs:</p>
<pre><code class="language-cpp">struct SetElem{
float Elem1;
int Elem2;
int Elem3;
}

std::set&lt; SetElem &gt; MySet;
</code></pre>
<p>Wenn das set jetzt gefüllt wird (Myset.insert(...)), wie kann ich das Set nach einem der drei Elemente ordnen lassen?</p>
<p>Ideen wären fett!</p>
<p>ANGS_Pino</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1647534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1647534</guid><dc:creator><![CDATA[ANGs_Pino]]></dc:creator><pubDate>Sun, 18 Jan 2009 10:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Sun, 18 Jan 2009 11:53:54 GMT]]></title><description><![CDATA[<p>du musst dir eine funktions chreiben die diese structs sortieren kann<br />
und die übergibts du an die sort funktion (ist set nicht das was automatisch sortiert? wenn jad ann musst du die funktion an das set übergeben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1647571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1647571</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 18 Jan 2009 11:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Sun, 18 Jan 2009 12:02:35 GMT]]></title><description><![CDATA[<p>Bei einem std::set kannst Du im 2. Templateparameter ein Vergleichsobjekt angeben, nach dem das set dann sortiert wird.</p>
<p>Das Vergleichsobjekt muß als Rückgabetyp einen bool liefern und 2 Argumente des zu vergleichenden Objektes akzeptieren.</p>
<p>Der Aufbau eines solchen Vergleichsobjektes (auch als Prädikat,Funktionsobjekt oder Functor bezeichnet) sieht im allgemeinen so aus:</p>
<pre><code class="language-cpp">class meinVergleich: public std::binary_function&lt;meinTyp, meinTyp, bool&gt;
{
   bool operator() (const meinTyp&amp; left, const meinTyp&amp; right) const;
};

bool meinVergleich::operator() (const meinTyp&amp; left, const meinTyp&amp; right) const
{
// hier findet der selbstdefinierte Vergleich statt
};
</code></pre>
<p>Das Ableiten von der Basisklasse 'binary_function' ist nicht unbedingt notwendig. In dieser Basisklasse werden den Datentypen der Argumente und Rückgabewerte standardisierte Namen gegeben, was später die Verwendung von Bindern ermöglicht. Die Klasse 'binary_function' ist in der Header-Datei 'functional' definiert.</p>
<p>die Deklaration des Set erfolgt dann folgendermaßen:</p>
<pre><code class="language-cpp">std::set&lt;meinTyp, meinVergleich&gt; meinSet
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1647577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1647577</guid><dc:creator><![CDATA[mario_69_]]></dc:creator><pubDate>Sun, 18 Jan 2009 12:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Sun, 18 Jan 2009 17:35:41 GMT]]></title><description><![CDATA[<p>Du kannst auch eine Funktion als Prädikat nutzen. Kürzlich gab es zu diesem Thema einen Thread, siehe <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-231822.html" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1647816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1647816</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Jan 2009 17:35:41 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Mon, 19 Jan 2009 10:24:14 GMT]]></title><description><![CDATA[<p>Man könnte auch einfach operator&lt; für die struct überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1648092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1648092</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 19 Jan 2009 10:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Mon, 19 Jan 2009 13:57:43 GMT]]></title><description><![CDATA[<p>kleines Beispiel wie man die Vergleiche mittels struct-member generisch implementieren kann:</p>
<pre><code class="language-cpp">template &lt;class T, class M, class Compare = std::less&lt;M&gt; &gt;
struct MemCompare
{
  typedef typename M T::*MemPtr;

  MemCompare(MemPtr const memPtr, Compare cmp = Compare()) : comp(cmp), mem(memPtr) {}

  bool operator()(T const&amp; lhs, T const&amp; rhs) { return comp(lhs.*mem, rhs.*mem); }

private:
  Compare comp;
  MemPtr mem;
};

template &lt;class T, class M, class Compare&gt;
MemCompare&lt;T,M,Compare&gt; memCompare(M T::* memptr, Compare cmp)
{
  return MemCompare&lt;T,M,Compare&gt;(memptr, cmp);
}

template &lt;class T, class M&gt;
MemCompare&lt;T,M&gt; memCompare(M T::* memptr)
{
  return MemCompare&lt;T,M&gt;(memptr);
}

//Benutzungsbeispiel:

struct A
{
   A(int i) : t(i) {}
public:
   int t;
   float u;
   char v;
};

int main()
{
  std::set&lt;A, MemCompare&lt;A,int&gt; &gt; mySet(memCompare(&amp;A::t));
  mySet.insert(A(5));
  mySet.insert(A(1));
  mySet.insert(A(22));

  for (std::set&lt;A, MemCompare&lt;A,int&gt; &gt;::iterator it = mySet.begin(); it != mySet.end(); ++it)
     std::cout &lt;&lt; it-&gt;t &lt;&lt; &quot; &quot;;
  std::cout &lt;&lt; std::endl;
}
</code></pre>
<p>(Vermutlich etwas Overkill für die Situation, man kanns aber immer wieder mal gebrauchen)</p>
<p>Braunstein: Operator&lt; für die structs zu überladen ist nur dann sinnvoll wenn das dann eine verständliche Ordnungsrelation ergibt. Den Operator zu überladen nur damit std::set automatisch einen Comparator hat ist nicht der richtige Weg (siehe den Artikel zur Operatprüberladung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1648225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1648225</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 19 Jan 2009 13:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Mon, 19 Jan 2009 14:10:57 GMT]]></title><description><![CDATA[<p>Wenn es keine verständliche Ordnungsrelation gibt ist, meiner Meinung nach, auch eine Einordnung in ein set nicht sinnvoll, da die Existenz einer solchen hier erforderlich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1648234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1648234</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 19 Jan 2009 14:10:57 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Mon, 19 Jan 2009 16:57:24 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Wenn es keine verständliche Ordnungsrelation gibt ist, meiner Meinung nach, auch eine Einordnung in ein set nicht sinnvoll, da die Existenz einer solchen hier erforderlich ist.</p>
</blockquote>
<p>Es gibt auch Fälle, wo man eine Sortierung haben möchte, aber <code>operator&lt;</code> dafür nicht intuitiv scheint.</p>
<p>Einfaches Beispiel: Klasse, die nach mehreren Kriterien sortiert werden kann. Oder halt Klassen, bei denen man nur durch Raten auf die Bedeutung der Kleiner-Relation kommt (z.B. 2D-Vektoren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1648351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1648351</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 19 Jan 2009 16:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to set aus struct - wie sortiert man nach einem structelement? on Mon, 19 Jan 2009 17:58:36 GMT]]></title><description><![CDATA[<p>Wenn mehrere mögliche Ordnungsrelationen bestehen, oder besser, verwendet werden sollen, macht eine Überladung des Operator&lt; natürlich keinen Sinn mehr.<br />
Wenn nicht, sehe ich es immernoch als sinnvoll an den zu überladen.<br />
Ich schätze mal das ist Ansichtssache. <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/1648383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1648383</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 19 Jan 2009 17:58:36 GMT</pubDate></item></channel></rss>