<?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[Gelöst: STL not?]]></title><description><![CDATA[<p>Hallo!<br />
Mein Problem: Ich will das Prädikat, was ich in std::find_if benutze, negieren. Das unäre Prädikat wird durch ein spezielles bind2nd() kreiert, hinter der eine spezielle unary_function steht. Sieht in etwa so aus:</p>
<pre><code class="language-cpp">template &lt;typename Cmp = std::greater_equal&gt;
class widget {
private:

template &lt;typename BinOp&gt;
	class tree_binder2nd : public std::unary_function&lt;typename BinOp::first_argument_type,
												typename BinOp::result_type&gt; {
	private:
		BinOp op;
		typename BinOp::second_argument_type arg2;
	public:
		tree_binder2nd(const BinOp&amp; x, const typename BinOp::second_argument_type&amp; v)
			: op(x), arg2(v) { }

		typename BinOp::result_type operator() (const std::pair&lt;key_t, payload_t&gt;* x) const {
			return op(x-&gt;first, arg2);
		}
	};

	template &lt;typename BinOp, typename T&gt;
	tree_binder2nd&lt;BinOp&gt; bind2nd(const BinOp&amp; op, const T&amp; arg2) const {
		return tree_binder2nd&lt;BinOp&gt;(op, arg2);
	}

	// später, in irgendeiner Memberfunktion

	iterator = std::find_if(container.begin(), container.end(), bind2nd(Cmp(), *iterator)); // wie mach ich das negativ?
};
</code></pre>
<p>Meine Versuche, irgendwas mit std::not1() hin zu biegen, scheiterten. Wie man vielleicht sieht, handelt es sich hierbei um einen Container mit std::pair als Inhalt. Der operator() soll also den umgekehrten Wert zurückliefern. Bloß wie? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260013/gelöst-stl-not</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 15:48:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260013.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jan 2010 17:58:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 20:44:01 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Mein Problem: Ich will das Prädikat, was ich in std::find_if benutze, negieren. Das unäre Prädikat wird durch ein spezielles bind2nd() kreiert, hinter der eine spezielle unary_function steht. Sieht in etwa so aus:</p>
<pre><code class="language-cpp">template &lt;typename Cmp = std::greater_equal&gt;
class widget {
private:

template &lt;typename BinOp&gt;
	class tree_binder2nd : public std::unary_function&lt;typename BinOp::first_argument_type,
												typename BinOp::result_type&gt; {
	private:
		BinOp op;
		typename BinOp::second_argument_type arg2;
	public:
		tree_binder2nd(const BinOp&amp; x, const typename BinOp::second_argument_type&amp; v)
			: op(x), arg2(v) { }

		typename BinOp::result_type operator() (const std::pair&lt;key_t, payload_t&gt;* x) const {
			return op(x-&gt;first, arg2);
		}
	};

	template &lt;typename BinOp, typename T&gt;
	tree_binder2nd&lt;BinOp&gt; bind2nd(const BinOp&amp; op, const T&amp; arg2) const {
		return tree_binder2nd&lt;BinOp&gt;(op, arg2);
	}

	// später, in irgendeiner Memberfunktion

	iterator = std::find_if(container.begin(), container.end(), bind2nd(Cmp(), *iterator)); // wie mach ich das negativ?
};
</code></pre>
<p>Meine Versuche, irgendwas mit std::not1() hin zu biegen, scheiterten. Wie man vielleicht sieht, handelt es sich hierbei um einen Container mit std::pair als Inhalt. Der operator() soll also den umgekehrten Wert zurückliefern. Bloß wie? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847671</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 30 Jan 2010 20:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 18:08:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename Cmp = std::greater_equal&gt;
</code></pre>
<p>greater_equal ist selbst ein template.<br />
Ansonsten sollte not1 schon das richtige tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847675</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 30 Jan 2010 18:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 18:21:10 GMT]]></title><description><![CDATA[<p>Hm... Ein Fehler ist mir schon unterlaufen. Eigentlich müsste es ja so lauten:</p>
<pre><code class="language-cpp">iterator = std::find_if(container.begin(), container.end(), bind2nd(Cmp(), iterator-&gt;first));
</code></pre>
<p>Das kompiliert wunderbar. Sobald ich ein not1() davor setze:</p>
<pre><code class="language-cpp">iterator = std::find_if(container.begin(), container.end(), std::not1(bind2nd(Cmp(), iterator-&gt;first)));
</code></pre>
<p>fängt es an zu hageln:</p>
<pre><code>error C2664: 'bool std::unary_negate&lt;_Fn1&gt;::operator ()(const std::basic_string&lt;_Elem,_Traits,_Ax&gt; &amp;) const': Konvertierung des Parameters 1 von 'std::pair&lt;_Ty1,_Ty2&gt;' in 'const std::basic_string&lt;_Elem,_Traits,_Ax&gt; &amp;' nicht möglich
</code></pre>
<p>Hm...? Ich will einfach nur immer die firsts von pairs in einer std::list mit einem statischen first mittels compare_t vergleichen. Der first-Typ ist hier std::string.</p>
<p>Bzgl. dem Template:<br />
Jap, hab ich nur so lapidar geschrieben, im echten Code ist der Parameter natürlich vorhanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847681</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 30 Jan 2010 18:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 18:58:48 GMT]]></title><description><![CDATA[<p>Was für ein Typ hat denn greater_equal für das erste Argument bei dir?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847693</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 30 Jan 2010 18:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 19:12:08 GMT]]></title><description><![CDATA[<p>std::string</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847698</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 30 Jan 2010 19:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 20:47:58 GMT]]></title><description><![CDATA[<p>Da bin ich jetzt durch einen Gedankenblitz draufgekommen:</p>
<pre><code class="language-cpp">iterator = std::find_if(container.begin(), container.end(), bind2nd(std::not2(Cmp()), iterator-&gt;first)));
</code></pre>
<p>Ich will ja nicht das gesamte Ergebnis negieren, sondern nur das binäre Prädikat zum Vergleichen. *patsch*<br />
Ist C++ eigentlich immer so kompliziert? Oder mache ich was falsch? Das Beispiel hier war noch vereinfacht, eigentlich zeigt der Iterator auf einen Zeiger (noch eine Derefernzierung drauf). Das will ich meinem Info-Lehrer nur ungern antun:</p>
<pre><code class="language-cpp">iter = std::find_if(payload.begin(), payload.end(), bind2nd(std::not2(compare_t()), (*half)-&gt;first));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1847750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847750</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 30 Jan 2010 20:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 20:50:20 GMT]]></title><description><![CDATA[<pre><code>template &lt;typename BinOp&gt;
	class tree_binder2nd : public std::unary_function&lt;[b]typename BinOp::first_argument_type[/b],
												typename BinOp::result_type&gt; {
	private:
		BinOp op;
		typename BinOp::second_argument_type arg2;
	public:
		tree_binder2nd(const BinOp&amp; x, const typename BinOp::second_argument_type&amp; v)
			: op(x), arg2(v) { }

		typename BinOp::result_type operator() ([b]const std::pair&lt;key_t, payload_t&gt;*[/b] x) const {
			return op(x-&gt;first, arg2);
		}
	};
</code></pre>
<p>Hier passt etwas nicht zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847752</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 30 Jan 2010 20:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Gelöst: STL not? on Sat, 30 Jan 2010 21:02:01 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Ist C++ eigentlich immer so kompliziert? Oder mache ich was falsch? Das Beispiel hier war noch vereinfacht, eigentlich zeigt der Iterator auf einen Zeiger (noch eine Derefernzierung drauf). Das will ich meinem Info-Lehrer nur ungern antun:</p>
<pre><code class="language-cpp">iter = std::find_if(payload.begin(), payload.end(), bind2nd(std::not2(compare_t()), (*half)-&gt;first));
</code></pre>
</blockquote>
<p>Eine Alternative wäre:</p>
<pre><code class="language-cpp">iter = std::find_if(payload.begin(), payload.end(), !std::tr1::bind(compare_t(), _1, (*half)-&gt;first));
</code></pre>
<p>Ob das wirklich schöner aussieht, ist wiederum eine andere Frage. Aber das sind halt die Tücken des funktionalen STL-Stils. Wenn der Code auch für weniger Erfahrene leicht verständlich sein soll, schreibst du eben eine Schleife. Oder eine separate Funktion respektive einen Funktor, den du dann direkt an <code>find_if()</code> übergeben kannst:</p>
<pre><code class="language-cpp">iter = std::find_if(payload.begin(), payload.end(), &amp;my_function);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1847756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847756</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 30 Jan 2010 21:02:01 GMT</pubDate></item></channel></rss>