<?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[Vergleichsprädikat im Konstruktor konkretisieren]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Mein Anliegen ist es eine std::set zu sortieren, indem ich im Konstruktor sozusagen &quot;Sortieroptionen&quot; übergebe. Hier ein kleines Testprogramm, um mein Problem besser beschreiben zu können:</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;iostream&gt;
using namespace std;

// Operator &lt;&lt; für std::set&lt;T&gt; überladen
template &lt;class T&gt;
ostream&amp; operator &lt;&lt; (ostream&amp; os, const set&lt;T&gt;&amp; data) {
    for (set&lt;T&gt;::const_iterator i = data.begin(); i != data.end(); i++)
        os &lt;&lt; *i &lt;&lt; ' ';
    return os &lt;&lt; endl;
}

// Funktor (abgeleitet von less&lt;T&gt;), der zusätzliche Optionen per Konstruktor zulässt
template &lt;class T&gt;
struct opt_less : public less&lt;T&gt; {
    const bool rev;
    opt_less(bool reverse = false) : rev(reverse) {}

    bool operator() (const T&amp; lhs, const T&amp; rhs) const {
        if (!rev) return less&lt;T&gt;::operator() (lhs, rhs);
        else      return less&lt;T&gt;::operator() (rhs, lhs);
    }
};

int main() {
    // int-set mit Zahlen zwischen 1 und 9 füllen
    int ia[] = {4, 2, 7, 8, 1, 5, 9, 6, 3};
    set&lt;int&gt; is(ia, ia + sizeof(ia)/sizeof(ia[0]),
        // Funktionsobjekt mit Option (Ableitung von less)
        opt_less&lt;int&gt;(true));

    cout &lt;&lt; is;
    system(&quot;pause&quot;);
}
</code></pre>
<p>Eigentlich sollte hier</p>
<pre><code>9 8 7 6 5 4 3 2 1
</code></pre>
<p>ausgegeben werden. Allerdings wird immer nur <code>less&lt;T&gt;</code> anstatt <code>opt_less&lt;T&gt;</code> verwendet, und die Ausgabe ist immer</p>
<pre><code>1 2 3 4 5 6 7 8 9
</code></pre>
<p>Weiß jemand, wie ich das bewerkstelligen kann?</p>
<p>P.S. Ich weiß, dass ich einfach <code>set&lt;int, greater&lt;int&gt; &gt;</code> schreiben könnte, aber <code>bool rev</code> ist bei mir nur eine Beispieloption.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270115/vergleichsprädikat-im-konstruktor-konkretisieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 18:56:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270115.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Jul 2010 17:36:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vergleichsprädikat im Konstruktor konkretisieren on Tue, 06 Jul 2010 17:36:34 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Mein Anliegen ist es eine std::set zu sortieren, indem ich im Konstruktor sozusagen &quot;Sortieroptionen&quot; übergebe. Hier ein kleines Testprogramm, um mein Problem besser beschreiben zu können:</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;iostream&gt;
using namespace std;

// Operator &lt;&lt; für std::set&lt;T&gt; überladen
template &lt;class T&gt;
ostream&amp; operator &lt;&lt; (ostream&amp; os, const set&lt;T&gt;&amp; data) {
    for (set&lt;T&gt;::const_iterator i = data.begin(); i != data.end(); i++)
        os &lt;&lt; *i &lt;&lt; ' ';
    return os &lt;&lt; endl;
}

// Funktor (abgeleitet von less&lt;T&gt;), der zusätzliche Optionen per Konstruktor zulässt
template &lt;class T&gt;
struct opt_less : public less&lt;T&gt; {
    const bool rev;
    opt_less(bool reverse = false) : rev(reverse) {}

    bool operator() (const T&amp; lhs, const T&amp; rhs) const {
        if (!rev) return less&lt;T&gt;::operator() (lhs, rhs);
        else      return less&lt;T&gt;::operator() (rhs, lhs);
    }
};

int main() {
    // int-set mit Zahlen zwischen 1 und 9 füllen
    int ia[] = {4, 2, 7, 8, 1, 5, 9, 6, 3};
    set&lt;int&gt; is(ia, ia + sizeof(ia)/sizeof(ia[0]),
        // Funktionsobjekt mit Option (Ableitung von less)
        opt_less&lt;int&gt;(true));

    cout &lt;&lt; is;
    system(&quot;pause&quot;);
}
</code></pre>
<p>Eigentlich sollte hier</p>
<pre><code>9 8 7 6 5 4 3 2 1
</code></pre>
<p>ausgegeben werden. Allerdings wird immer nur <code>less&lt;T&gt;</code> anstatt <code>opt_less&lt;T&gt;</code> verwendet, und die Ausgabe ist immer</p>
<pre><code>1 2 3 4 5 6 7 8 9
</code></pre>
<p>Weiß jemand, wie ich das bewerkstelligen kann?</p>
<p>P.S. Ich weiß, dass ich einfach <code>set&lt;int, greater&lt;int&gt; &gt;</code> schreiben könnte, aber <code>bool rev</code> ist bei mir nur eine Beispieloption.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922373</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 06 Jul 2010 17:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vergleichsprädikat im Konstruktor konkretisieren on Tue, 06 Jul 2010 17:44:13 GMT]]></title><description><![CDATA[<p>Vererbung ist hier eine schlechte Idee. Da als zweites Templateargument des <code>std::set</code> nichts spezifiziert wurde, wird per Default <code>std::less&lt;int&gt;</code> genommen. Da du dein eigenes Prädikat von <code>std::less&lt;int&gt;</code> erbst, wird eine implizite Konvertierung zur Basisklasse vorgenommen, was nicht mal einen Fehler erzeugt.</p>
<p>Lösung: Gleich</p>
<pre><code class="language-cpp">[c]std::set&lt;int, opt_less_aber_mit_besserem_namen&lt;int&gt; &gt; set;
</code></pre>
<p>verwenden und im Konstruktor das richtige Argument übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922375</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Jul 2010 17:44:13 GMT</pubDate></item></channel></rss>