<?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[Swap implentieren und durch die STL beuntzen lassen]]></title><description><![CDATA[<p>Hallo,<br />
die swap Funktion aus &lt;algorithm&gt; ist ja als Dreieckstausch implementiert. Dem Gegenüber stehen die swap Funktionen von zB Vektor oder std::string.<br />
Algorithmen wie RandomShuffle oder BubbleSort profitieren bei Datentypen wie vector stark von Swap.<br />
Wenn ich also einen Vector aus zB String mit RandomShuffle bearbeite, werden die Strings dann über Dreieckstausch getauscht oder wird hier das std::string::swap aufgerufen?<br />
Wie muss ich eine swap Funktion für eigene Klassen implementieren, damit sie von Algorithmen der STL benutzt wird? Als freie Funktion wie swap aus Algorithm oder als Elementfunktion wie zB bei vector?</p>
<pre><code class="language-cpp">class Klasse
{
   public:
    void swap(Klasse&amp; a){} //so?
}
void swap(Klasse&amp; a, Klasse&amp; b){} //oder so?

std::vector&lt;Klasse&gt; vec;
random_shuffle(vec.begin(), vec.end()); //wird hier MEIN swap verwendet?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/255305/swap-implentieren-und-durch-die-stl-beuntzen-lassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 02:19:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255305.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Nov 2009 19:39:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 19:39:37 GMT]]></title><description><![CDATA[<p>Hallo,<br />
die swap Funktion aus &lt;algorithm&gt; ist ja als Dreieckstausch implementiert. Dem Gegenüber stehen die swap Funktionen von zB Vektor oder std::string.<br />
Algorithmen wie RandomShuffle oder BubbleSort profitieren bei Datentypen wie vector stark von Swap.<br />
Wenn ich also einen Vector aus zB String mit RandomShuffle bearbeite, werden die Strings dann über Dreieckstausch getauscht oder wird hier das std::string::swap aufgerufen?<br />
Wie muss ich eine swap Funktion für eigene Klassen implementieren, damit sie von Algorithmen der STL benutzt wird? Als freie Funktion wie swap aus Algorithm oder als Elementfunktion wie zB bei vector?</p>
<pre><code class="language-cpp">class Klasse
{
   public:
    void swap(Klasse&amp; a){} //so?
}
void swap(Klasse&amp; a, Klasse&amp; b){} //oder so?

std::vector&lt;Klasse&gt; vec;
random_shuffle(vec.begin(), vec.end()); //wird hier MEIN swap verwendet?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1814699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814699</guid><dc:creator><![CDATA[Sortiererei]]></dc:creator><pubDate>Sat, 28 Nov 2009 19:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 20:52:18 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace std
{
    template&lt;&gt;
    void swap(Klasse&amp; a, Klasse&amp; b)
    {
        // ...
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1814716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814716</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sat, 28 Nov 2009 20:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 21:12:35 GMT]]></title><description><![CDATA[<p>Ich habe mir ein kleines Testprogramm mit deinem Ansatz geschrieben:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;

class Klasse
{
   public:
    int i;
};

namespace std
{
    template&lt;&gt;
    void swap(Klasse&amp; a, Klasse&amp; b)
    {
        int tmp = a.i;
        a.i = b.i;
        b.i = tmp;
        std::cout&lt;&lt;&quot;test&quot;;
    }
}

#include &lt;vector&gt;
using namespace std;

int main()
{
    Klasse t;

    vector&lt;Klasse&gt; vec;

    t.i = 7;
    vec.push_back(t);
    t.i = 2;
    vec.push_back(t);
    t.i = 5;
    vec.push_back(t);

    random_shuffle(vec.begin(), vec.end());
}
</code></pre>
<p>Allerdings erhalte ich keine Ausgabe von &quot;test&quot; (Weder bei sort noch bei random_shuffle)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814719</guid><dc:creator><![CDATA[Sortiererei]]></dc:creator><pubDate>Sat, 28 Nov 2009 21:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 21:32:18 GMT]]></title><description><![CDATA[<p>Schade! Bei mir wird zwei mal &quot;test&quot; ausgegeben. (Visual C++ 2008)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814723</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sat, 28 Nov 2009 21:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 21:41:56 GMT]]></title><description><![CDATA[<p>Stimmt. Mit dem Windowscompiler wird &quot;testtest&quot; ausgegeben, mit CodeBlocks nicht. Kann sich jemand vorstellen, woran das liegen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814728</guid><dc:creator><![CDATA[Sortiererei]]></dc:creator><pubDate>Sat, 28 Nov 2009 21:41:56 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 22:00:45 GMT]]></title><description><![CDATA[<p>Hab mal in den Quellcode der Standardbibliothek von g++ geguckt. Dort wird in random_shuffle **iter_**swap benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814732</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sat, 28 Nov 2009 22:00:45 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sat, 28 Nov 2009 22:04:29 GMT]]></title><description><![CDATA[<p>Und in iter_swap wird swap nicht benutzt um den Tausch zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814734</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sat, 28 Nov 2009 22:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 00:11:03 GMT]]></title><description><![CDATA[<p>Aber ruft iter_swap nicht std::swap auf? (Zumindest laut C++ Reference: <a href="http://www.cplusplus.com/reference/algorithm/iter_swap/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/iter_swap/</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814772</guid><dc:creator><![CDATA[Sortiererei]]></dc:creator><pubDate>Sun, 29 Nov 2009 00:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 07:04:21 GMT]]></title><description><![CDATA[<p>g++ 3.4.5 (MinGW):</p>
<pre><code class="language-cpp">template&lt;typename _ForwardIterator1, typename _ForwardIterator2&gt;
inline void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
  typedef typename iterator_traits&lt;_ForwardIterator1&gt;::value_type
_ValueType1;
  typedef typename iterator_traits&lt;_ForwardIterator2&gt;::value_type
_ValueType2;

  const _ValueType1 __tmp = *__a;
  *__a = *__b;
  *__b = __tmp;
}
</code></pre>
<p>Visual C++ 2008:</p>
<pre><code class="language-cpp">template&lt;class _FwdIt1, class _FwdIt2&gt;
inline void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
{
    swap(*_Left, *_Right);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1814800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814800</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sun, 29 Nov 2009 07:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 10:08:30 GMT]]></title><description><![CDATA[<p>Ist die G++-Implementierung wirklich so schlecht, dass sie jegliche <code>swap()</code> -Funktionen auf Namensraum-Ebene einfach ignoriert? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Meiner Ansicht nach müsste <code>iter_swap(a, b)</code> das Gleiche tun wie <code>swap(*a, *b)</code> -- im Idealfall mit ADL. Wenn man nun aufgrund von Exceptionsicherheit oder Performance gezwungen wird, immer die zweite Möglichkeit zu wählen, finde ich <code>std::iter_swap()</code> etwas witzlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814824</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Nov 2009 10:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 10:12:04 GMT]]></title><description><![CDATA[<p>Vielleicht sollte man sich vor Augen halten, dass das die Implementierung aus dem 3.4.5 gcc ist. Mittlerweile ist der 4.4.2 aktuell.<br />
MinGW ist einfach chronisch veraltet.</p>
<p>Bei meinem g++ wird hier auch wie gewünscht zwei mal test ausgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814832</guid><dc:creator><![CDATA[YASC]]></dc:creator><pubDate>Sun, 29 Nov 2009 10:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 10:22:58 GMT]]></title><description><![CDATA[<p>Jau mit g++ 4.4.1 für Windows ( <a href="http://www.tdragon.net/recentgcc/" rel="nofollow">http://www.tdragon.net/recentgcc/</a> ) funktionierts auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814837</guid><dc:creator><![CDATA[vielleicht...]]></dc:creator><pubDate>Sun, 29 Nov 2009 10:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 10:30:06 GMT]]></title><description><![CDATA[<p>Okay, dann ist ja alles in Ordnung. Hat mich nur gerade etwas gewundert... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1814842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814842</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Nov 2009 10:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to Swap implentieren und durch die STL beuntzen lassen on Sun, 29 Nov 2009 12:32:15 GMT]]></title><description><![CDATA[<p>YASC schrieb:</p>
<blockquote>
<p>Vielleicht sollte man sich vor Augen halten, dass das die Implementierung aus dem 3.4.5 gcc ist. Mittlerweile ist der 4.4.2 aktuell.<br />
MinGW ist einfach chronisch veraltet.</p>
</blockquote>
<p>Das war mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1814913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1814913</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 29 Nov 2009 12:32:15 GMT</pubDate></item></channel></rss>