<?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[Funktion gibt Vector zurück]]></title><description><![CDATA[<p>Mal die Frage, ist es eigentlich so üblich/richtig, dass eine Funktion einen Vector zurück gibt? Ich habe der Logik wegen jetzt nur mal so gedacht, wenn man einen Typ definiert:</p>
<pre><code class="language-cpp">typedef vector&lt;typ&gt; vector_t
</code></pre>
<p>und dann hinterher eine Funktion hat:</p>
<pre><code class="language-cpp">vector_t eineFunktion()
{
//erzeuge Vector
return vector;
}
</code></pre>
<p>was dann zu meinem Erstaunen tatsächlich auch so funktioniert hat. Zumindest in einem kleinem Test, den ich dafür gemacht habe, wurden die Daten so ausgespuckt, wie bei einem gewöhnlichem Vektoraufruf.</p>
<pre><code class="language-cpp">cout&lt;&lt;eineFunktion()[i]&lt;&lt;endl;
</code></pre>
<p>Ist das eine übliche Vorgehensweise oder muss man das generell anders machen. Wenn ja, ist die Übergabe beliebiger Typen aus Funktionen heraus generell immer so machbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226309/funktion-gibt-vector-zurück</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 01:17:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226309.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Oct 2008 05:22:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 05:22:29 GMT]]></title><description><![CDATA[<p>Mal die Frage, ist es eigentlich so üblich/richtig, dass eine Funktion einen Vector zurück gibt? Ich habe der Logik wegen jetzt nur mal so gedacht, wenn man einen Typ definiert:</p>
<pre><code class="language-cpp">typedef vector&lt;typ&gt; vector_t
</code></pre>
<p>und dann hinterher eine Funktion hat:</p>
<pre><code class="language-cpp">vector_t eineFunktion()
{
//erzeuge Vector
return vector;
}
</code></pre>
<p>was dann zu meinem Erstaunen tatsächlich auch so funktioniert hat. Zumindest in einem kleinem Test, den ich dafür gemacht habe, wurden die Daten so ausgespuckt, wie bei einem gewöhnlichem Vektoraufruf.</p>
<pre><code class="language-cpp">cout&lt;&lt;eineFunktion()[i]&lt;&lt;endl;
</code></pre>
<p>Ist das eine übliche Vorgehensweise oder muss man das generell anders machen. Wenn ja, ist die Übergabe beliebiger Typen aus Funktionen heraus generell immer so machbar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607756</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Fri, 31 Oct 2008 05:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 06:19:01 GMT]]></title><description><![CDATA[<p>wieso sollte dies nich gehen???</p>
<pre><code class="language-cpp">vector&lt;int&gt; func1(){
    vector&lt;int&gt; tmp;
    return tmp; 
}

vector&lt;int&gt; h= func1();
</code></pre>
<p>Hier wird einfach der komplette vector + inhalt kopiert und zurückgegeben.</p>
<p>Es gibt keine Probleme, solange das objekt welche du zurückggibt kopiert wird, wird ein pointer zurückgegeben oder refenz sieht die sache anderes aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607784</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 31 Oct 2008 06:19:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 06:49:43 GMT]]></title><description><![CDATA[<p>Also kann man das auch so mittels Memberfunktionen über Klassen machen.</p>
<pre><code class="language-cpp">CKlasse c
cout&lt;&lt;c.eineFunktion()[i]&lt;&lt;endl;
</code></pre>
<blockquote>
<p>wird ein pointer zurückgegeben oder refenz sieht die sache anderes aus.</p>
</blockquote>
<p>Genau das hatte ich mir schon gedacht. Worauf muss man dann achten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607801</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Fri, 31 Oct 2008 06:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 07:03:29 GMT]]></title><description><![CDATA[<p>dixidix schrieb:</p>
<blockquote>
<p>Also kann man das auch so mittels Memberfunktionen über Klassen machen.</p>
<pre><code class="language-cpp">CKlasse c
cout&lt;&lt;c.eineFunktion()[i]&lt;&lt;endl;
</code></pre>
</blockquote>
<p>Ja, das ist aber sehr ineffizient, weil bei jedem Aufruf der kompletet Vector neu erzeugt und kopiert wird.</p>
<blockquote>
<p>Genau das hatte ich mir schon gedacht. Worauf muss man dann achten?</p>
</blockquote>
<p>Darauf, dass das Objekt nach dem Funktionsaufruf noch weiterlebt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607807</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 31 Oct 2008 07:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 07:06:17 GMT]]></title><description><![CDATA[<p>dixidix schrieb:</p>
<blockquote>
<blockquote>
<p>wird ein pointer zurückgegeben oder refenz sieht die sache anderes aus.</p>
</blockquote>
<p>Genau das hatte ich mir schon gedacht. Worauf muss man dann achten?</p>
</blockquote>
<p>Na ja, kleines Beispiel, was man nicht machen darf:</p>
<pre><code class="language-cpp">int *myFunc() {
  int i=5;  //lokal angelegt
  return &amp;i;
}

int *i=myFunc();  //Funktion wird beendet, der Pointer verliert seine Gültigkeit
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1607808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607808</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 31 Oct 2008 07:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 07:56:10 GMT]]></title><description><![CDATA[<p>Also so ?:</p>
<pre><code class="language-cpp">int i=5;  //ausserhalb angelegt

int *myFunc() {

  return &amp;i;
}

int *i=myFunc();  //Funktion wird beendet, der Pointer bleibt gültig?
</code></pre>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>dixidix schrieb:</p>
<blockquote>
<p>Also kann man das auch so mittels Memberfunktionen über Klassen machen.</p>
<pre><code class="language-cpp">CKlasse c
cout&lt;&lt;c.eineFunktion()[i]&lt;&lt;endl;
</code></pre>
</blockquote>
<p>Ja, das ist aber sehr ineffizient, weil bei jedem Aufruf der kompletet Vector neu erzeugt und kopiert wird.</p>
<blockquote>
<p>Genau das hatte ich mir schon gedacht. Worauf muss man dann achten?</p>
</blockquote>
<p>Darauf, dass das Objekt nach dem Funktionsaufruf noch weiterlebt.</p>
</blockquote>
<p>Na gut, dürfte je nach Verwendungszweck zu beurteilen sein. Bei kleinen Vectoren wäre das sicher kein Problem, oder? Wie ginge es effizienter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607818</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Fri, 31 Oct 2008 07:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 07:59:45 GMT]]></title><description><![CDATA[<p>Globale Variablen solltest du vermeiden, wenn's geht. Also nein, so lieber nicht. Du kannst entweder die Variable erhalten, indem du sie in der Funktion mit static deklarierst (Google is your friend), oder du übergibst bereits einen Pointer an die Funktion, der dann gefüllt wird. Das ist in dem Fall sinnvoller (weil richtig!), als über den Rückgabewert zu gehen.</p>
<pre><code class="language-cpp">void myFunc(int *i) {
  *i=5;  
}

int myIntVar;
myFunc(&amp;myIntVar);
</code></pre>
<p>So hältst du dir auch den Rückgabewert frei, um z.B. einen Errorcode zurückzugeben. Außerdem kann eine Funktion auf diese Weise nicht nur einen, sondern gleich mehrere Werte &quot;zurückgeben&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607825</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 31 Oct 2008 07:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 08:20:10 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>In C++ gibts Referenzen. Hier einen Pointer zu benutzen ist überflüssig:</p>
<pre><code class="language-cpp">void someFunct(int &amp;a)
{
   a = 10;
}

//
int var;
someFunkt(var); //var ist nach dem Aufruf 10
</code></pre>
<p>Um Fehler bei Funktionen mit Rückgabewerten zu signalisieren, gibt es Exceptions.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607841</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 31 Oct 2008 08:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 08:34:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class MyData{
... 
 vector&lt;int&gt; data;
...
 vector&lt;int&gt; &amp;Get(){ return data; }
...
};

MyData obj;

int i= obj.Get()[x];
</code></pre>
<p>Der vector existiert durch das MyData Objekt.</p>
<p>Jetzt kann du die referenz des vetcor zurückgeben, weil der vector ja durch die Mydata Instanz exisitert auch nach dem Funktionsauruf.</p>
<p>würdest du sowas machen</p>
<pre><code class="language-cpp">vector&lt;int&gt; y= obj.Get();
</code></pre>
<p>würde zwar der Vector zurüggeben werden, aber durch das &quot;=&quot; Zuweisung trozdm in y kopiert werden.</p>
<p>Hier würde der Vector glaub sogar doppelt kopiert werden fällt mir ein:</p>
<pre><code class="language-cpp">vector&lt;int&gt; func1(){
    vector&lt;int&gt; tmp;
    return tmp;
}

vector&lt;int&gt; h= func1();
</code></pre>
<p>Rückgabe : Kopy Kosntruktor<br />
&quot;=&quot; : Zuweisungsoperator (Kopykonstruktor)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607853</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 31 Oct 2008 08:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 08:36:41 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>_matze schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>In C++ gibts Referenzen. Hier einen Pointer zu benutzen ist überflüssig</p>
</blockquote>
<p>An Referenzen stört mich, dass man an der aufrufenden Stelle nicht erkennen kann, ob sich der Wert der Variable nun verändert oder nicht. Vielleicht nur ein Detail, aber störend.</p>
<p>Und im Beispiel ist die Übergabe eines Pointers doch unkritisch und genauso vertretbar wie eine Referenz, oder nicht?</p>
<p>Zumal viele im Berufsleben eben nicht nur reines C++ programmieren können, sondern wie ich durchaus oft mit C-Code in Berührung kommen. Deshalb ist es in meinen Augen ratsam, sich auch mit Pointern auszukennen, um sich gut in bestehenden Code einarbeiten zu können bzw. auch mit einem C-Compiler nicht allein im Wald zu stehen. Zumal Pointer natürlich ebenso ein Bestandteil von C++ sind wie Referenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607857</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 31 Oct 2008 08:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 08:50:48 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>An Referenzen stört mich, dass man an der aufrufenden Stelle nicht erkennen kann, ob sich der Wert der Variable nun verändert oder nicht. Vielleicht nur ein Detail, aber störend.</p>
</blockquote>
<p>Das erkennt man bei Pointern auch nicht.<br />
Aber nur mal so als Tip: Wenn Referenzen const sind, wird nichts geändert, wenn nicht, höchstwahrscheinlich schon.</p>
<p>Der Rest Deiner Argumentation ist darin begründet, dass Du (sorry, dass ich das so sage) eher ein C mit Klassen Programmierer bist, als ein C++ Programmierer. Die meisten Deiner Posts hier zeigen das.<br />
Pointer nimmt man eigentlich nur, wenn auch nicht gültige Objekte übergeben werden sollen, soll heißen: 0-Zeiger. Ansonsten nimmt man doch besser Referenzen.</p>
<p>EDIT: Und weil auch ein 0-Zeiger übergeben werden kann, ist Dein Beispiel eben doch nicht so unkritisch. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1607868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607868</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 31 Oct 2008 08:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 08:55:52 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Das erkennt man bei Pointern auch nicht.</p>
</blockquote>
<p>Na ja, ich sehe bei der Übergabe entweder den Adressoperator oder den &quot;p&quot;-Präfix, insofern sehe <em>ich</em> zumindest schon, ob eine Variable potenziell geändert wird.</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Der Rest Deiner Argumentation ist darin begründet, dass Du (sorry, dass ich das so sage) eher ein C mit Klassen Programmierer bist, als ein C++ Programmierer. Die meisten Deiner Posts hier zeigen das.</p>
</blockquote>
<p>Kein Problem, du hast ja Recht. Liegt eben daran, dass bei uns der Source zu 50% aus C-Code und zu 50% aus C-Code mit Klassen besteht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Aber ich vermute, dass ich nicht der einzige bin, dem es so geht. Daher ist ein Anfänger in meinen Augen gut beraten, beides mal kennenzulernen.</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Pointer nimmt man eigentlich nur, wenn auch nicht gültige Objekte übergeben werden sollen, soll heißen: 0-Zeiger. Ansonsten nimmt man doch besser Referenzen.</p>
<p>EDIT: Und weil auch ein 0-Zeiger übergeben werden kann, ist Dein Beispiel eben doch nicht so unkritisch. <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>
</blockquote>
<p>Gut, an dem Null-Pointer-Argument ist was dran...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607879</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 31 Oct 2008 08:55:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion gibt Vector zurück on Fri, 31 Oct 2008 13:12:39 GMT]]></title><description><![CDATA[<p>Zeiger würde ich dort einsetzen, wo mehr Flexibilität gefragt ist, also beispielsweise in Datenstrukturen oder bei dynamischer Speicherverwaltung. Also wenn nicht von Anfang an auf ein Objekt verwiesen wird oder das referenzierte Objekt wechselt.</p>
<p>Wenn es möglich ist, verwende ich lieber Referenzen, vor allem bei Parameterübergabe. C++ hat da ja auch ganz besondere Regelungen bezüglich der Bindung von Const-Referenzen an temporäre Variablen. Damit werden einem z.B. auch Standardparameter mit Const-Referenzen ermöglicht, was bei Pointern nicht geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608057</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 31 Oct 2008 13:12:39 GMT</pubDate></item></channel></rss>