<?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[Frage zur Programmlogik (sort)]]></title><description><![CDATA[<p>Hallo, kurze Frage zur richtigen Verwendung von sort (aus &lt;algorithm&gt; ). Ich habe einen std::vector mit objekten, die jeweils eine eigenschaft namens id haben. Das ist ein unsigned int, das die werte 1 bis 9 annehmen kann. Jetzt soll der vector so sortiert werden, dass am anfang alle objekte stehen, deren id 3 oder 8 ist. Danach sollen alle anderen ids kommen. Wie genau sortiert wird ist egal. Mein Ansatz ist folgender</p>
<pre><code class="language-cpp">bool sort_pred(const foo&amp; bar1, const foo&amp; bar2)
{
    //beide objekte haben id 3 oder 8
    if( (bar1.id==3 || bar1.id==8) &amp;&amp; (bar2.id==3 || bar2.id==8) ) return false;
    //nur das rechte objekt hat id 3 oder 8
    if( (bar1.id!=3 &amp;&amp; bar1.id!=8) &amp;&amp; (bar2.id==3 || bar2.id==8) ) return false; 
    //nur das linke objekt hat id 3 oder 8
    if( (bar1.id==3 || bar1.id==8) &amp;&amp; (bar2.id!=3 &amp;&amp; bar2.id!=8) ) return true;
    //kein objekt hat id 3 oder 8
    return false;
}

sort(vec.begin(), vec.end(), sort_pred);
</code></pre>
<p>Stimmt das so? Kann es im Moment nicht testen. Gibt es vielleicht eine einfachere/bessere Lösung für dieses Problem?</p>
<p>Schonmal Danke für alle Ideen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245162/frage-zur-programmlogik-sort</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 00:18:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245162.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jul 2009 13:01:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Programmlogik (sort) on Fri, 10 Jul 2009 13:01:27 GMT]]></title><description><![CDATA[<p>Hallo, kurze Frage zur richtigen Verwendung von sort (aus &lt;algorithm&gt; ). Ich habe einen std::vector mit objekten, die jeweils eine eigenschaft namens id haben. Das ist ein unsigned int, das die werte 1 bis 9 annehmen kann. Jetzt soll der vector so sortiert werden, dass am anfang alle objekte stehen, deren id 3 oder 8 ist. Danach sollen alle anderen ids kommen. Wie genau sortiert wird ist egal. Mein Ansatz ist folgender</p>
<pre><code class="language-cpp">bool sort_pred(const foo&amp; bar1, const foo&amp; bar2)
{
    //beide objekte haben id 3 oder 8
    if( (bar1.id==3 || bar1.id==8) &amp;&amp; (bar2.id==3 || bar2.id==8) ) return false;
    //nur das rechte objekt hat id 3 oder 8
    if( (bar1.id!=3 &amp;&amp; bar1.id!=8) &amp;&amp; (bar2.id==3 || bar2.id==8) ) return false; 
    //nur das linke objekt hat id 3 oder 8
    if( (bar1.id==3 || bar1.id==8) &amp;&amp; (bar2.id!=3 &amp;&amp; bar2.id!=8) ) return true;
    //kein objekt hat id 3 oder 8
    return false;
}

sort(vec.begin(), vec.end(), sort_pred);
</code></pre>
<p>Stimmt das so? Kann es im Moment nicht testen. Gibt es vielleicht eine einfachere/bessere Lösung für dieses Problem?</p>
<p>Schonmal Danke für alle Ideen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740401</guid><dc:creator><![CDATA[LogikUnzo]]></dc:creator><pubDate>Fri, 10 Jul 2009 13:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Programmlogik (sort) on Fri, 10 Jul 2009 13:06:49 GMT]]></title><description><![CDATA[<p>Stimmt so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740407</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 10 Jul 2009 13:06:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Programmlogik (sort) on Fri, 10 Jul 2009 13:20:54 GMT]]></title><description><![CDATA[<p>viel einfacher:</p>
<pre><code class="language-cpp">bool sort_pred(const foo&amp; bar1, const foo&amp; bar2)
{
    if( (bar1.id==3 || bar1.id==8) )
      return true;
    if( (bar2.id==3 || bar2.id==8) )
      return false;

    return false;
}
</code></pre>
<p>da es ja egal ist, wie genau sortiert wird, sollte das auch gehen...<br />
falls du kommutativität brauchst, geht auch dein code nicht... müsstest du nur das letzte false durch <a href="http://bar1.id" rel="nofollow">bar1.id</a> &lt; <a href="http://bar2.id" rel="nofollow">bar2.id</a> ersetzen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740416</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 10 Jul 2009 13:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Programmlogik (sort) on Fri, 10 Jul 2009 13:46:28 GMT]]></title><description><![CDATA[<p>Mein Vorschlag:</p>
<pre><code class="language-cpp">int func38( int i )
{
    switch( i )
    {
    case 3:
    case 8:
        return 0;
    }
    return 1;
}
bool sort_pred( const foo&amp; bar1, const foo&amp; bar2 )
{
    return func38( bar1.id ) &lt; func38( bar2.id );
}
</code></pre>
<p>Die Variante von unskilled könnte auch in einer Endlos-Schleife enden, abhängig von der Implementierung des sort-Algorithmus. Z.B. wenn alle ids 3 oder 8 sind und intern BubbleSort verwendet wird (i.A. wenn die Anzahl der Elemente sehr klein ist).<br />
Lt. Standard müssen die Elemente '<a href="http://de.wikipedia.org/wiki/Strenge_schwache_Ordnung" rel="nofollow">strict weak ordered</a>' sein:</p>
<blockquote>
<p>For the algorithms to work correctly,<br />
comp has to induce a strict weak ordering on the values.</p>
</blockquote>
<p>Das erfüllt die Variante nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1740436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1740436</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 10 Jul 2009 13:46:28 GMT</pubDate></item></channel></rss>