<?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[std::swap mit std::vector?]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich habe mal eine kuze Frage bezüglich std::swap. Kann ich damit auch problemlos Objekte und Container tauschen (z.B. std::string oder std::vector)?<br />
quasi so:</p>
<pre><code>myClass &amp;myClass::operator=(myClass const &amp;other)
{
	myClass tmp(other);
	std::swap(myStdVector, tmp.myStdVector);
	std::swap(myStdString, tmp.myStdString);

	// ist das hier quatsch?:
	myUniquePtr.reset(tmp.myUniquePtr.release());

    return *this;
}
</code></pre>
<p>Benötige ich irgendwie std::move dafür oder ist es unproblematisch std::swap zu verwenden? Wie sieht es bei einem unique_ptr aus? Mein Bauchgefühl sagt mir, dass meine oben gezeigte Lösung nicht so gut ist. ...ich glaube hier müsste ich wohl std::move verwenden, oder?</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338018/std-swap-mit-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 12:42:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338018.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 May 2016 10:59:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::swap mit std::vector? on Wed, 18 May 2016 10:59:21 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich habe mal eine kuze Frage bezüglich std::swap. Kann ich damit auch problemlos Objekte und Container tauschen (z.B. std::string oder std::vector)?<br />
quasi so:</p>
<pre><code>myClass &amp;myClass::operator=(myClass const &amp;other)
{
	myClass tmp(other);
	std::swap(myStdVector, tmp.myStdVector);
	std::swap(myStdString, tmp.myStdString);

	// ist das hier quatsch?:
	myUniquePtr.reset(tmp.myUniquePtr.release());

    return *this;
}
</code></pre>
<p>Benötige ich irgendwie std::move dafür oder ist es unproblematisch std::swap zu verwenden? Wie sieht es bei einem unique_ptr aus? Mein Bauchgefühl sagt mir, dass meine oben gezeigte Lösung nicht so gut ist. ...ich glaube hier müsste ich wohl std::move verwenden, oder?</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496120</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Wed, 18 May 2016 10:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Wed, 18 May 2016 11:26:40 GMT]]></title><description><![CDATA[<p>Das ist unproblematisch und macht genau was du möchtest. Das ist schließlich auch der Sinn der ganzen Sache. Siehe Liste der vorgefertigten Spezialisierungen hier:<br />
<a href="http://en.cppreference.com/w/cpp/algorithm/swap" rel="nofollow">http://en.cppreference.com/w/cpp/algorithm/swap</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496123</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 18 May 2016 11:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Wed, 18 May 2016 11:28:10 GMT]]></title><description><![CDATA[<p>Hallo SBond,</p>
<p>Liegt eine Zuweisung vor A=B, so muss der Inhalt von B nach A kopiert werden. D.h. der Inhalt von B liegt am Ende zweimal vor. Einmal in B und einmal in A. Also ist hier ein std::move nicht angebracht.</p>
<p>Falsch ist lediglich die Zeile 8 (Ist das hier quatsch? -&gt; Ja). Das geht genau dann schief, wenn <code>&amp;other==this</code> ist. Ich unterstelle mal, dass es sich bei <code>myUniquePtr</code> um einen <code>std::unique_ptr&lt;&gt;</code> handelt.<br />
Dann wäre ein <code>std::swap( myUniquePtr, tmp.myUniquePtr )</code> genau richtig.</p>
<p>Empfehlung: packe das <code>swap</code> von <code>myClass</code> in eine eigene Methode. Das Assign sollte dann so aussehen:</p>
<pre><code>myClass &amp;myClass::operator=(myClass const &amp;other)
{
    myClass tmp(other);
    tmp.swap( *this );
    return *this;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496124</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 18 May 2016 11:28:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Wed, 18 May 2016 11:47:37 GMT]]></title><description><![CDATA[<p>vielen Dank für die Antworten. Das war sehr hilfreich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Empfehlung: packe das <code>swap</code> von <code>myClass</code> in eine eigene Methode.</p>
</blockquote>
<p>Das habe ich schon einige male in Foren gesehen. Bietet es bestimmte Vorteile? So aus Stand heraus würde ich sagen, wenn man noch eine Move-Operation zur Verfügung stellen will. Aber derartiges habe ich zumindest noch nicht gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496126</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Wed, 18 May 2016 11:47:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Thu, 19 May 2016 12:28:46 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>... Das Assign sollte dann so aussehen:</p>
<pre><code>myClass &amp;myClass::operator=(myClass const &amp;other)
{
    myClass tmp(other);
    tmp.swap( *this );
    return *this;
}
</code></pre>
</blockquote>
<p>Da wird eine Kopie angelegt. Dann kann man auch gleich per Wert übergeben, d.h.</p>
<pre><code>myClass &amp;myClass::operator=(myClass other)
{
    swap(other);
    return *this;
}
</code></pre>
<p>Der zusätzliche Vorteil dieser kürzeren Lösung ist, dass der Compiler den Kopierkonstruktoraufruf bei der Parameterübergabe wegoptimieren kann, wenn <code>other</code> ein temporäres Objekt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496234</guid><dc:creator><![CDATA[manchmal_schneller]]></dc:creator><pubDate>Thu, 19 May 2016 12:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Thu, 19 May 2016 15:17:37 GMT]]></title><description><![CDATA[<p>manchmal_schneller schrieb:</p>
<blockquote>
<p>Der zusätzliche Vorteil dieser kürzeren Lösung ist, dass der Compiler den Kopierkonstruktoraufruf bei der Parameterübergabe wegoptimieren kann, wenn <code>other</code> ein temporäres Objekt ist.</p>
</blockquote>
<p>In welchen Fällen ist diese Variante zu bevorzugen gegenüber der Variante, einen move assignment operator zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496259</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Thu, 19 May 2016 15:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::swap mit std::vector? on Thu, 19 May 2016 15:34:15 GMT]]></title><description><![CDATA[<p>Am besten ist es, den Assignmentoperator nicht zu implementieren - der Compiler kümmert sich um alles - es sei den, man verwaltet Speicher mit rohen Zeigern selbst, was man, wenn möglich, vermeiden sollte. Man kann davon ausgehen, dass der Compiler eine Vektorzuweisung klug anstellt. Im Grunde wird hier das falsche Fass aufgemacht, denn die anfängliche Themenstellung war, ob man problemlos Objekte und Container tauschen kann. Das glitt dann ab in die Diskussion des =-Ops, was oben nur ein <strong>Beispiel</strong> fürs Tauschen ist. Stichwort zum Googeln: &quot;rule of zero&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2496260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2496260</guid><dc:creator><![CDATA[manchmal_schneller]]></dc:creator><pubDate>Thu, 19 May 2016 15:34:15 GMT</pubDate></item></channel></rss>