<?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[Unterschiede zweier std::vectoren in weiterem vector anfügen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Problem: Ich habe zwei vectoren v1 und v2. Nun sollen alle Items, die in v2 vorhanden und in v1 nicht vorhanden sind, in einen weiteren vector kopiert werden (bzw. würden nur die Referenzen/Indizes reichen).<br />
Die beiden vectoren sind sortiert.<br />
Ich würde das jetzt schnell mit einer kleinen Hilfsfunktion machen, versuche mich aber gerade auch weiter in die Standardbibliothek einzuarbeiten. Daher die Frage, ob diese entsprechendes bereit stellt.</p>
<p>Achja, die Einträge sind Klassen, die einen operator==(const T&amp;) anbieten.</p>
<p>Ideen, Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307217/unterschiede-zweier-std-vectoren-in-weiterem-vector-anfügen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 18:04:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307217.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Aug 2012 11:49:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 11:49:47 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes Problem: Ich habe zwei vectoren v1 und v2. Nun sollen alle Items, die in v2 vorhanden und in v1 nicht vorhanden sind, in einen weiteren vector kopiert werden (bzw. würden nur die Referenzen/Indizes reichen).<br />
Die beiden vectoren sind sortiert.<br />
Ich würde das jetzt schnell mit einer kleinen Hilfsfunktion machen, versuche mich aber gerade auch weiter in die Standardbibliothek einzuarbeiten. Daher die Frage, ob diese entsprechendes bereit stellt.</p>
<p>Achja, die Einträge sind Klassen, die einen operator==(const T&amp;) anbieten.</p>
<p>Ideen, Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243614</guid><dc:creator><![CDATA[comparor]]></dc:creator><pubDate>Mon, 20 Aug 2012 11:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 11:55:27 GMT]]></title><description><![CDATA[<p><a href="http://en.cppreference.com/w/cpp/algorithm/set_difference" rel="nofollow">http://en.cppreference.com/w/cpp/algorithm/set_difference</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243616</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 20 Aug 2012 11:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 12:11:35 GMT]]></title><description><![CDATA[<p>So vielleicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;
using namespace std;

int main()
{
	int ar1[] = {0,1,4,8,9};
	vector&lt;int&gt; v1(ar1,ar1+5);

	int ar2[] = {0,1,2,3,4,5,6,7,8,9};
	vector&lt;int&gt; v2(ar2,ar2+10);

	vector&lt;vector&lt;int&gt;::iterator&gt; iters;
	for(vector&lt;int&gt;::iterator it=v2.begin(); it!=v2.end(); ++it)
	{
		vector&lt;int&gt;::iterator found = find(v1.begin(),v1.end(),*it);

		if( found==v1.end() )
			iters.push_back(it);
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2243626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243626</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 20 Aug 2012 12:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 12:12:58 GMT]]></title><description><![CDATA[<p>Ah, da hat schon jemand eine bessere und schnellere Antwort geliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243628</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 20 Aug 2012 12:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 12:36:01 GMT]]></title><description><![CDATA[<p>Danke schon mal für die Antworten. set_difference hatte ich bislang noch nicht verwendet, hier ein erster Versuch:</p>
<pre><code class="language-cpp">struct T
{
	int i;
	T(int i) : i(i) {}
	bool operator==(const T&amp; t) const {return i==t.i;}
};
bool operator!=(const T&amp; t1, const T&amp; t2)
{
	return !(t1.operator==(t2));
}

int main()
{
	vector&lt;T&gt; v1;
	vector&lt;T&gt; v2;
	for(int i=0;i&lt;40;++i)
	{
		v2.push_back(i);	
		if(i&amp;1)
			v1.push_back(i);
	}
	vector&lt;T&gt; out;
	std::set_difference(v2.begin(),v2.end(),
		v1.begin(),v1.end(),
		std::back_inserter&lt;std::vector&lt;T&gt; &gt;(out),
		std::not_equal_to&lt;T&gt;());

	for(size_t i=0;i&lt;out.size();++i)
		cout &lt;&lt; out[i].i &lt;&lt; endl;
}
</code></pre>
<p>Klappt ja schon mal.<br />
Eine Funktion, die nur die Referenzen oder Indizes speichert, muss man sich dann wahrscheinlich, wie out es gemacht hat, selber schreiben. Die Objekte sind nämlich nicht so einfach zu kopieren wie im obigen Beispiel.</p>
<p>Durch die Sortierung müsste das natürlich noch etwas besser gehen.</p>
<p>Ich kann ja dann mal meine Lösung posten (falls es jemanden interessiert).</p>
<p>Besten Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243640</guid><dc:creator><![CDATA[comparor]]></dc:creator><pubDate>Mon, 20 Aug 2012 12:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 12:43:38 GMT]]></title><description><![CDATA[<p>comparor schrieb:</p>
<blockquote>
<p>Durch die Sortierung müsste das natürlich noch etwas besser gehen.</p>
</blockquote>
<p>Soviel ich weiss müssen die beiden vectoren/sets/listen was auch immer, sortiert sein.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243642</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 20 Aug 2012 12:43:38 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 13:50:45 GMT]]></title><description><![CDATA[<p>comparor schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::back_inserter&lt;std::vector&lt;T&gt; &gt;(out)
</code></pre>
</blockquote>
<p>Nö. back_inserter ist ein Funktionstemplate. Es kommt ganz selten mal vor, dass man bei Funktionstemplates aus der Standardbibliothek einen Templateparameter explizit angeben muss. In den meisten Fällen ist die Idee, das dem Compiler zu überlassen -- so wie auch hier:</p>
<pre><code class="language-cpp">std::back_inserter(out)
</code></pre>
<p>comparor schrieb:</p>
<blockquote>
<p>Durch die Sortierung müsste das natürlich noch etwas besser gehen.</p>
</blockquote>
<p>die Mengen-Operationen <strong>verlangen</strong> sogar geordnete Sequenzen. Es &quot;geht&quot; also überhaupt erst, wenn sie geordnet sind. Da hast du in deinem Fall Glück wohl gehabt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243700</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 20 Aug 2012 13:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 15:30:09 GMT]]></title><description><![CDATA[<p>comparor schrieb:</p>
<blockquote>
<p>Eine Funktion, die nur die Referenzen oder Indizes speichert, muss man sich dann wahrscheinlich, wie out es gemacht hat, selber schreiben. Die Objekte sind nämlich nicht so einfach zu kopieren wie im obigen Beispiel.</p>
</blockquote>
<p>Für das Speichern ist in deinem Beispiel nicht die Funktion, sondern der <code>back_insert_iterator</code> zuständig. Du brauchst also nur ihn zu ändern:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;

// -- 15 neue Zeilen -----------------------------------------------------------

template &lt;typename T&gt; struct pointer_traits;
template &lt;typename T&gt; struct pointer_traits&lt;T*&gt; { typedef T element_type; };

template &lt;typename C, template&lt;class&gt; class Inserter&gt;
struct pointer_insert_iterator : Inserter&lt;C&gt; {
  pointer_insert_iterator(C&amp; c) : Inserter&lt;C&gt;(c) {}
  pointer_insert_iterator&amp;
  operator= (typename pointer_traits&lt;typename C::value_type&gt;::element_type&amp; value)
  { *static_cast&lt;Inserter&lt;C&gt;&amp;&gt;(*this) = &amp;value; return *this; }
  pointer_insert_iterator&amp; operator*()     { return *this; }
  pointer_insert_iterator&amp; operator++()    { return *this; }
  pointer_insert_iterator  operator++(int) { return *this; }  
};

template &lt;typename C&gt; pointer_insert_iterator&lt;C, std::back_insert_iterator&gt;
pointer_back_inserter(C&amp; c) { return pointer_insert_iterator&lt;C, std::back_insert_iterator&gt;(c); }

// -----------------------------------------------------------------------------

using namespace std;

// -- 2 Änderungen--------------------------------------------------------------

struct T
{
  int i;
  T(int i) : i(i) {}
  bool operator==(const T&amp; t) const {return i==t.i;}
};
bool operator!=(const T&amp; t1, const T&amp; t2)
{
  return !(t1.operator==(t2));
}

int main()
{
  vector&lt;T&gt; v1;
  vector&lt;T&gt; v2;
  for(int i=0;i&lt;40;++i)
    {
      v2.push_back(i);   
      if(i&amp;1)
        v1.push_back(i);
    }
  vector&lt;T *&gt; out;                                // (1) Pointer anstatt Werte
  std::set_difference(v2.begin(),v2.end(),
                      v1.begin(),v1.end(),
                      pointer_back_inserter(out), // (2) mein Iterator, nicht std::back_iterator
                      std::not_equal_to&lt;T&gt;());

  for(size_t i=0;i&lt;out.size();++i)
    cout &lt;&lt; out[i]-&gt;i &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2243765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243765</guid><dc:creator><![CDATA[registrarius]]></dc:creator><pubDate>Mon, 20 Aug 2012 15:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 15:36:25 GMT]]></title><description><![CDATA[<blockquote>
<p>Es kommt ganz selten mal vor, dass man bei Funktionstemplates aus der Standardbibliothek einen Templateparameter explizit angeben muss. In den meisten Fällen ist die Idee, das dem Compiler zu überlassen</p>
</blockquote>
<p>Mein aktuelles Beispiel: VS 2010 schafft es nicht bei <code>std::sort</code> aus dem Iterator heraus die Parameter des Vergleichsoperators abzuleiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243766</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 20 Aug 2012 15:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Mon, 20 Aug 2012 16:29:06 GMT]]></title><description><![CDATA[<p>Danke registrarius <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> !</p>
<p>Ich muss mich wirklich noch tiefer einarbeiten - auf diese Lösung wäre ich nicht so schnell gekommen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8090">@kk</a>: Ich bezog mich darauf, dass out in seinem Code immer den vector von Anfang an durchsucht hat - mein Ansatz wäre gewesen, immer den letzten gültigen Iterator zu speichern und ab diesem zu suchen.<br />
Mit der kürzeren Schreibweise beim back_inserter hast du natürlich Recht.</p>
<p>Auch allen anderen natürlich Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243783</guid><dc:creator><![CDATA[comparor]]></dc:creator><pubDate>Mon, 20 Aug 2012 16:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 08:42:24 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Es kommt ganz selten mal vor, dass man bei Funktionstemplates aus der Standardbibliothek einen Templateparameter explizit angeben muss. In den meisten Fällen ist die Idee, das dem Compiler zu überlassen</p>
</blockquote>
<p>Mein aktuelles Beispiel: VS 2010 schafft es nicht bei <code>std::sort</code> aus dem Iterator heraus die Parameter des Vergleichsoperators abzuleiten.</p>
</blockquote>
<p>Echt? Zeig mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243980</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 21 Aug 2012 08:42:24 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 09:47:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace geo {

template&lt;typename T&gt;
struct vec_2d
{
    T x,y;

    vec_2d() : x(T(0)), y(T(0)) {}
    vec_2d(T const&amp; a, T const&amp; b) : x(a), y(b) {}
};

template&lt;typename T&gt;
bool lt_yx(T const&amp; a, T const&amp; b)
{
    return (a.y==b.y) ? (a.x&lt;b.x) : (a.y&lt;b.y);
}

}
</code></pre>
<p>Und irgendwo im Code:</p>
<pre><code class="language-cpp">std::vector&lt;geo::vec_2d&lt;int&gt;&gt; ps = ...
std::sort(ps.begin(), ps.end(), geo::lt_yx&lt;geo::vec_2d&lt;int&gt;&gt;);
</code></pre>
<p>Das ist nur Copy-Paste aus meinem aktuellen Projekt. Lasse ich den Templateparameter der Vergleichsfunktion beim Aufruf von <code>std::sort</code> weg, also nur <code>geo::lt_yx</code> , so gibt es Compilerfehler bei VS 2010. Keine Ahnung wie gcc damit umgeht. Fuer <code>geo::lt_yx</code> gibt es keine Spezialisierungen oder andere Uneindeutigkeiten. Keine Ahnung ob das als Demo taugt. Es ist kein Minimalbeispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244023</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 21 Aug 2012 09:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 09:58:48 GMT]]></title><description><![CDATA[<p>Dann stimmt das Zitat ja immer noch, in deinem Beispiel stammt das Funktionstemplate, bei dem der Parameter explizit angegeben werden muss, nicht aus std (zufällig). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ansonsten verhhält sich der Compiler hier völlig korrekt:</p>
<pre><code class="language-cpp">template &lt;typename RandomAccessIterator, typename Func&gt;
InputIterator sort(RandomAccessIterator first, RandomAccessIterator last, Func comp);
</code></pre>
<p>(aus dem Kopf, müsste aber stimmen). Da comp auch ein Funktionsobjekt sein kann, wird der dritte Funktionsparameter nicht weiter eingeschränkt, mit der Folge, dass bei Templatefunktionen als Argument nichts deduziert werden kann. Dass ist in der STL fast überall so.<br />
Gäbe es eine Überladung</p>
<pre><code class="language-cpp">template &lt;typename RandomAccessIterator&gt;
InputIterator sort(RandomAccessIterator first, RandomAccessIterator last, bool comp(const typename iterator_traits&lt;RandomAccessIterator&gt;::value_type&amp;, const typename iterator_traits&lt;RandomAccessIterator&gt;::value_type&amp;));
</code></pre>
<p>könnte das Templateargument deiner Templatefunktion deduziert werden.<br />
Eine solche Überladung existiert aber nicht - und wäre auch nicht besonders nützlich; sobald die Signatur der Vergleichsfunktion abweicht, muss doch wieder auf die andere Überladung ausgewichen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244030</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 21 Aug 2012 09:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 11:00:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Funktionstemplates aus der Standardbibliothek</p>
</blockquote>
<p>Dann habe ich das wohl misverstanden, indem ich &quot;Funktionstemplate&quot; falsch zugeordnet habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244047</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 21 Aug 2012 11:00:32 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 12:31:49 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">[cpp]
std::vector&lt;geo::vec_2d&lt;int&gt;&gt; ps = ...
std::sort(ps.begin(), ps.end(), geo::lt_yx&lt;geo::vec_2d&lt;int&gt;&gt;);
</code></pre>
</blockquote>
<p>Aha. Nee, so meinte ich das eigentlich nicht. Ich hätte bei</p>
<blockquote>
<p>Es kommt ganz selten mal vor, dass man bei Funktionstemplates aus der Standardbibliothek einen Templateparameter explizit angeben muss. In den meisten Fällen ist die Idee, das dem Compiler zu überlassen.</p>
</blockquote>
<p>noch ein &quot;beim Aufruf&quot; einbauen müssen. Davon abgesehen, dass lt_yx kein Template aus der Standardbibliothek ist, ist das hier ja kein Aufruf von lt_yx. Der findet erst innerhalb von std::sort statt. Allerdings muss der Compiler schon vorher wissen, welche Spezialisierung du meinst. Und ich dachte, du meintest die Template-Parameter von <strong>sort</strong>. Die hast du ja auch nicht explizit angegeben. Du setzt hier immer noch auf Template-Argument-Deduction bzgl der Template-Parameter von std::sort.</p>
<p>Aber: Ist dir klar, dass dein Ansatz so nicht der beste bzgl Performance ist? Vergleiche den mal mit diesem Ansatz hier:</p>
<pre><code class="language-cpp">struct lt_yx {
    template&lt;typename T&gt; 
    bool operator()(T const&amp; a, T const&amp; b) 
    { return (a.y==b.y) ? (a.x&lt;b.x) : (a.y&lt;b.y); } 
};
</code></pre>
<pre><code class="language-cpp">std::sort(ps.begin(), ps.end(), geo::lt_yx());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2244072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244072</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 21 Aug 2012 12:31:49 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 13:08:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist dir klar, dass dein Ansatz so nicht der beste bzgl Performance ist? Vergleiche den mal mit diesem Ansatz hier</p>
</blockquote>
<p>Welcher Unterschied ist zu erwarten? Ich erwarte bei meinem Ansatz, dass alles &quot;geinlined&quot; wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244085</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 21 Aug 2012 13:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiede zweier std::vectoren in weiterem vector anfügen on Tue, 21 Aug 2012 13:44:13 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ich erwarte bei meinem Ansatz, dass alles &quot;geinlined&quot; wird.</p>
</blockquote>
<p>Das ist eine sehr hohe Erwartung; denn die Funktion, die für den Vergleich verwendet werden soll, übergibst du std::sort nur indirekt als Funktionszeiger. Der letzte Template-Parameter bei deiner std::sort-Instantiierung ist ein Funktionszeigertyp und dem Typ allein kann man nicht ansehen, mit welcher Funktion sortiert werden soll. Verstehst du den Unterschied?</p>
<pre><code class="language-cpp">template&lt;class Fun&gt;
void foo(Fun f) {
  f();
}

void bar() {}

struct baz {
  void operator()() const {}
};

int main() {
  foo(bar);    // #1
  foo(baz());  // #2
}
</code></pre>
<p>Bei #1 ist Fun = void(*)(), f also nur ein Funktionszeiger, mit dem man, je nach gespeicherter Adresse beliebige void-Funktionen aufrufen könnte.</p>
<p>Bei #2 ist Fun = baz und beim Erzeugen der Spezialisierung foo&lt;baz&gt; ist klar, dass f() immer nur baz::operator() sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244098</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 21 Aug 2012 13:44:13 GMT</pubDate></item></channel></rss>