<?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[[gelöst] Inhalt eines Vectors tauschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bräuchte mal ein bisschen denkhilfe:</p>
<pre><code class="language-cpp">class MyClass;
typedef std::vector&lt;MyClass*&gt; MyVector;

MyVector Veci;

Veci.push_back(new MyClass(0));

MyClass* M1 = new MyClass(1);
Veci.push_back(M1);

Veci.push_back(new MyClass(2));

MyClass* M3 = new MyClass(3);
Veci.push_back(M3);

Veci.push_back(new MyClass(4));
</code></pre>
<p>Ich müsste nun die Position 1 mit Position 3 tauschen OHNE einen Copy-CTor anzuwerfen.</p>
<p>Bisher mache ich das so:</p>
<pre><code class="language-cpp">MyVector::iterator iteins = std::find(Veci.begin(),Veci.end(),M1);
MyVector::iterator itdrei = std::find(Veci.begin(),Veci.end(),M3);
Veci.insert(iteins, *itdrei);
Veci.insert(itdrei , *iteins);
Veci.erase(iteins);
Veci.erase(itdrei);
</code></pre>
<p>Sprich, ich suche die Iteratoren, füge jeweils vor den Treffern eine Kopie des anderen als Zeiger ein und lösche die Ursprünglichen.<br />
Klappt, wirkt mir aber etwas sehr kompliziert.</p>
<p>Gibt es da einen leichteren Weg?</p>
<p>Ich hab das gleiche Problem auch noch bei Listen, bei denen ich fürs Tauschen NUR die Iteratoren habe. Daher wäre mir eine Lösung die anhand von Iteratoren für Liste und für Vector funktioniert am Liebsten.</p>
<p>Kennt jemand ein paar Befehle für mich und aus diesen 4 Befehlen (sehr rechenaufwändig) evtl. 1-2 (rechenleichte) Befehle zu machen und trotzdem keinen Copy-Constructor zu verwenden?</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278981/gelöst-inhalt-eines-vectors-tauschen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 20:19:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278981.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Dec 2010 16:41:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Fri, 17 Dec 2010 08:12:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bräuchte mal ein bisschen denkhilfe:</p>
<pre><code class="language-cpp">class MyClass;
typedef std::vector&lt;MyClass*&gt; MyVector;

MyVector Veci;

Veci.push_back(new MyClass(0));

MyClass* M1 = new MyClass(1);
Veci.push_back(M1);

Veci.push_back(new MyClass(2));

MyClass* M3 = new MyClass(3);
Veci.push_back(M3);

Veci.push_back(new MyClass(4));
</code></pre>
<p>Ich müsste nun die Position 1 mit Position 3 tauschen OHNE einen Copy-CTor anzuwerfen.</p>
<p>Bisher mache ich das so:</p>
<pre><code class="language-cpp">MyVector::iterator iteins = std::find(Veci.begin(),Veci.end(),M1);
MyVector::iterator itdrei = std::find(Veci.begin(),Veci.end(),M3);
Veci.insert(iteins, *itdrei);
Veci.insert(itdrei , *iteins);
Veci.erase(iteins);
Veci.erase(itdrei);
</code></pre>
<p>Sprich, ich suche die Iteratoren, füge jeweils vor den Treffern eine Kopie des anderen als Zeiger ein und lösche die Ursprünglichen.<br />
Klappt, wirkt mir aber etwas sehr kompliziert.</p>
<p>Gibt es da einen leichteren Weg?</p>
<p>Ich hab das gleiche Problem auch noch bei Listen, bei denen ich fürs Tauschen NUR die Iteratoren habe. Daher wäre mir eine Lösung die anhand von Iteratoren für Liste und für Vector funktioniert am Liebsten.</p>
<p>Kennt jemand ein paar Befehle für mich und aus diesen 4 Befehlen (sehr rechenaufwändig) evtl. 1-2 (rechenleichte) Befehle zu machen und trotzdem keinen Copy-Constructor zu verwenden?</p>
<p>Danke,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995452</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Fri, 17 Dec 2010 08:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Thu, 16 Dec 2010 16:47:40 GMT]]></title><description><![CDATA[<p>...und wie ich gerade festgestellt habe bekomme ich auch Speicherschutzverletzungen, weil nach dem ersten einfügen meine Iteratoren nicht mehr gültig sind. *fluch*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995458</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Thu, 16 Dec 2010 16:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Thu, 16 Dec 2010 16:48:30 GMT]]></title><description><![CDATA[<p>Greif doch über die Iteratoren auf die Elemente zu, dafür sind sie doch da. Dann tauscht du den Inhalt der Elemente. Dazu ist ein Copykonstruktor/Zuweisungsoperator quasi unvermeidlich. Da bloß zwei Zeiger getauscht werden verstehe ich nicht, warum du dich dagegen sperrst. Was meinst du wie oft diese Funktionen wohl bei deiner insert-erase-Orgie benutzt werden?</p>
<p>P.S.: Und ich hoffe doch, dass dies nur zu Übungszwecken ist und du nicht wirklich so mit Zeigern hantierst wie hier gezeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995459</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 16 Dec 2010 16:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Thu, 16 Dec 2010 17:01:44 GMT]]></title><description><![CDATA[<p>Ich meine bei CopyConstructor nicht einen für Zeiger. Sondern einen, der mein ganzes Element kopiert, denn ich nutze Fremdklassen und die sind ...sagen wir mal... nicht sehr zuverlässig bei CopyConsrtuctoren in Sachen Zeigerelemente innerhalb der verwendeten Klasse. Gegen Zeiger-Copy-Constructoren hab ich nix, weil die hab ich ja im Griff.</p>
<p>Zu übungszewcken ist es nicht, sondern eher der erste Entwurf eines Klassen-Templates für eine gefilterte Sortierung verscheidener Midi-Befehle (Beispiel: Berechnung von Obertönen für Mixturen bei Orgelmusik).</p>
<p>Mit Klassen-Templates hab ich noch nicht wirklich viel erfahrung gemacht und momentan stehe ich jetzt an dem folgenden Punkt:</p>
<pre><code class="language-cpp">template &lt;typename Arg_Type, typename Inlay_Type&gt;
bool ListSort&lt;Arg_Type, Inlay_Type&gt;::ListMoveSwitchPos(typename Arg_Type::iterator&amp; theItToMove, typename Arg_Type::iterator&amp; theItToSwitch)
{
  return false;
}

// Anwendung
typedef MyClass* ListInnen;
typedef std::list&lt;ListInnen&gt; ListAusen;

ListAusen MyListe;
// Daten in die Liste
ListSort&lt;ListAusen, ListInnen&gt; Sortierer(&amp;MyListe);
Sortierer.OrderNachObertonreihe(); // Hier werden jetzt viele viele Sortierungen vorgenommen und doppelte Töne nach Laufstärke sortiert und die leisesten fallen raus.
</code></pre>
<p>Ein Template wird es deswegen, weil meine Midi-Schnittstelle von meinem Freund hier teilweise mit vector und teilweise mit list arbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995463</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Thu, 16 Dec 2010 17:01:44 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Thu, 16 Dec 2010 17:50:16 GMT]]></title><description><![CDATA[<p>stefanjann schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">class MyClass;
typedef std::vector&lt;MyClass*&gt; MyVector;
// ...
</code></pre>
<p>Ich müsste nun die Position 1 mit Position 3 tauschen OHNE einen Copy-CTor anzuwerfen.</p>
</blockquote>
<p>Also entweder verstehe ich dein Problem nicht wirklich, oder du verstehst dein eigenes Problem nicht. Solange du in dem Vector nur Zeiger hältst, und nur diese tauschst, wird niemals ein Kopierkonstruktor aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995486</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 16 Dec 2010 17:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Thu, 16 Dec 2010 18:15:36 GMT]]></title><description><![CDATA[<p>Äh...</p>
<pre><code class="language-cpp">std::swap(Veci[1], Veci[3]);
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995492</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 16 Dec 2010 18:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Inhalt eines Vectors tauschen on Fri, 17 Dec 2010 08:11:45 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Also entweder verstehe ich dein Problem nicht wirklich, oder du verstehst dein eigenes Problem nicht. Solange du in dem Vector nur Zeiger hältst, und nur diese tauschst, wird niemals ein Kopierkonstruktor aufgerufen.</p>
</blockquote>
<p>Hallo,<br />
also ich glaube &quot;ich verstehe mein Problem nicht.&quot;</p>
<p>Ich hab gestern noch ein bisschen &quot;gespielt&quot; und mir die Sache mit den Copy-Constructor nochmal zu herzen geführt. Und auch nochmal (zum tausendsten Mal) das Prinzip Zeiger, Referenzen und operator= durchgelesen.</p>
<p>Tja, also PHP und JavaScript programmierer muss man sich da halt keine Gedanken machen. Aber jetzt unter C++ ist das halt wichtig. Ich will halt eine stabile und schnelle Klasse schreiben.</p>
<p>Aber du hast recht, da ich ja &quot;nur&quot; Zeiger habe ist das kein Problem. Und wenn ich nicht will, dass ein Copy-Constructor innerhalb einer Klasse definiert werden muss, dann lege ich halt &quot;nur&quot; Zeiger in der Liste ab und beachte beim d'tor, den Vector mit &quot;delete&quot;s aufzuräumen und plötzlich: Kein Problem mehr.</p>
<p>Sorry, da bin ich gestern wohl etwas &quot;auf der Leitung&quot; gesessen. Tja ich hab halt &quot;erst&quot; ein Jahr Praxis mit C++.<br />
Danke für euch.</p>
<p>Achja:</p>
<p>seldon  schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::swap(Veci[1], Veci[3]);
</code></pre>
</blockquote>
<p>machts richtig.</p>
<p>Grüße,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1995664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1995664</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Fri, 17 Dec 2010 08:11:45 GMT</pubDate></item></channel></rss>