<?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[binary_negate im Komparator angeben funktioniert nicht]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem (im folgenden vereinfacht dargestellt):</p>
<pre><code class="language-cpp">set&lt;int, less&lt;int&gt; &gt; m;
m.insert(3);
m.insert(4);
m.insert(1);
for (set&lt;int&gt;::iterator iter = m.begin(); iter != m.end(); iter++)
    cout &lt;&lt; *iter &lt;&lt; endl;
</code></pre>
<p>Wenn ich das Progrämmchen so kompiliere und ablaufen lasse, dann bekomme ich ohne Probleme die Zahlen in aufsteigender Reihenfolge.</p>
<p>Wenn ich aber set wie folgt definiere:</p>
<pre><code class="language-cpp">set&lt;int, binary_negate&lt;less&lt;int&gt; &gt; &gt; m;
</code></pre>
<p>dann bekomme ich die folgende Fehlermeldung</p>
<blockquote>
<p>/usr/include/c++/4.1.0/bits/stl_set.h: In constructor ‘std::set&lt;_Key, _Compare, _Alloc&gt;::set() [with _Key = int, _Compare = std::binary_negate&lt;std::greater&lt;int&gt; &gt;, _Alloc = std::allocator&lt;int&gt;]’:<br />
../main.cpp:51: instantiated from here<br />
/usr/include/c++/4.1.0/bits/stl_set.h:155: error: no matching function for call to ‘std::binary_negate&lt;std::greater&lt;int&gt; &gt;::binary_negate()’<br />
/usr/include/c++/4.1.0/bits/stl_function.h:343: note: candidates are: std::binary_negate&lt;_Predicate&gt;::binary_negate(const _Predicate&amp;) [with _Predicate = std::greater&lt;int&gt;]<br />
/usr/include/c++/4.1.0/bits/stl_function.h:338: note: std::binary_negate&lt;std::greater&lt;int&gt; &gt;::binary_negate(const std::binary_negate&lt;std::greater&lt;int&gt; &gt;&amp;)<br />
make: *** [main.o] Fehler 1</p>
</blockquote>
<p>Ich weiß, ich kann greater benutzen, aber ich möchte wissen, wie man das Prädikat an dieser Stelle negieren kann und WARUM meine Version nicht funzt.</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194211/binary_negate-im-komparator-angeben-funktioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 11:32:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194211.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Oct 2007 10:36:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 10:36:59 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem (im folgenden vereinfacht dargestellt):</p>
<pre><code class="language-cpp">set&lt;int, less&lt;int&gt; &gt; m;
m.insert(3);
m.insert(4);
m.insert(1);
for (set&lt;int&gt;::iterator iter = m.begin(); iter != m.end(); iter++)
    cout &lt;&lt; *iter &lt;&lt; endl;
</code></pre>
<p>Wenn ich das Progrämmchen so kompiliere und ablaufen lasse, dann bekomme ich ohne Probleme die Zahlen in aufsteigender Reihenfolge.</p>
<p>Wenn ich aber set wie folgt definiere:</p>
<pre><code class="language-cpp">set&lt;int, binary_negate&lt;less&lt;int&gt; &gt; &gt; m;
</code></pre>
<p>dann bekomme ich die folgende Fehlermeldung</p>
<blockquote>
<p>/usr/include/c++/4.1.0/bits/stl_set.h: In constructor ‘std::set&lt;_Key, _Compare, _Alloc&gt;::set() [with _Key = int, _Compare = std::binary_negate&lt;std::greater&lt;int&gt; &gt;, _Alloc = std::allocator&lt;int&gt;]’:<br />
../main.cpp:51: instantiated from here<br />
/usr/include/c++/4.1.0/bits/stl_set.h:155: error: no matching function for call to ‘std::binary_negate&lt;std::greater&lt;int&gt; &gt;::binary_negate()’<br />
/usr/include/c++/4.1.0/bits/stl_function.h:343: note: candidates are: std::binary_negate&lt;_Predicate&gt;::binary_negate(const _Predicate&amp;) [with _Predicate = std::greater&lt;int&gt;]<br />
/usr/include/c++/4.1.0/bits/stl_function.h:338: note: std::binary_negate&lt;std::greater&lt;int&gt; &gt;::binary_negate(const std::binary_negate&lt;std::greater&lt;int&gt; &gt;&amp;)<br />
make: *** [main.o] Fehler 1</p>
</blockquote>
<p>Ich weiß, ich kann greater benutzen, aber ich möchte wissen, wie man das Prädikat an dieser Stelle negieren kann und WARUM meine Version nicht funzt.</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377720</guid><dc:creator><![CDATA[gh0st124]]></dc:creator><pubDate>Thu, 04 Oct 2007 10:36:59 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 10:46:00 GMT]]></title><description><![CDATA[<p>Erstens: Die Negation von less&lt;&gt; ist kein legaler Vergleichsoperator für set's (&gt;= ist keine strikte Ordnung)</p>
<p>Zweitens: set&lt;int,less&lt;int&gt;&gt;::iterator und set&lt;int,greater&lt;int&gt;&gt;::iterator sind zwei völlig verschiedene Typen - und nicht ineinander umwandelbar - du mußt schon in der for()-Schleife den Iterator-Typ deiner set&lt;&gt; verwenden.<br />
(im angegebenen Beispiel klappt's zufälligerweise, weil less&lt;T&gt; der Defaultwert für den Komparator ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377728</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 Oct 2007 10:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 10:46:37 GMT]]></title><description><![CDATA[<p>Kommentier mal die For-Schleife aus und nachdem es dann kompiliert schau dir nochmal genau an was für einen Iteratortyp du für iter angegeben hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377729</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Thu, 04 Oct 2007 10:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 11:11:29 GMT]]></title><description><![CDATA[<p>Es kommt noch dazu dass binary_negate keinen Konstruktor mit Null Parametern hat. Und da der Konstruktor von set&lt; T, Comp &gt; als Default für den ersten Parameter nunmal Comp() hat, klappt das nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377745</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 04 Oct 2007 11:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 22:11:27 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.</p>
<p>Der Hauptgrund ist also</p>
<p>binary_negate erfüllt in Kombination mit less (also <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f606.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_squinting_face"
      title="&gt;=)"
      alt="😆"
    /> die Strict Weak Ordering nicht, weil z.B. reflexiv.<br />
---<br />
das stimmt nicht ganz-&gt; s.nächsten Beitrag</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378222</guid><dc:creator><![CDATA[gh0st124]]></dc:creator><pubDate>Thu, 04 Oct 2007 22:11:27 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 22:10:28 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Erstens: Die Negation von less&lt;&gt; ist kein legaler Vergleichsoperator für set's (&gt;= ist keine strikte Ordnung).</p>
</blockquote>
<p>Ich habe jetzt folgendes ausprobiert: ich habe den Funktor greater_equal (keine strikte Ordnung) benutzt und alles funktioniert wunderbar. Anscheinend hat das nichts damit zu tun.</p>
<p>LordJaxom Argument gefällt mir da schon besser: binary_negate hat keinen Default-Konstruktor und Comp() findet diesen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378224</guid><dc:creator><![CDATA[gh0st124]]></dc:creator><pubDate>Thu, 04 Oct 2007 22:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Thu, 04 Oct 2007 22:15:34 GMT]]></title><description><![CDATA[<p>gh0st124 schrieb:</p>
<blockquote>
<p>Ich habe jetzt folgendes ausprobiert: ich habe den Funktor greater_equal (keine strikte Ordnung) benutzt und alles funktioniert wunderbar.</p>
</blockquote>
<p>Dann versuch mal ein Element wiederzufinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378225</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 04 Oct 2007 22:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Fri, 05 Oct 2007 05:40:42 GMT]]></title><description><![CDATA[<p>gh0st124 schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Erstens: Die Negation von less&lt;&gt; ist kein legaler Vergleichsoperator für set's (&gt;= ist keine strikte Ordnung).</p>
</blockquote>
<p>Ich habe jetzt folgendes ausprobiert: ich habe den Funktor greater_equal (keine strikte Ordnung) benutzt und alles funktioniert wunderbar. Anscheinend hat das nichts damit zu tun.</p>
</blockquote>
<p>Der Compiler kann leider nicht überprüfen, ob dein Prädikat die Anforderungen erfült, eine &quot;strict weak ordering&quot; zu sein - der würde auch ein set&lt;int,equal&lt;int&gt;&gt; durchgehen lassen. Das Problem dabei ist, daß du mit einem ungeeigneten Vergleichskriterium nichts mehr findest (set&lt;T,Pred&gt; definiert &quot;gleich&quot; als <code>!Pred(x,key)&amp;&amp;!Pred(key,x)</code> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378260</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 05 Oct 2007 05:40:42 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Fri, 05 Oct 2007 10:12:53 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>gh0st124 schrieb:</p>
<blockquote>
<p>Ich habe jetzt folgendes ausprobiert: ich habe den Funktor greater_equal (keine strikte Ordnung) benutzt und alles funktioniert wunderbar.</p>
</blockquote>
<p>Dann versuch mal ein Element wiederzufinden.</p>
</blockquote>
<p>klappt ohne Probleme:</p>
<pre><code class="language-cpp">set&lt;int, greater_equal&lt;int&gt; &gt; m;
    m.insert(3);
    m.insert(4);
    m.insert(1);
    m.insert(1);
    m.insert(5);
    set&lt;int, greater_equal&lt;int&gt; &gt;::iterator f = find(m.begin(), m.end(), 1);
    if (f != m.end())
        cout &lt;&lt; *f &lt;&lt; &quot; gefunden!\n&quot;;
    for (set&lt;int, greater_equal&lt;int&gt; &gt;::iterator iter = m.begin(); iter != m.end(); iter++)
        cout &lt;&lt; *iter &lt;&lt; endl;
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>1 gefunden!<br />
5<br />
4<br />
3<br />
1<br />
1</p>
</blockquote>
<p>WARUM muss es denn unbedingt eine Strict weak ordering sein? Wann geht es denn bei greater_equal(&lt;- Keine Strict Weak Ordering) schief?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378458</guid><dc:creator><![CDATA[gh0st124]]></dc:creator><pubDate>Fri, 05 Oct 2007 10:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Fri, 05 Oct 2007 10:19:38 GMT]]></title><description><![CDATA[<p>versuch mal das hier:</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;cmath&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
#include &lt;ctime&gt;
#include &lt;iostream&gt;
using namespace std;

int main()
{
    srand( time( 0 ) );

    typedef set&lt;int, greater_equal&lt;int&gt; &gt; set_type;

    set_type s;

    for ( int i = 0; i &lt; 5000; ++i )
        s.insert( rand() );

    int count = 0;

    for ( set_type::iterator i = s.begin(); i != s.end(); ++i )
        if ( s.count( *i ) == 1
            &amp;&amp; s.find( *i ) == i
            &amp;&amp; s.lower_bound( *i ) == i
            &amp;&amp; distance( i, s.upper_bound( *i ) ) == 1 )
            ++count;

    cout &lt;&lt; count &lt;&lt; &quot; von &quot; &lt;&lt; s.size() &lt;&lt; &quot; richtig gefunden\n&quot;;
}
</code></pre>
<p>bei mir steigt das im debug Modus mit einem assert aus, ohne dieses geht es ab in die ewigen Jagdgründe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378464</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 05 Oct 2007 10:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Fri, 05 Oct 2007 10:23:57 GMT]]></title><description><![CDATA[<p>Die set&lt;&gt; verwaltet ihre Elemente in einem (balancierten) binären Suchbaum - alle Elemente links sind &quot;kleiner&quot;, alle Elemente rechts &quot;größer&quot; als das Wurzelelement (&quot;kleiner&quot; und &quot;größer&quot; wird durch das verwendete Prädikat definiert). Gleichheit zwischen Elementen gilt, wenn keins von beiden &quot;kleiner&quot; ist als das andere.</p>
<p>Bei einer strikten Ordnung R gilt für zwei beliebige Werte x und y grundsätzlich eine der Beziehungen &quot;x R y&quot;, &quot;y R x&quot; oder &quot;x =<sub>R</sub> y&quot;, auf dieser Voraussetzung arbeitet set&lt;&gt;. Bei einer Halbordnung gilt das nicht mehr - was unter Umständen zu Problemen führen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378470</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 05 Oct 2007 10:23:57 GMT</pubDate></item><item><title><![CDATA[Reply to binary_negate im Komparator angeben funktioniert nicht on Sat, 06 Oct 2007 12:49:22 GMT]]></title><description><![CDATA[<p>gh0st124 schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>gh0st124 schrieb:</p>
<blockquote>
<p>Ich habe jetzt folgendes ausprobiert: ich habe den Funktor greater_equal (keine strikte Ordnung) benutzt und alles funktioniert wunderbar.</p>
</blockquote>
<p>Dann versuch mal ein Element wiederzufinden.</p>
</blockquote>
<p>klappt ohne Probleme:</p>
<pre><code class="language-cpp">set&lt;int, greater_equal&lt;int&gt; &gt; m;
    m.insert(3);
    m.insert(4);
    m.insert(1);
    m.insert(1);
    m.insert(5);
    set&lt;int, greater_equal&lt;int&gt; &gt;::iterator f = find(m.begin(), m.end(), 1);
    if (f != m.end())
        cout &lt;&lt; *f &lt;&lt; &quot; gefunden!\n&quot;;
    for (set&lt;int, greater_equal&lt;int&gt; &gt;::iterator iter = m.begin(); iter != m.end(); iter++)
        cout &lt;&lt; *iter &lt;&lt; endl;
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>1 gefunden!<br />
5<br />
4<br />
3<br />
1<br />
1</p>
</blockquote>
<p>WARUM muss es denn unbedingt eine Strict weak ordering sein? Wann geht es denn bei greater_equal(&lt;- Keine Strict Weak Ordering) schief?</p>
</blockquote>
<p>Du siehst an der Ausgabe schon dass es nicht funktioniert. Würde es funktionieren dürfte die 1 nur 1x vorkommen - ist ja schliesslich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379117</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 06 Oct 2007 12:49:22 GMT</pubDate></item></channel></rss>