<?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[boost lambda und set]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Ich will eine <code>std::set&lt;ptr&gt;</code> nicht nach Speicheradressen, sondern nach Werten sortieren. Mein Ansatz sieht so aus, dass ich mit Boost.Lambda ein Funktionsobjekt erstelle, das den Inhalt der Zeiger vor dem Vergleich dereferenziert.<br />
Mein Ansatz dafür sieht so aus:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;set&gt;
#include &lt;boost/lambda/lambda.hpp&gt;
using namespace std;
using namespace boost::lambda;

typedef tr1::shared_ptr&lt; int &gt; ptr;

int main() {
    // std::set soll nach den Werten und nicht nach den Adressen sortiert werden
    // Fehlermeldung: error C2974: &quot;std::set&quot;: Ungültiges template-Argument für &quot;_Pr&quot;, Typ erwartet.
    set&lt; ptr, (*_1 &lt; *_2) &gt; s;

    s.insert(ptr(new int (3)));
    s.insert(ptr(new int (6)));
    s.insert(ptr(new int (1)));
    s.insert(ptr(new int (4)));
    s.insert(ptr(new int (8)));
    s.insert(ptr(new int (7)));
    s.insert(ptr(new int (2)));
    s.insert(ptr(new int (5)));

    // erwünschte Ausgabe: 12345678
    for_each(s.begin(), s.end(), cout &lt;&lt; *_1);
    cout &lt;&lt; endl;
}
</code></pre>
<p>Sieht jemand den Fehler?<br />
Erzeugt <code>(*_1 &lt; *_2)</code> etwa kein Funktionsobjekt?</p>
<p>MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264631/boost-lambda-und-set</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 09:36:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264631.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Apr 2010 11:15:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost lambda und set on Sat, 10 Apr 2010 11:15:13 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Ich will eine <code>std::set&lt;ptr&gt;</code> nicht nach Speicheradressen, sondern nach Werten sortieren. Mein Ansatz sieht so aus, dass ich mit Boost.Lambda ein Funktionsobjekt erstelle, das den Inhalt der Zeiger vor dem Vergleich dereferenziert.<br />
Mein Ansatz dafür sieht so aus:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;set&gt;
#include &lt;boost/lambda/lambda.hpp&gt;
using namespace std;
using namespace boost::lambda;

typedef tr1::shared_ptr&lt; int &gt; ptr;

int main() {
    // std::set soll nach den Werten und nicht nach den Adressen sortiert werden
    // Fehlermeldung: error C2974: &quot;std::set&quot;: Ungültiges template-Argument für &quot;_Pr&quot;, Typ erwartet.
    set&lt; ptr, (*_1 &lt; *_2) &gt; s;

    s.insert(ptr(new int (3)));
    s.insert(ptr(new int (6)));
    s.insert(ptr(new int (1)));
    s.insert(ptr(new int (4)));
    s.insert(ptr(new int (8)));
    s.insert(ptr(new int (7)));
    s.insert(ptr(new int (2)));
    s.insert(ptr(new int (5)));

    // erwünschte Ausgabe: 12345678
    for_each(s.begin(), s.end(), cout &lt;&lt; *_1);
    cout &lt;&lt; endl;
}
</code></pre>
<p>Sieht jemand den Fehler?<br />
Erzeugt <code>(*_1 &lt; *_2)</code> etwa kein Funktionsobjekt?</p>
<p>MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880463</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Apr 2010 11:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to boost lambda und set on Sat, 10 Apr 2010 11:22:07 GMT]]></title><description><![CDATA[<p>Das Problem hier ist, dass (*_1 &lt; *_2) ein Ausdruck ist, welches ein Funktionsobjekt liefert. Es ist kein Typ. Hier kannst Du Boost-Lambdas generell nicht einsetzen, weil der Typ eines Boost-Lambda-objekts sehr umständlich aufzuschreiben ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880466</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 10 Apr 2010 11:22:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost lambda und set on Sat, 10 Apr 2010 11:30:55 GMT]]></title><description><![CDATA[<p>funktioniert dass dann irgendwie mit Boost.Bind?<br />
Wie würdest du das denn machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880471</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Apr 2010 11:30:55 GMT</pubDate></item><item><title><![CDATA[Reply to boost lambda und set on Sat, 10 Apr 2010 11:49:16 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>funktioniert dass dann irgendwie mit Boost.Bind?<br />
Wie würdest du das denn machen?</p>
</blockquote>
<p>boost bind liefert ebenfalls einen ausdruck. du brauchst einen typen.<br />
Ich wuerde nen einfachen functor schreiben... und dann ein typedef oder template typedef auf das set machen:</p>
<pre><code class="language-cpp">//functor
struct deref_less_than {
  template&lt;typename T&gt;
  bool operator(T const&amp; a, T const&amp; b) {
    return *a &lt; *b;
  }
};

//template typedef auf das set
template&lt;typename T&gt;
struct ptr_set {
  typedef std::set&lt;T, deref_less_than&gt; type;
};

//verwendung
int main() {
    ptr_set&lt;ptr&gt;::type s;

    s.insert(ptr(new int (3)));
    s.insert(ptr(new int (6)));
    s.insert(ptr(new int (1)));
    s.insert(ptr(new int (4)));
    s.insert(ptr(new int (8)));
    s.insert(ptr(new int (7)));
    s.insert(ptr(new int (2)));
    s.insert(ptr(new int (5)));

    // erwünschte Ausgabe: 12345678
    for_each(s.begin(), s.end(), cout &lt;&lt; *_1);
    cout &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1880479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880479</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 10 Apr 2010 11:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to boost lambda und set on Wed, 26 May 2010 22:10:37 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ich wuerde nen einfachen functor schreiben... (...)</p>
<pre><code class="language-cpp">//functor
struct deref_less_than {
  template&lt;typename T&gt;
  bool operator(T const&amp; a, T const&amp; b) {
    return *a &lt; *b;
  }
};
</code></pre>
</blockquote>
<p>Gibt es da vielleicht schon was von Boost oder einer anderen LIB?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1902985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1902985</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 26 May 2010 22:10:37 GMT</pubDate></item><item><title><![CDATA[Reply to boost lambda und set on Thu, 27 May 2010 05:08:01 GMT]]></title><description><![CDATA[<p>Wenn Du es unbedingt mit 'nem Boost-Funktor machen willst, kannst Du es über ein Funktionstemplate lösen:</p>
<pre><code class="language-cpp">template&lt;class Functor&gt;
void mein_hauptprogramm(Functor fun)
{
  set&lt;ptr,Functor&gt; menge (fun);
  ...
}

int main()
{
  mein_hauptprogramm( *_1&lt;*_2 );
}
</code></pre>
<p>oder über C++0x-Erweiterungen:</p>
<pre><code class="language-cpp">int main() {
  auto functor = *_1 &lt; *_2;
  set&lt;ptr,decltype(functor)&gt; menge (functor);
  ...
}
</code></pre>
<p>Das erste wäre für mich allerdings keine Alternative.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903018</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 27 May 2010 05:08:01 GMT</pubDate></item></channel></rss>