<?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[Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen?]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich stehe vor einem Problem.<br />
Ich habe in einer Klasse einige Vektoren. Zum Beispiel:</p>
<pre><code>vector&lt;int&gt; a (4,0xFF);
vector&lt;int&gt; b (2,0x00);
vector&lt;int&gt; c;
vector&lt;int&gt; d;
vector&lt;int&gt; e;
</code></pre>
<p>Ich will bzw. muss diese Vektoren an unterschiedlichen Stellen in der Klasse zu einem neuen Vektor zusammensetzen können. Und das in beliebiger Reihenfolge.</p>
<p>Bisher mache ich das so:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z;
z.insert(z.end(), b.begin(), b.end());
z.insert(z.end(), e.begin(), e.end());
z.insert(z.end(), b.begin(), b.end());
</code></pre>
<p>usw. usw. usw.<br />
Viel lieber wäre mir aber solch eine Lösung:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z;
z = b + e + b;
</code></pre>
<p>Jetzt endlich meine Frage <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="🙂"
    /><br />
Kann ich den + Operator bei Vektoren überladen? Ich habe es schon auf die ein oder andere Weise probiert. Aber entweder bin ich da zu blöde für, oder es geht einfach nicht.</p>
<p>Solche Konstrukte hatte ich bisher in der Klasse definiert:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;&amp; operator+(const std::vector&lt;int&gt;&amp;);
std::vector&lt;int&gt;&amp; operator+(const std::vector&lt;int&gt;);
std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;);
std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;&amp;, const std::vector&lt;int&gt;&amp;);
</code></pre>
<p>Aber das hat alles nur diverse Fehler produziert.</p>
<p>Ich gebe ehrlich zu, dass mit dem Überladen von Operatoren habe ich noch nicht so richtig verstanden. Allerdings muss ich bis Dienstag Abend irgendwie eine Lösung finden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Bitte, kann einer von euch mir helfen?<br />
Vielen lieben Dank!!</p>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267887/kann-man-den-operator-bei-vector-lt-gt-überladen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 17:52:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267887.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 May 2010 20:14:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:14:20 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich stehe vor einem Problem.<br />
Ich habe in einer Klasse einige Vektoren. Zum Beispiel:</p>
<pre><code>vector&lt;int&gt; a (4,0xFF);
vector&lt;int&gt; b (2,0x00);
vector&lt;int&gt; c;
vector&lt;int&gt; d;
vector&lt;int&gt; e;
</code></pre>
<p>Ich will bzw. muss diese Vektoren an unterschiedlichen Stellen in der Klasse zu einem neuen Vektor zusammensetzen können. Und das in beliebiger Reihenfolge.</p>
<p>Bisher mache ich das so:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z;
z.insert(z.end(), b.begin(), b.end());
z.insert(z.end(), e.begin(), e.end());
z.insert(z.end(), b.begin(), b.end());
</code></pre>
<p>usw. usw. usw.<br />
Viel lieber wäre mir aber solch eine Lösung:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z;
z = b + e + b;
</code></pre>
<p>Jetzt endlich meine Frage <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="🙂"
    /><br />
Kann ich den + Operator bei Vektoren überladen? Ich habe es schon auf die ein oder andere Weise probiert. Aber entweder bin ich da zu blöde für, oder es geht einfach nicht.</p>
<p>Solche Konstrukte hatte ich bisher in der Klasse definiert:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;&amp; operator+(const std::vector&lt;int&gt;&amp;);
std::vector&lt;int&gt;&amp; operator+(const std::vector&lt;int&gt;);
std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;);
std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;&amp;, const std::vector&lt;int&gt;&amp;);
</code></pre>
<p>Aber das hat alles nur diverse Fehler produziert.</p>
<p>Ich gebe ehrlich zu, dass mit dem Überladen von Operatoren habe ich noch nicht so richtig verstanden. Allerdings muss ich bis Dienstag Abend irgendwie eine Lösung finden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Bitte, kann einer von euch mir helfen?<br />
Vielen lieben Dank!!</p>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905189</guid><dc:creator><![CDATA[shinji]]></dc:creator><pubDate>Mon, 31 May 2010 20:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:32:45 GMT]]></title><description><![CDATA[<p>Etwa so:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
vector&lt;T&gt; operator + (const vector&lt;T&gt;&amp; v1, const vector&lt;T&gt;&amp; v2)
{
	vector&lt;T&gt; v = v1;
	v.insert(v.end(), v2.begin(), v2.end());
	return v;
}
</code></pre>
<p>Dann musst du nur noch hoffen, dass dein Compiler Copy-Elison bzw. NRVO gut beherrscht <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>Edit: falls er das nicht tut, kann man sich eventuell sowas basteln:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
vector&lt;T&gt;&amp; operator += (vector&lt;T&gt;&amp; to, const vector&lt;T&gt;&amp; from)
{
	to.insert(to.end(), from.begin(), from.end());
	return to;
}

// ...

((z += b) += e) += b;
</code></pre>
<p>Das ist zumindest etwas übersichtlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905191</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 31 May 2010 20:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:35:13 GMT]]></title><description><![CDATA[<p>Das sollte eigentlich gehen, so wie du es versucht hast:</p>
<pre><code class="language-cpp">#include&lt;vector&gt;
#include&lt;iostream&gt; 

std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;&amp; lhs, const std::vector&lt;int&gt;&amp; rhs){
  std::vector&lt;int&gt; temp(lhs);
  temp.insert(temp.end(),rhs.begin(),rhs.end());
  return temp;
}

int main()
{
  std::vector&lt;int&gt; A (3,100);
  std::vector&lt;int&gt; B (0,200);
  std::vector&lt;int&gt; C = A+B;

  for (int i=0; i&lt;C.size(); ++i) std::cout&lt;&lt;C[i]&lt;&lt;std::endl;
}
</code></pre>
<p>Natürlich noch schicker mit Templateparameter, anstatt nur für int.</p>
<p>edit: Oha, 10 Minuten zu spät. Ich sollte a) Beispiele schneller programmieren und b) mal prüfen ob inzwischen schon jemand anderes geantwortet hat, bevor ich abschicke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905197</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 31 May 2010 20:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:39:20 GMT]]></title><description><![CDATA[<p>operator+ finde ich eigentlich unpassend, da a+b != b+a <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="🙂"
    /> (ok ist bei strings auch so. Aber da finde ich + auch unpassend)</p>
<pre><code class="language-cpp">template&lt;typename T, class Alloc&gt;
vector&lt;T, Alloc&gt;
operator+(vector&lt;T, Alloc&gt; lhs, vector&lt;T, Alloc&gt; const &amp;rhs)
{
  lhs.reserve(lhs.size() + rhs.size());
  lhs.insert(lhs.end(), rhs.begin(), rhs.end());
  return lhs;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1905200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905200</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Mon, 31 May 2010 20:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:54:10 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/142">@rüdiger</a>:<br />
Warum verändert deine Funktion ein Argument? - Für den +-Operator würde ich da eher die Variante von ipsec bevorzugen, was auch eher dem Verhalten von <code>std::string</code> entspricht.</p>
<p>Ich find den Operator bei strings gar nicht so unpassend, denn ein solches addieren ist recht intuitiv verständlich, dass dort ein String angehängt wird.<br />
Dass da nicht irgendwie eine Zeichenweise Addition statt findet ist denke ich recht klar.</p>
<p>Bei dem gezeigtem kann man sich natürlich streiten, aber dazu müssten wir noch mehr über den Hintergrund wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905206</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 31 May 2010 20:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 20:57:29 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>edit: Oha, 10 Minuten zu spät. Ich sollte a) Beispiele schneller programmieren und b) mal prüfen ob inzwischen schon jemand anderes geantwortet hat, bevor ich abschicke.</p>
</blockquote>
<p>Nein, fang sowas nicht an. Meistens ist die zweite Lösung doch in einem kleinen Detail anders, und dem Fragesteller ist durchaus damit gedient, verschiedene Stilrichtungen zu sehen.<br />
Wenns im Prinzip nichts Neues ist, ist ein<br />
edit: zu spät<br />
sehr schick, um dem Erstantworter und allen anderen noch schnell zu sagen, daß man damit nicht widersprechen wollte und man auf die leicht andere Gangart nicht pocht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905211</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 31 May 2010 20:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:02:14 GMT]]></title><description><![CDATA[<p>Also ich hatte Addition noch nie wirklich mit Assoziativität verbunden, daher stört mich das nicht. Jedoch würde ich bei Addition von vectoren intuitiv eher eine elementweise Addition erwarten. Den hier überladenen Operator sollte man also mit Bedacht einsetzen und gut dokumentieren. Mir fällt auch gerade kein gutes Operatorsymbol für eine Union zweier Mengen ein, da ich eigentlich überall elementweise Operationen erwarten würde. Am ehesten noch der Linksshift-Operator &lt;&lt;. Die Schreibweise a&lt;&lt;b würde mich dann nämlich an die iostreams erinnern, wo damit auch angehängt wird.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>: Ok, werde ich dran denken. Beziehungsweise einfach nichts anders machen als bisher. <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/1905212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905212</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 31 May 2010 21:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:10:11 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/142">@rüdiger</a>:<br />
Warum verändert deine Funktion ein Argument? - Für den +-Operator würde ich da eher die Variante von ipsec bevorzugen, was auch eher dem Verhalten von <code>std::string</code> entspricht.</p>
</blockquote>
<p>Das erste Argument wird kopiert. Teilweise ist es für den Compiler einfacher, unnötige Kopien wegzuoptimieren, wenn die Kopie implizit (über Parameter oder Rückgabewert) erfolgt.</p>
<p>Das Verhalten von rüdigers Funktion ist analog zum <code>operator+</code> bei <code>std::string</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905218</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 31 May 2010 21:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:11:20 GMT]]></title><description><![CDATA[<p>Oh, krass! Das ging jetzt aber wahnsinnig schnell! O.O</p>
<p>Habe spontan die Lösung von SeppJ ausprobiert, aber das läuft natürlich nicht bei mir. Also zumindest nicht innerhalb einer Klasse. Ich habe stellenweise echt Wissenslücken in C++. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code>In file included from main.cpp:2:
test.h:12: error: ‘std::vector&lt;int, std::allocator&lt;int&gt; &gt; Test::operator+(const std::vector&lt;int, std::allocator&lt;int&gt; &gt;&amp;, const std::vector&lt;int, std::allocator&lt;int&gt; &gt;&amp;)’ must take either zero or one argument
</code></pre>
<p>Liegt bestimmt wieder an der späten Stunde und meiner Doofheit. Also das hier ist die test.h:</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

#include &lt;vector&gt;

class Test
{
  public:
    Test();    
    ~Test();

    std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;&amp; lhs, const std::vector&lt;int&gt;&amp; rhs);
    void testop();
};

#endif
</code></pre>
<p>Und das die passende test.cpp:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &quot;test.h&quot;

std::vector&lt;int&gt; operator+(const std::vector&lt;int&gt;&amp; lhs, const std::vector&lt;int&gt;&amp; rhs){
  std::vector&lt;int&gt; temp(lhs);
  temp.insert(temp.end(),rhs.begin(),rhs.end());
  return temp;
} 

void Test::testop()
{
    std::vector&lt;int&gt; a (2,0xDD);
    std::vector&lt;int&gt; b (2,0xAA);
    std::vector&lt;int&gt; c ;

    c = a + b;
}
</code></pre>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905219</guid><dc:creator><![CDATA[shinji]]></dc:creator><pubDate>Mon, 31 May 2010 21:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:12:49 GMT]]></title><description><![CDATA[<p>Du musst den Operator als freie Funktion und nicht als Memberfunktion implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905221</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 31 May 2010 21:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:13:53 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Jedoch würde ich bei Addition von vectoren intuitiv eher eine elementweise Addition erwarten.</p>
</blockquote>
<p>Ich weiß nicht. vector ist so eine eierlegende Wollmilchsau.<br />
Die elementweise Addition würde ich gerne bei valarray sehen. valvector?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905224</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 31 May 2010 21:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:20:45 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/142">@rüdiger</a>:<br />
Warum verändert deine Funktion ein Argument? - Für den +-Operator würde ich da eher die Variante von ipsec bevorzugen, was auch eher dem Verhalten von <code>std::string</code> entspricht.</p>
</blockquote>
<p>Das erste Argument wird kopiert. Teilweise ist es für den Compiler einfacher, unnötige Kopien wegzuoptimieren, wenn die Kopie implizit (über Parameter oder Rückgabewert) erfolgt.</p>
<p>Das Verhalten von rüdigers Funktion ist analog zum <code>operator+</code> bei <code>std::string</code> .</p>
</blockquote>
<p>Stimmt. Hab da irgendwie ein &amp; gesehen.</p>
<p>Elementweise Addition fände ich auch hier eher merkwürdig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905227</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 31 May 2010 21:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:28:44 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Mir fällt auch gerade kein gutes Operatorsymbol für eine Union zweier Mengen ein, da ich eigentlich überall elementweise Operationen erwarten würde.</p>
</blockquote>
<p>Wie wäre es mit <code>operator&amp;</code> oder <code>operator,</code> ? (Natürlich sollte man zu beiden noch einen Kommentar schreiben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905229</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 31 May 2010 21:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:40:56 GMT]]></title><description><![CDATA[<p>Aber gilt der Operator dann nicht für alle + Vector-Operatoren? Ich würde das ganze gerne auf eine spezielle Klasse beschränken. Der ganze Quatsch wird später mal Teil eines größeren Projektes, wo auch andere dran arbeiten. Will denen nicht meinen Operator aufdrängen.</p>
<p>Aber ansonsten läuft es super. Vielen lieben Dank für eure Hilfe!!!</p>
<p>Gruß<br />
Thorsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905236</guid><dc:creator><![CDATA[shinji]]></dc:creator><pubDate>Mon, 31 May 2010 21:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 21:48:10 GMT]]></title><description><![CDATA[<p>Dann lass die Deklaration im Header und mach lediglich eine Definition in der Quelldatei. Andere Dateien haben da dann keinen Zugriff drauf.</p>
<p>Alternativ wäre es noch eine Möglichkeit das in einen namespace zu packen, aber ich denke, dass das nicht nötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905243</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 31 May 2010 21:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Mon, 31 May 2010 23:05:20 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/142">@rüdiger</a>:<br />
Warum verändert deine Funktion ein Argument? - Für den +-Operator würde ich da eher die Variante von ipsec bevorzugen, was auch eher dem Verhalten von <code>std::string</code> entspricht.</p>
</blockquote>
<p>Das erste Argument wird kopiert. Teilweise ist es für den Compiler einfacher, unnötige Kopien wegzuoptimieren, wenn die Kopie implizit (über Parameter oder Rückgabewert) erfolgt.</p>
<p>Das Verhalten von rüdigers Funktion ist analog zum <code>operator+</code> bei <code>std::string</code> .</p>
</blockquote>
<p>ergänzend noch folgender Artikel<br />
<a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/" rel="nofollow">http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905273</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Mon, 31 May 2010 23:05:20 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Tue, 01 Jun 2010 08:50:09 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>operator+ finde ich eigentlich unpassend, da a+b != b+a <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="🙂"
    /> (ok ist bei strings auch so. Aber da finde ich + auch unpassend)</p>
<pre><code class="language-cpp">template&lt;typename T, class Alloc&gt;
vector&lt;T, Alloc&gt;
operator+(vector&lt;T, Alloc&gt; lhs, vector&lt;T, Alloc&gt; const &amp;rhs)
{
  lhs.reserve(lhs.size() + rhs.size());
  lhs.insert(lhs.end(), rhs.begin(), rhs.end());
  return lhs;
}
</code></pre>
</blockquote>
<p>Ich denke nicht, dass <code>reserve</code> notwendig ist. Ich würde mal davon ausgehen, dass, falls insert RandomAccess-Iteratoren bekommt, es selbst schlau genug ist, entsprechend Platz zu machen. Das geht ja eigentlich recht einfach über iterator_traits&lt;Iter&gt;::iterator_category und Tag-Dispatching. Gut, garantiert wird dies wahrscheinlich nicht, aber es macht IMHO eine gute StdLib-Implementierung aus. (Ich hab's in diesem Fall nicht wirklich getestet, aber ich weiß, dass zB in libstdc++ derartige Optimierungen en masse enthalten sind. std::copy kann z.B. u.U. auch zu einem memmove reduziert werden).</p>
<p>Bzgl Performanz/Optimierung geht sogar noch einen Tucken besser:</p>
<pre><code class="language-cpp">template&lt;typename T, class Alloc&gt;
vector&lt;T, Alloc&gt;
operator+(vector&lt;T, Alloc&gt; lhs, vector&lt;T, Alloc&gt; const &amp;rhs)
{
  vector&lt;T,Alloc&gt; result;
  result.swap(lhs);
  result.insert(result.end(), rhs.begin(), rhs.end());
  return result;  // NRVO möglich
}
</code></pre>
<p>Jedoch werden die Elemente bei der Zuweisung in <code>c = a+b;</code> noch unnötig kopiert. Da man vector&lt;&gt; nicht verändern kann, geht das meines Wissens nach auch nicht anders -- es sei denn, man arbeitet im C++0x Modus. Dann findet natürlich kein unnötiges Kopieren statt, weil die Elemente von <code>(a+b)</code> einfach nach <code>c</code> &quot;umziehen&quot;.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905359</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 Jun 2010 08:50:09 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Tue, 01 Jun 2010 09:02:30 GMT]]></title><description><![CDATA[<p>shinji schrieb:</p>
<blockquote>
<p>Viel lieber wäre mir aber solch eine Lösung:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z;
z = b + e + b;
</code></pre>
</blockquote>
<p>Die unnötige Kopie, von der ich vorhin sprach, lässt sich aber auch so umgehen:</p>
<pre><code class="language-cpp">vector&lt;int&gt; z = b + e + b;
</code></pre>
<p>Tipp: Vermeide Definition mit Defaultinitialisierung + Zuweisung. Benutze gleich die richtige Initialisierung. Hier kann ein Compiler die unnötige temporäre Kopie, die sich aus (b+e+b) ergibt, wegoptimieren.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905366</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 Jun 2010 09:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Tue, 01 Jun 2010 09:59:48 GMT]]></title><description><![CDATA[<p>also vektoren mit &quot;+&quot; aneinanderhängen ist doch sowieso schmarrn.<br />
nicht umsonst nimmt man in java/c#/... einen string-builder statt dauernd strings mit &quot;+&quot; zusammenzuhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905396</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Jun 2010 09:59:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Tue, 01 Jun 2010 10:19:29 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>also vektoren mit &quot;+&quot; aneinanderhängen ist doch sowieso schmarrn.<br />
nicht umsonst nimmt man in java/c#/... einen string-builder statt dauernd strings mit &quot;+&quot; zusammenzuhängen.</p>
</blockquote>
<p>Ich glaube nicht.<br />
Man nimmt den Stringbuilder, weil er so toll wachsen kann wie ein std::vector oder std::string. Normale Strings können das nähmlich nicht.<br />
Nur ist für viele Anfügungen der op+ nicht gut und der op+= ist besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905410</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 01 Jun 2010 10:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Wed, 02 Jun 2010 09:35:57 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Alternativ wäre es noch eine Möglichkeit das in einen namespace zu packen, aber ich denke, dass das nicht nötig ist.</p>
</blockquote>
<p>Gilt der Operator dann nur in dem namespace oder kann man dann folgendes schreiben:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; A, B, X;
X = A std::+ B
</code></pre>
<p><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/1905788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905788</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 02 Jun 2010 09:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Wed, 02 Jun 2010 12:14:27 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Alternativ wäre es noch eine Möglichkeit das in einen namespace zu packen, aber ich denke, dass das nicht nötig ist.</p>
</blockquote>
<p>Gilt der Operator dann nur in dem namespace oder kann man dann folgendes schreiben:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; A, B, X;
X = A std::+ B
</code></pre>
<p><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>Weder noch. Man kann den operator nicht in std überladen, weils schlicht verboten ist, neue Definitionen in std zu packen. Templatespezialisierungen mal ausgenommen.<br />
ns::+ funktioniert garnicht, das müsste man dann explizit schreiben als <code>X = ns::operator+(A, B)</code><br />
alternativ kann man den Operator in den jeweiligen Scope oder Namespace importieren per using-Direktive.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905868</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 Jun 2010 12:14:27 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Wed, 02 Jun 2010 17:34:12 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>alternativ kann man den Operator in den jeweiligen Scope oder Namespace importieren per using-Direktive.</p>
</blockquote>
<p>Das war meine Intention. Ich würde wahrscheinlich den namespace nehmen, wenn diese Überladung auch für andere Dateien von Interesse ist und die direkte Implementierung in die Quelldatei, wenn du das nur in einem File brauchst (weil da der namespace nicht viel bringt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906040</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 02 Jun 2010 17:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Thu, 03 Jun 2010 01:29:33 GMT]]></title><description><![CDATA[<p>Man kann sich das auch alles sparen, und vernünftigerweise eine freie Funktion anstelle eines höchst fragwürdigen Operators verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906148</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Jun 2010 01:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Thu, 03 Jun 2010 01:35:19 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Man kann sich das auch alles sparen, und vernünftigerweise eine freie Funktion anstelle eines höchst fragwürdigen Operators verwenden.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Wenn ich jetzt nicht viel zu tun hätte, würde ich filisofisch werden, warum uns das nicht vorher eingefallen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906149</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 03 Jun 2010 01:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man den Operator + bei vector&amp;lt;&amp;gt; überladen? on Thu, 03 Jun 2010 04:52:16 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>filisofisch</p>
</blockquote>
<p>Wenn dann: filosofisch oder vielohsofisch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1906159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1906159</guid><dc:creator><![CDATA[thereigo]]></dc:creator><pubDate>Thu, 03 Jun 2010 04:52:16 GMT</pubDate></item></channel></rss>