<?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 bei std::sort mit Funktor]]></title><description><![CDATA[<p>Hi,<br />
ich habe für das Problem mal ein Minimalbeispiel gemacht. Mein Funktor besitzt als Member einen <code>std::vector</code> . Merkwürdig ist nun, dass der <code>std::vector</code> zurückgesetzt wird, wenn <code>std::sort</code> den <code>operator()</code> aufruft und der Vergleich <code>lhs&lt;rhs</code>  <code>false</code> ergibt. Habe es schon gedebugged, konnte aber nicht feststellen, wann (und vor allem) weshalb das passiert. Kann jemand von euch das Verhalten erklären?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

struct compare
{
	vector&lt;unsigned&gt; vec;

	compare()
	{
		for(unsigned i=0; i!=10; ++i)
			vec.push_back( 8 );
	}

    bool operator()(int lhs, int rhs)
    {
		cout &lt;&lt; vec[0] &lt;&lt; '\n';
		vec[0] = 123;
		return lhs &lt; rhs;
	}
};

int main()
{
	int ar[] = {9,8,7,6,5};
	std::sort( ar, ar+5, compare() );
}
</code></pre>
<p>Die Ausgabe ist:<br />
`</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>`</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316545/problem-bei-std-sort-mit-funktor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 22:58:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316545.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 May 2013 18:22:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei std::sort mit Funktor on Tue, 07 May 2013 18:22:50 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe für das Problem mal ein Minimalbeispiel gemacht. Mein Funktor besitzt als Member einen <code>std::vector</code> . Merkwürdig ist nun, dass der <code>std::vector</code> zurückgesetzt wird, wenn <code>std::sort</code> den <code>operator()</code> aufruft und der Vergleich <code>lhs&lt;rhs</code>  <code>false</code> ergibt. Habe es schon gedebugged, konnte aber nicht feststellen, wann (und vor allem) weshalb das passiert. Kann jemand von euch das Verhalten erklären?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

struct compare
{
	vector&lt;unsigned&gt; vec;

	compare()
	{
		for(unsigned i=0; i!=10; ++i)
			vec.push_back( 8 );
	}

    bool operator()(int lhs, int rhs)
    {
		cout &lt;&lt; vec[0] &lt;&lt; '\n';
		vec[0] = 123;
		return lhs &lt; rhs;
	}
};

int main()
{
	int ar[] = {9,8,7,6,5};
	std::sort( ar, ar+5, compare() );
}
</code></pre>
<p>Die Ausgabe ist:<br />
`</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>8</p>
<p>123</p>
<p>`</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2321789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2321789</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 07 May 2013 18:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei std::sort mit Funktor on Tue, 07 May 2013 18:28:02 GMT]]></title><description><![CDATA[<p>std::sort kopiert das Objekt mehrmals. GIb noch die Addresse des objektes aus, dann wird es klarer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2321792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2321792</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 07 May 2013 18:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei std::sort mit Funktor on Tue, 07 May 2013 18:33:09 GMT]]></title><description><![CDATA[<p>Algorithmen dürfen im Allgemeinen Funktoren, die sie als Argumente erhalten frei kopieren. Es ist also nicht bestimmt, dass immer das gleiche Funktionsobjekt für alle Vergleiche benutzt wird.<br />
Ein reference_wrapper sollte hier helfen.</p>
<pre><code class="language-cpp">compare comp;
std::sort( ar, ar+5, std::ref(comp) );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2321793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2321793</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 07 May 2013 18:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei std::sort mit Funktor on Tue, 07 May 2013 18:41:46 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Algorithmen dürfen im Allgemeinen Funktoren, die sie als Argumente erhalten frei kopieren. Es ist also nicht bestimmt, dass immer das gleiche Funktionsobjekt für alle Vergleiche benutzt wird.</p>
</blockquote>
<p>Ah ok, danke das wusste ich nicht. Hab eben einen Copy-Ctor hinzugefügt, und du hast Recht, es wird häufig kopiert. Wieder was gelernt... erst dachte ich, ich muss dem VC11 die Schuld geben :p.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Ein reference_wrapper sollte hier helfen.</p>
<pre><code class="language-cpp">compare comp;
std::sort( ar, ar+5, std::ref(comp) );
</code></pre>
</blockquote>
<p>Jup, funktioniert, danke. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2321795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2321795</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 07 May 2013 18:41:46 GMT</pubDate></item></channel></rss>