<?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[Rückgabe eines lokalen Vektors]]></title><description><![CDATA[<p>Ich möchte den Code mit C-Arrays gerne durch Vector Arrays ersetzen:</p>
<pre><code class="language-cpp">double * SimulationData::getSpectrumArray(int &amp; SizeX, int &amp; SizeY)
{
	SizeX = saveIteration;
	SizeY = ArrayDataPoints;
	double * Array = new double[SizeX * SizeY];
	memcpy(Array, &amp;SpectralAmplitudeArray[0], SizeX * SizeY * sizeof(double));
	return Array;
}
</code></pre>
<p>Wenn ich aber ein lokales vector Array erstelle wird das gelöscht bevor die Referenz zurückgegeben wird:</p>
<pre><code class="language-cpp">vector&lt;double&gt; &amp; SimulationData::getSpectrumArray(int &amp; SizeX, int &amp; SizeY)
{
	SizeX = saveIteration;
	SizeY = ArrayDataPoints;
	vector&lt;double&gt; Array;
	std::copy(SpectralAmplitudeArray.begin(), 
		  SpectralAmplitudeArray.begin() + SizeX * SizeY, 
		  Array.begin());
	return Array;
}
</code></pre>
<p>Wenn ich auf Pointer zurückgehen, habe ich den Vorteil des vectors nicht mehr, und würde dazu noch einen shared_ptr o. ä. basteln.</p>
<p>Welche Möglichkeiten hätte ich noch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241560/rückgabe-eines-lokalen-vektors</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 10:21:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241560.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 May 2009 13:31:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 13:31:30 GMT]]></title><description><![CDATA[<p>Ich möchte den Code mit C-Arrays gerne durch Vector Arrays ersetzen:</p>
<pre><code class="language-cpp">double * SimulationData::getSpectrumArray(int &amp; SizeX, int &amp; SizeY)
{
	SizeX = saveIteration;
	SizeY = ArrayDataPoints;
	double * Array = new double[SizeX * SizeY];
	memcpy(Array, &amp;SpectralAmplitudeArray[0], SizeX * SizeY * sizeof(double));
	return Array;
}
</code></pre>
<p>Wenn ich aber ein lokales vector Array erstelle wird das gelöscht bevor die Referenz zurückgegeben wird:</p>
<pre><code class="language-cpp">vector&lt;double&gt; &amp; SimulationData::getSpectrumArray(int &amp; SizeX, int &amp; SizeY)
{
	SizeX = saveIteration;
	SizeY = ArrayDataPoints;
	vector&lt;double&gt; Array;
	std::copy(SpectralAmplitudeArray.begin(), 
		  SpectralAmplitudeArray.begin() + SizeX * SizeY, 
		  Array.begin());
	return Array;
}
</code></pre>
<p>Wenn ich auf Pointer zurückgehen, habe ich den Vorteil des vectors nicht mehr, und würde dazu noch einen shared_ptr o. ä. basteln.</p>
<p>Welche Möglichkeiten hätte ich noch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714229</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Fri, 22 May 2009 13:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 13:33:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">vector&lt;double&gt; SimulationData::getSpectrumArray(int &amp; SizeX, int &amp; SizeY)
{
    SizeX = saveIteration;
    SizeY = ArrayDataPoints;
    vector&lt;double&gt; Array;
    std::copy(SpectralAmplitudeArray.begin(),
          SpectralAmplitudeArray.begin() + SizeX * SizeY,
          Array.begin());
    return Array;
}
</code></pre>
<p>Gib einfach eine Kopie zurück und keine Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714233</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 22 May 2009 13:33:15 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 13:34:51 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Welche Möglichkeiten hätte ich noch?</p>
</blockquote>
<ul>
<li>Rückgabetyp <code>std::vector&lt;double&gt;</code> und beten, dass (N)RVO richtig angewandt wird.</li>
<li>sicherer: einen <code>std::vector&lt;double&gt;&amp;</code> als Parameter. Leeren Container übergeben und füllen.</li>
</ul>
<p>Übrigens brauchst du <code>std::copy()</code> nicht, wenn du den Konstruktor von einer Iterator-Range einsetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714234</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 22 May 2009 13:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 13:40:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>pospiech schrieb:</p>
<blockquote>
<p>Welche Möglichkeiten hätte ich noch?</p>
</blockquote>
<ul>
<li>Rückgabetyp <code>std::vector&lt;double&gt;</code> und beten, dass (N)RVO richtig angewandt wird.</li>
<li>sicherer: einen <code>std::vector&lt;double&gt;&amp;</code> als Parameter. Leeren Container übergeben und füllen.</li>
</ul>
</blockquote>
<p>Bevor jemand den Code anfasst der RVO nicht kennt, und daran rumändert lasse ich es lieber ganz. Als Parameter war mir auch schon eingefallen, ist nur nicht ganz so schön.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Übrigens brauchst du <code>std::copy()</code> nicht, wenn du den Konstruktor von einer Iterator-Range einsetzt.</p>
</blockquote>
<p>Mir ist nicht klar was du meinst und wie es stattdessen aussehen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714238</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Fri, 22 May 2009 13:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 13:52:27 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Bevor jemand den Code anfasst der RVO nicht kennt, und daran rumändert lasse ich es lieber ganz.</p>
</blockquote>
<p>Was heisst &quot;lassen&quot;? Irgendwie musst du das Problem ja lösen. Und der Programmierer muss RVO nicht kennen, nur der Compiler.</p>
<p>pospiech schrieb:</p>
<blockquote>
<p>Als Parameter war mir auch schon eingefallen, ist nur nicht ganz so schön.</p>
</blockquote>
<p>Wenn Performance hier nicht entscheidend ist, machs mit einer Kopie als Rückgabewert. Gut möglich, dass das rausoptimiert wird (eben NRVO/RVO). Falls du dieses Risiko allerdings nicht eingehen kannst, musst du vielleicht Effizienz vor Eleganz stellen.</p>
<p>pospiech schrieb:</p>
<blockquote>
<p>Mir ist nicht klar was du meinst und wie es stattdessen aussehen sollte.</p>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/vector/vector/" rel="nofollow">Hier</a> siehst du die Konstruktoren von <code>std::vector</code> . Der dritte hat folgende Deklaration:</p>
<pre><code class="language-cpp">template &lt;class InputIterator&gt;
vector (InputIterator first, InputIterator last, const Allocator&amp; = Allocator());
</code></pre>
<p>Also könntest du in deinem Beispiel gleich die Iterator-Range an den Konstruktor übergeben:</p>
<pre><code class="language-cpp">std::vector&lt;double&gt; Array(
    SpectralAmplitudeArray.begin(),
    SpectralAmplitudeArray.begin() + SizeX * SizeY);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1714245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714245</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 22 May 2009 13:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines lokalen Vektors on Fri, 22 May 2009 14:01:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Bevor jemand den Code anfasst der RVO nicht kennt, und daran rumändert lasse ich es lieber ganz. Als Parameter war mir auch schon eingefallen, ist nur nicht ganz so schön.</p>
</blockquote>
<p>RVO ist, wie es der Name sagt eine Optimierung und hat (ausser in merkwürdigen Konstrukten) keine Nebenwirkungen auf den Sinn des Codes.</p>
<p>In anbetracht der Exceptionsicherheit ist der Parameter wohl am besten geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714256</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 22 May 2009 14:01:57 GMT</pubDate></item></channel></rss>