<?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[sehr viele Listen kopieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal angenommen, ich habe ein Programm, das ständig Listen kopieren muß, und zwar so schnell wie möglich und nicht nur die Pointer sondern die kompletten Objekte, dann kann ich das ja z.B. so machen:</p>
<pre><code>std::list&lt;Object*&gt; list;
std::list&lt;Object*&gt; copy;

std::list&lt;Object*&gt;::iterator iter = list.begin();

while(iter != list.end())
    copy.push_back(new Object(**iter));
</code></pre>
<p>Allerdings ist das natürlich etwas zeitraubend, da ich die Objekte alle über den Copykonstruktor kopieren muß und natürlich komplett über die alte Liste iteriere.</p>
<p>Cool wäre es, wenn ich einfach per memcopy einen kompletten Speicherbereich kopieren könnte. Das würde gehen, wenn ich Arrays verwende und keine Listen. Aber es muß in meinem Fall definitiv eine Liste sein - möglicherweise sogar ein Tree (ist noch nicht ganz sicher).</p>
<p>Gibt es da auch irgendwie eine Möglichkeit, dafür zu sorgen, daß alle Objekte schön hintereinander liegen? Also sowohl bei 'ner Liste als auch bei 'nem Tree? Oder kommt man da um Arrays nicht drumrum?</p>
<p>Der vector-Container benutzt intern soweit ich weiß Arrays. Wäre es damit evtl. möglich? Ich nehme mal an, dann dürfte ich halt keine Pointer verwenden sondern müßte die Objekte direkt drin speichern.</p>
<p>Hat jemand 'ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218979/sehr-viele-listen-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 15:10:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218979.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jul 2008 09:01:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 09:01:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal angenommen, ich habe ein Programm, das ständig Listen kopieren muß, und zwar so schnell wie möglich und nicht nur die Pointer sondern die kompletten Objekte, dann kann ich das ja z.B. so machen:</p>
<pre><code>std::list&lt;Object*&gt; list;
std::list&lt;Object*&gt; copy;

std::list&lt;Object*&gt;::iterator iter = list.begin();

while(iter != list.end())
    copy.push_back(new Object(**iter));
</code></pre>
<p>Allerdings ist das natürlich etwas zeitraubend, da ich die Objekte alle über den Copykonstruktor kopieren muß und natürlich komplett über die alte Liste iteriere.</p>
<p>Cool wäre es, wenn ich einfach per memcopy einen kompletten Speicherbereich kopieren könnte. Das würde gehen, wenn ich Arrays verwende und keine Listen. Aber es muß in meinem Fall definitiv eine Liste sein - möglicherweise sogar ein Tree (ist noch nicht ganz sicher).</p>
<p>Gibt es da auch irgendwie eine Möglichkeit, dafür zu sorgen, daß alle Objekte schön hintereinander liegen? Also sowohl bei 'ner Liste als auch bei 'nem Tree? Oder kommt man da um Arrays nicht drumrum?</p>
<p>Der vector-Container benutzt intern soweit ich weiß Arrays. Wäre es damit evtl. möglich? Ich nehme mal an, dann dürfte ich halt keine Pointer verwenden sondern müßte die Objekte direkt drin speichern.</p>
<p>Hat jemand 'ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554954</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 Jul 2008 09:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 09:17:54 GMT]]></title><description><![CDATA[<p>list oder map kann man nicht mit memcpy kopieren.<br />
vector geht ohne Probleme mit memcpy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554964</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Mon, 28 Jul 2008 09:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 09:29:54 GMT]]></title><description><![CDATA[<p>templäd schrieb:</p>
<blockquote>
<p>list oder map kann man nicht mit memcpy kopieren.<br />
vector geht ohne Probleme mit memcpy.</p>
</blockquote>
<p>Auch für nicht-PODs mit überladenem <code>operator=</code> ? Nicht, dass ich wüsste. Dafür ist 'std::copy' da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554969</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 28 Jul 2008 09:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 10:06:35 GMT]]></title><description><![CDATA[<p>copy.push_back(new Object(**iter));</p>
<p>mach daraus ein</p>
<p>copy.push_back(*iter);</p>
<p>wenn du nicht kopieren willst.</p>
<p>und lass memcpy in ruhe. memcpy ist idR die falsche antwort - egal worum es geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554984</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 28 Jul 2008 10:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 11:02:03 GMT]]></title><description><![CDATA[<p>Richtig. Für nicht PODs geht's natürlich nicht <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="😉"
    /><br />
Aber memcpy als schön gekapselten Optimierungsmaßnahme ist vollkomen ok.<br />
Sollte man natürlich erst dann machen, wenn klar ist, dass das std::copy der Flaschenhals ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555000</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Mon, 28 Jul 2008 11:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 11:12:53 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>copy.push_back(new Object(**iter));</p>
<p>mach daraus ein</p>
<p>copy.push_back(*iter);</p>
<p>wenn du nicht kopieren willst.</p>
<p>und lass memcpy in ruhe. memcpy ist idR die falsche antwort - egal worum es geht.</p>
</blockquote>
<p>Naja mir geht's schon ums Kopieren <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="😉"
    /> daher muß ich da schon den Copy-Konstruktor aufrufen.</p>
<p>Aber stimmt, mit memcpy wird's problematisch sobald innen drin nochmal Pointer sind. Hängt dann aber irgendwie auch vom Anwendungsfall ab, es könnte ja durchaus sein daß es okay ist, wenn es keine Deep-Copy wird.</p>
<p>std::copy kenne ich noch nicht, das werd ich mir mal anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555004</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 Jul 2008 11:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 14:44:05 GMT]]></title><description><![CDATA[<p>Also wenn ich std::copy einsetze, dann geht es immerhin 4x so schnell. Allerdings muß ich dann natürlich Object und nicht Object* speichern. Werde mir das als mögliche Lösung mal offenhalten.</p>
<p>Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555087</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to sehr viele Listen kopieren on Mon, 28 Jul 2008 15:43:18 GMT]]></title><description><![CDATA[<p>Naja, wenn du die Objekte kopieren möchtest, auf welche der Zeiger in der Liste zeigt, dann gibt es da auch ein paar Möglichkeiten. Eine wäre zum Beispiel folgendes:</p>
<pre><code class="language-cpp">#include &lt;iterator&gt; // std::back_inserter
#include &lt;algorithm&gt; // std::transform

struct CopyValue
{
  template&lt;typename ValueT&gt;
  ValueT* operator ()(ValueT const* const pvalue)
  { return new ValueT(*pvalue); };
};

std::list&lt;Object*&gt; list;        // Erste Liste
std::list&lt;Object*&gt; resultList;  // Zweite Liste

// Kopiervorgang:
std::transform(list.begin(), list.end(), std::back_inserter(resultList), CopyValue());
</code></pre>
<p>Natürlich dann das <code>delete</code> auf allen Objekten in der zweiten Liste nicht vergessen <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555109</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 28 Jul 2008 15:43:18 GMT</pubDate></item></channel></rss>