<?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[Problem mit std::pair, std::sort und Templates]]></title><description><![CDATA[<p>In meinem Programm habe ich Mäuse, die eine ID vom Typ <code>K</code> haben, wobei <code>K</code> ein Template-Parameter ist (ich instanziere <code>K</code> als <code>int</code> ).</p>
<p>Das Mapping von ID zu Maus wird wie folgt in einer Klasse <code>Foo</code> gespeichert:</p>
<pre><code>std::map&lt;K,Mouse&lt;int,K&gt;&gt; m_population;
</code></pre>
<p>Ich habe anschliessend folgende Funktion (die Vergleichsfunktion ist so natürlich nicht sinnvoll aber sie genügt, um das Problem aufzuzeigen):</p>
<pre><code>template &lt;typename K&gt;
void Foo&lt;K&gt;::foo()
{
    std::vector&lt;std::pair&lt;double,std::pair&lt;K,K&gt;&gt;&gt; value_pairs;

    // do something with value_pairs
    // all id's in value_pairs are in m_population

    auto comp = [this](const std::pair&lt;double,std::pair&lt;K,K&gt;&gt; &amp;lhs, const std::pair&lt;double,std::pair&lt;K,K&gt;&gt; &amp;rhs)
        {
            assert( m_population.find(lhs.second.first) != m_population.end() ); // this assertion fails
            assert( m_population.find(lhs.second.second) != m_population.end() );
            assert( m_population.find(rhs.second.first) != m_population.end() );
            assert( m_population.find(rhs.second.second) != m_population.end() );

            return true;
        };

    std::sort(value_pairs.begin(), value_pairs.end(), comp);
}
</code></pre>
<p>In <code>value_pairs</code> speichere ich bloss irgend einen Wert zu jedem Paar von IDs (ist nicht wichtig was dieser Wert bedeutet). Bevor ich <code>std::sort</code> aufrufe existieren alle IDs in <code>value_pairs</code> .</p>
<p>Das Problem ist nun, dass die erste Assertion nicht hält, denn <code>lhs.second.first</code> (eine Maus-ID) hat den Wert 0, aber alle IDs sind positiv. Wenn ich <code>lhs</code> ausgebe, dann erhalte ich (0,(0,0)).</p>
<p>Das merkwürdge ist nun folgendes: Wenn ich in der Vergleichsfunktion anstatt <code>true</code> einfach <code>false</code> zurückgebe, dann tritt der Fehler nicht auf. Das heisst das Problem sind wohl die Vertauschungen, die <code>std::sort</code> ausführt.</p>
<p>Hat irgend jemand eine Idee woran das liegen könnte? Ich habe den Verdacht, dass bei einer Vertschauschung einfach Default-Werte gesetzt werden und nicht richtig vertauscht wird. Verstehe allerdings nicht wie das passieren kann.</p>
<p>PS:<br />
Sorry für den schwachen Titel aber mir ist wirklich nix besseres eingefallen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326688/problem-mit-std-pair-std-sort-und-templates</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 12:32:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326688.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jul 2014 09:18:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:19:31 GMT]]></title><description><![CDATA[<p>In meinem Programm habe ich Mäuse, die eine ID vom Typ <code>K</code> haben, wobei <code>K</code> ein Template-Parameter ist (ich instanziere <code>K</code> als <code>int</code> ).</p>
<p>Das Mapping von ID zu Maus wird wie folgt in einer Klasse <code>Foo</code> gespeichert:</p>
<pre><code>std::map&lt;K,Mouse&lt;int,K&gt;&gt; m_population;
</code></pre>
<p>Ich habe anschliessend folgende Funktion (die Vergleichsfunktion ist so natürlich nicht sinnvoll aber sie genügt, um das Problem aufzuzeigen):</p>
<pre><code>template &lt;typename K&gt;
void Foo&lt;K&gt;::foo()
{
    std::vector&lt;std::pair&lt;double,std::pair&lt;K,K&gt;&gt;&gt; value_pairs;

    // do something with value_pairs
    // all id's in value_pairs are in m_population

    auto comp = [this](const std::pair&lt;double,std::pair&lt;K,K&gt;&gt; &amp;lhs, const std::pair&lt;double,std::pair&lt;K,K&gt;&gt; &amp;rhs)
        {
            assert( m_population.find(lhs.second.first) != m_population.end() ); // this assertion fails
            assert( m_population.find(lhs.second.second) != m_population.end() );
            assert( m_population.find(rhs.second.first) != m_population.end() );
            assert( m_population.find(rhs.second.second) != m_population.end() );

            return true;
        };

    std::sort(value_pairs.begin(), value_pairs.end(), comp);
}
</code></pre>
<p>In <code>value_pairs</code> speichere ich bloss irgend einen Wert zu jedem Paar von IDs (ist nicht wichtig was dieser Wert bedeutet). Bevor ich <code>std::sort</code> aufrufe existieren alle IDs in <code>value_pairs</code> .</p>
<p>Das Problem ist nun, dass die erste Assertion nicht hält, denn <code>lhs.second.first</code> (eine Maus-ID) hat den Wert 0, aber alle IDs sind positiv. Wenn ich <code>lhs</code> ausgebe, dann erhalte ich (0,(0,0)).</p>
<p>Das merkwürdge ist nun folgendes: Wenn ich in der Vergleichsfunktion anstatt <code>true</code> einfach <code>false</code> zurückgebe, dann tritt der Fehler nicht auf. Das heisst das Problem sind wohl die Vertauschungen, die <code>std::sort</code> ausführt.</p>
<p>Hat irgend jemand eine Idee woran das liegen könnte? Ich habe den Verdacht, dass bei einer Vertschauschung einfach Default-Werte gesetzt werden und nicht richtig vertauscht wird. Verstehe allerdings nicht wie das passieren kann.</p>
<p>PS:<br />
Sorry für den schwachen Titel aber mir ist wirklich nix besseres eingefallen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406457</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:33:28 GMT]]></title><description><![CDATA[<p>Eine Vergleichsfunktion, die immer true zurückgibt, erfüllt nicht die Anforderungen von std::sort. Insofern ist das Problem hausgemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406463</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:38:48 GMT]]></title><description><![CDATA[<p>Wenn ich mich recht erinnere, darfste (sogar nach C++-Standard) sort eh nicht mit einem Vergleicher aufrufen, der schummelt, also widersprüchlich ist.<br />
Sonst könnte man sort innendrin gar nicht schlau programmieren/optimieren.</p>
<p>return false; geht, dann sind halt für Dich alle Werte gleich.<br />
Aber return true; kann nicht sein, es kann nicht a&lt;b und zugleich b&lt;a sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406465</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:47:32 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Eine Vergleichsfunktion, die immer true zurückgibt, erfüllt nicht die Anforderungen von std::sort. Insofern ist das Problem hausgemacht.</p>
</blockquote>
<p>Da hast du recht, gibt natürlich keine totale Ordnung (ich nehme an das ist worauf du hinaus willst).</p>
<p>Dann halt die richtige Implementierung (wolte euch nicht meinen hässlichen Code an den Kopf werden <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>
<pre><code>auto comp = [this](const std::pair&lt;double,std::pair&lt;K,K&gt; &gt; &amp;lhs, const std::pair&lt;double,std::pair&lt;K,K&gt; &gt; &amp;rhs)
        {
            const Mouse&lt;int,K&gt; &amp;lhs_male = (*m_population.find(lhs.second.first)).second;
            const Mouse&lt;int,K&gt; &amp;lhs_female = (*m_population.find(lhs.second.second)).second;
            const Mouse&lt;int,K&gt; &amp;rhs_male = (*m_population.find(rhs.second.first)).second;
            const Mouse&lt;int,K&gt; &amp;rhs_female = (*m_population.find(rhs.second.second)).second;

            RecombProbs&lt;double&gt; probs(m_simulation-&gt;ideotype().nof_genes()); // only a matrix containing probabilities
            double lhs_prob = prob(lhs_male.genome(), lhs_female.genome(), m_simulation-&gt;ideotype(), probs); // compute some probability
            double rhs_prob = prob(rhs_male.genome(), rhs_female.genome(), m_simulation-&gt;ideotype(), probs); // compute some probability

            return lhs_prob &gt;= rhs_prob || (lhs_prob &lt; rhs_prob &amp;&amp; lhs.first &lt; rhs.first);
        };
</code></pre>
<p>*Edit<br />
Bitte fragt nach wenn ihr mehr zum Code wissen müsst. Ist mir durchaus bewusst, dass man nicht versteht was da genau gemacht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406466</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:52:13 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<pre><code>return lhs_prob &gt;= rhs_prob || ...;
</code></pre>
</blockquote>
<p>Bei Gleichwertigkeit liefert <code>comp()</code> true. Das darf nicht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406468</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 09:56:14 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<pre><code>return lhs_prob &gt;= rhs_prob || ...;
</code></pre>
</blockquote>
<p>Bei Gleichwertigkeit liefert <code>comp()</code> true. Das darf nicht sein.</p>
</blockquote>
<p>Habe ich auch gerade gemerkt, es sollte</p>
<pre><code>return lhs_prob &gt; rhs_prob || (lhs_prob &lt;= rhs_prob &amp;&amp; lhs.first &lt; rhs.first);
</code></pre>
<p>sein.</p>
<p>Habs probiert und jetzt klappt es auch. Vielen Dank für die Hilfe. Habe stundenlang den Fehler an der falschen Stelle gesucht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406471</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 09:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 10:33:24 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Habe ich auch gerade gemerkt, es sollte</p>
<pre><code>return lhs_prob &gt; rhs_prob || (lhs_prob &lt;= rhs_prob &amp;&amp; lhs.first &lt; rhs.first);
</code></pre>
<p>sein.</p>
</blockquote>
<p>Das ist immer noch falsch. falls lhs_prob &lt; rhs_prob und lhs.first &lt; rhs.first sind comp(lhs,rhs) und comp(rhs,lhs) beide true.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406481</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 01 Jul 2014 10:33:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 11:32:50 GMT]]></title><description><![CDATA[<p>Tippfehler, ich wollte</p>
<pre><code>return lhs_prob &gt; rhs_prob || (lhs_prob == rhs_prob &amp;&amp; lhs.first &lt; rhs.first);
</code></pre>
<p>schreiben, dann müsste es stimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406494</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 11:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 12:25:00 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Eine Vergleichsfunktion, die immer true zurückgibt, erfüllt nicht die Anforderungen von std::sort. Insofern ist das Problem hausgemacht.</p>
</blockquote>
<p>Wollte gerade widersprechen, aber du hast natürlich Recht.<br />
Wenn dann müsste sie immer <code>false</code> zurückgeben - das wäre OK.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406502</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Jul 2014 12:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 12:42:04 GMT]]></title><description><![CDATA[<p>Ich finde das Verhalten von <code>std::sort</code> ziemlich lustig.</p>
<p>Dass die Reihenfolge bei einer falschen Vergleichsfunktion verkehrt rauskommen kann ist klar. Aber dass Elemente verändert werden ist doch ziemlich speziell, das hätte ich nicht erwartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406504</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 12:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 13:11:25 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Ich finde das Verhalten von <code>std::sort</code> ziemlich lustig.</p>
<p>Dass die Reihenfolge bei einer falschen Vergleichsfunktion verkehrt rauskommen kann ist klar. Aber dass Elemente verändert werden ist doch ziemlich speziell, das hätte ich nicht erwartet.</p>
</blockquote>
<p>Ganz logisch: Für Quicksort und insertionsort braucht man in der inneren Schleife sowas wie</p>
<pre><code>for(…;a[i]&lt;a[j] and i&gt;1;…) //oder and i&lt;j oder so
   swap(a[i],a[j]);
</code></pre>
<p>und die Vergleiche auf i und j, also ob man aus dem gültigen Bereich rausrennt, kann man bleibenlassen, wenn der aktuell zu sortierende Bereich nach unten abgeschlossen ist durch ein Element, was garantiert &lt;= aller Elemente im Bereich ist. Bei Quicksort (mit links-vor-rechts-Ausführung) muss man also nur immer den linken Teil geprüft machen und der rechte geht ungeprüft (und von einem ungeprüften Teil gehen sogar beide Kinder ungeprüft)).</p>
<p>Im op&lt; dann zu schummeln führt direkt zu Schutzverletzungen bzw die vector-Elemente werden man auch in fremden Speicher vor dem vector sortiert.</p>
<p>Stichwort: Sentinel<br />
Afair hat Sedgewick den in Quicksort bekannt gemacht, ich kann aber nicht nach Sedgewick Sentinel googlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406509</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 01 Jul 2014 13:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 13:28:43 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>[..]<br />
und die Vergleiche auf i und j, also ob man aus dem gültigen Bereich rausrennt, kann man bleibenlassen, wenn der aktuell zu sortierende Bereich nach unten abgeschlossen ist [..]</p>
</blockquote>
<p>Stimmt, jetzt ist es auch für mich logisch. Danke für die Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406514</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 13:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 20:49:16 GMT]]></title><description><![CDATA[<p>Tipp: Wenn du nach mehreren Kriterien lexikographisch sortieren willst, verzichte auf Basteleien mit logischen Operatoren. Wie du siehst, muss man genau nachdenken und macht trotzdem sehr schnell Fehler.</p>
<p>Stattdessen</p>
<pre><code>return std::make_pair(lhs_prob, lhs.first) &lt; std::make_pair(rhs_prob, rhs.first);
</code></pre>
<p>Mit <code>std::make_tuple()</code> skaliert der Vergleich wunderbar für beliebig viele Kriterien.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406580</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 01 Jul 2014 20:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 21:06:52 GMT]]></title><description><![CDATA[<p>Guter Tipp, das kannte ich nicht.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406582</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Tue, 01 Jul 2014 21:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 21:08:22 GMT]]></title><description><![CDATA[<p>Sollte man nicht eher std::tie verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406586</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 01 Jul 2014 21:08:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 21:09:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Tipp: Wenn du nach mehreren Kriterien lexikographisch sortieren willst, verzichte auf Basteleien mit logischen Operatoren. Wie du siehst, muss man genau nachdenken und macht trotzdem sehr schnell Fehler.</p>
<p>Stattdessen</p>
<pre><code>return std::make_pair(lhs_prob, lhs.first) &lt; std::make_pair(rhs_prob, rhs.first);
</code></pre>
<p>Mit <code>std::make_tuple()</code> skaliert der Vergleich wunderbar für beliebig viele Kriterien.</p>
</blockquote>
<p>Der Trick ist std::tie:</p>
<pre><code class="language-cpp">return std::tie(lhs_prob, lhs.first) &lt; std::tie(rhs_prob, rhs.first);
</code></pre>
<p>Das skaliert noch viel besser als make_tuple, weil keine Kopien gemacht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406587</guid><dc:creator><![CDATA[skalierbar]]></dc:creator><pubDate>Tue, 01 Jul 2014 21:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 21:36:29 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Tippfehler, ich wollte</p>
<pre><code>return lhs_prob &gt; rhs_prob || (lhs_prob == rhs_prob &amp;&amp; lhs.first &lt; rhs.first);
</code></pre>
<p>schreiben, dann müsste es stimmen.</p>
</blockquote>
<p>Lange Ausdrücke mit &amp;&amp; oder || meide ich. Dann lieber mehrere ifs. Immer die zuerst, was sofort rausreturnen können, dann gibts auch keine riesigen Verschachtelingen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406593</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 01 Jul 2014 21:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 22:25:27 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis mit <code>std::tie()</code> . Bei <code>std::make_tuple()</code> zerfallen die Argumenttypen mittels <code>std::decay</code> , daher fällt die Referenz tatsächlich weg.</p>
<p>Wisst ihr auch, wie es z.B. hier aussieht?</p>
<pre><code>void Function(std::pair&lt;std::string, int&gt; p);

Function(std::make_pair(&quot;string&quot;, 4)); // const char*, int
</code></pre>
<p>Das sollte meines Erachtens keine unnötigen Kopien erzeugen. Klar wird wegen der Konvertierung eine weggeworfen, aber es sollte nicht teurer sein als</p>
<pre><code>Function(std::make_pair(std::string(&quot;string&quot;), 4)); // std::string, int
</code></pre>
<p>oder</p>
<pre><code>Function({&quot;string&quot;, 4});
</code></pre>
<p>Jetzt nicht nur im Bezug auf den C++-Standard, sondern auch falls jemand weiss, wie gut aktuelle Compiler optimieren. Könnte ich bei Gelegenheit mal testen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406605</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 01 Jul 2014 22:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::pair, std::sort und Templates on Tue, 01 Jul 2014 23:54:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Jetzt nicht <em>nur</em> im Bezug auf den C++-Standard</p>
</blockquote>
<p>Dann kann ich ja den Anfang machen:</p>
<blockquote>
<p>aber es sollte nicht teurer sein als [...]</p>
</blockquote>
<p>Stimmt, da kann copy elision angewandt werden um sowohl die Temporary für den String als auch für den Rückgabewert zu elidieren.<br />
Letztlich kommt es runter auf die Kopie der Zeichen im Stringliteral, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406617</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 01 Jul 2014 23:54:57 GMT</pubDate></item></channel></rss>