<?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[Algorithmus zum vertauschen von Ranges gesucht]]></title><description><![CDATA[<p>ALso, das ist mein Problem:</p>
<p>ich habe einen std::vector, der wie folgt aufgebaut ist:</p>
<pre><code>|start....|range1|........range2......|range3|....end|
</code></pre>
<p>und ich muss range1 und range3 im vector tauschen, ohne die Reihenfolge der Elemente von range2 zu verändern. Klingt zuerst wie eine Aufgabe für std::swap_ranges. Aber leider haben range1 und range3 eine unterschiedliche Größe.<br />
Ich dachte, dass das eigentlich ein Standardproblem sein muss, finde aber leider keinen Algorithmus in der Standardbibliothek. Ich würde nur ungern auf vector::insert und vector::erase ausweichen, da ich gerne vermeiden würde, dass a) neuallokiert und b) alle Elemente verschoben werden.</p>
<p>Mein Ansatz momentan ist, dass ich zuerst swap_ranges verwende um min(range1.size(),range3.size()) elemente von range1 und range3 zu swappen. Dann wäre ich im Folgenden in diesem Spezialfall (angenommen range3.size()&lt;range2.size()):</p>
<pre><code>|start....|range1|range2|....end|
</code></pre>
<p>Das heißt range 3 ist leer und ich muss die elemente von range1 und range2 austauschen.<br />
auch hier dachte ich, dass das eigentlich ein Standardproblem sein müsste. Hier bin ich nun aber überfragt, wie man das effizient machen könnte. Jemand eine Idee? :). Für den Fall range2.size()&gt;range1.size() hätte ich spontan swap_ranges verwendet und solange range1 nach rechts verschoben, bis ich in dem Fall bin, dass der Rest von range2 kleiner ist als range1. Ich könnte nun anfangen range2 von rechts nach links zu verschieben, und das so lange machen, bis alle Elemente an ihrem Platz sind...aber irgendwie klingt das nicht sonderlich effizient.</p>
<p>Irgendwelche Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316621/algorithmus-zum-vertauschen-von-ranges-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 22:30:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316621.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 May 2013 14:23:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Algorithmus zum vertauschen von Ranges gesucht on Fri, 10 May 2013 14:23:50 GMT]]></title><description><![CDATA[<p>ALso, das ist mein Problem:</p>
<p>ich habe einen std::vector, der wie folgt aufgebaut ist:</p>
<pre><code>|start....|range1|........range2......|range3|....end|
</code></pre>
<p>und ich muss range1 und range3 im vector tauschen, ohne die Reihenfolge der Elemente von range2 zu verändern. Klingt zuerst wie eine Aufgabe für std::swap_ranges. Aber leider haben range1 und range3 eine unterschiedliche Größe.<br />
Ich dachte, dass das eigentlich ein Standardproblem sein muss, finde aber leider keinen Algorithmus in der Standardbibliothek. Ich würde nur ungern auf vector::insert und vector::erase ausweichen, da ich gerne vermeiden würde, dass a) neuallokiert und b) alle Elemente verschoben werden.</p>
<p>Mein Ansatz momentan ist, dass ich zuerst swap_ranges verwende um min(range1.size(),range3.size()) elemente von range1 und range3 zu swappen. Dann wäre ich im Folgenden in diesem Spezialfall (angenommen range3.size()&lt;range2.size()):</p>
<pre><code>|start....|range1|range2|....end|
</code></pre>
<p>Das heißt range 3 ist leer und ich muss die elemente von range1 und range2 austauschen.<br />
auch hier dachte ich, dass das eigentlich ein Standardproblem sein müsste. Hier bin ich nun aber überfragt, wie man das effizient machen könnte. Jemand eine Idee? :). Für den Fall range2.size()&gt;range1.size() hätte ich spontan swap_ranges verwendet und solange range1 nach rechts verschoben, bis ich in dem Fall bin, dass der Rest von range2 kleiner ist als range1. Ich könnte nun anfangen range2 von rechts nach links zu verschieben, und das so lange machen, bis alle Elemente an ihrem Platz sind...aber irgendwie klingt das nicht sonderlich effizient.</p>
<p>Irgendwelche Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322444</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 10 May 2013 14:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmus zum vertauschen von Ranges gesucht on Fri, 10 May 2013 14:51:10 GMT]]></title><description><![CDATA[<blockquote>
<p>alle Elemente verschoben werden</p>
</blockquote>
<p>Wie soll das denn bei einem std::vector verhindert werden. Benutze std::list oder eben eine Indexmenge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322449</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 10 May 2013 14:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmus zum vertauschen von Ranges gesucht on Fri, 10 May 2013 15:04:04 GMT]]></title><description><![CDATA[<p>ABBCCCD</p>
<p>jetzt ein swap von B und C führt zu der blöden Situation:<br />
ACCBBCD<br />
wie soll das letzte C nun ohne probleme an die korrekte stelle kommen?</p>
<p>Was man in solchen Situationen manchmal macht ist folgendes:<br />
du erstellst einen vector mit alle indices aus dem 1. vector:<br />
1234567<br />
und dann swapst du die ranges mit kopieren und einfügen, wie man es eben normal machen würde - da du aber nur ints hast, ist der aufwand trivial.<br />
dann hast du<br />
1456237<br />
als ergebnis und nun einfach durchswapen im echten vector.</p>
<p>alternativ kannst du dir auch ein move_range schreiben, das per swap Elemente verschiebt - bedeutet halt sehr viele swaps, mag aber effizient sein wenn du sehr große vectoren hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322453</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 10 May 2013 15:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmus zum vertauschen von Ranges gesucht on Fri, 10 May 2013 15:13:38 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>ABBCCCD</p>
<p>jetzt ein swap von B und C führt zu der blöden Situation:<br />
ACCBBCD<br />
wie soll das letzte C nun ohne probleme an die korrekte stelle kommen?</p>
</blockquote>
<p>genau an dem Punkt war ich auch. In dem Fall könntest du C rückwärts tauschen:</p>
<p>ACCBBCD -&gt; ACCBCBD -&gt; ACCCBBD</p>
<p>Aber du hast recht: auch nach diesem Tausch könnte ich wieder in dieselbe Situation kommen. Das heißt irgendwann sollte ich vielleicht doch ein Array auf dem Stack anlegen und den als Zwischenspeicher verwenden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>: das ich alle Elemente zwischen range und range3 verschieben muss, ist mir klar. Aber der vector ist viel Größer. Das Ding speichert die Einträge einer sparse-matrix im CSR Format und ich muss in dieser Matrix Zeilen tauschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322455</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 10 May 2013 15:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmus zum vertauschen von Ranges gesucht on Sat, 11 May 2013 00:11:53 GMT]]></title><description><![CDATA[<p>Verstehe grad das Problem nicht.<br />
Nach dem Tauschen des <code>min(range1.size(),range3.size())</code> Bereichs bleibt bloss noch ein Bereich übrig der um N Plätze nach links oder rechts rotiert werden muss.<br />
Was sich halbwegs einfach und performant &quot;in place&quot; bewerkstelligen lässt:<br />
<a href="http://leetcode.com/2010/04/rotating-array-in-place.html" rel="nofollow">http://leetcode.com/2010/04/rotating-array-in-place.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322562</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 11 May 2013 00:11:53 GMT</pubDate></item></channel></rss>