<?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[Entfernen eines bestimmten Elements aus einem Vector]]></title><description><![CDATA[<p>Hallo zusammen!!</p>
<p>Ich bin C++-Anfänger und komme eigentlich aus der Java-Ecke. Seit ein paar Tagen arbeite ich mich im Rahmen eines Projekts in C++ ein.</p>
<p>Bevor ich meine Frage erläutere möchte ich sagen, dass ich Google, die Suchfunktion und die gängigen Anfängerfragen bereits durchforstet habe. Leider konnte ich keine erschöpfende Antwort auf meine (wahrscheinlich banale) Frage finden.</p>
<p>Ich hoffe, dass mir hier jemand helfen kann.</p>
<p>Es geht um Folgendes: Ich möchte innerhalb einer Klasse &quot;Source&quot; verschiedene Objekte der Klasse &quot;Device&quot; in einem Vector verwalten. Der Vector soll als private Instanzvariable der Klasse &quot;Source&quot; vorliegen. Per addDevice(), getDevice() und removeDevice() möchte ich auf dem Vector gekapselt operieren. Das Einfügen und Auslesen aus dem Vector funktioniert schonmal ganz gut. Nur das Löschen bereitet mir Probleme. Ich bekomme Fehlermeldungen vom Compiler, wenn ich folgende Funktion benutze:</p>
<pre><code class="language-cpp">devices.erase(remove(devices.begin(), devices.end(), dev), devices.end());
</code></pre>
<p>Zum tieferen Verständnis liste ich am besten einmal meinen (verkürzten) Code. Ich vermute, dass ich mit Pointern arbeiten muss und habe da auch schon Verschiedenes ausprobiert. In den Listings habe ich aber meine Ausgangslösung gepostet.</p>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;Source.h&quot;

using namespace std;

int main() {
	Device d1 = Device(&quot;Device 1&quot;);
	Device d2 = Device(&quot;Device 2&quot;);

	Source src = Source();
	src.addDevice(d1);
	src.addDevice(d2);

	cout &lt;&lt; src.getDevice(0).label &lt;&lt; endl;
	cout &lt;&lt; src.getDevice(1).label &lt;&lt; endl;
	cin.get();
}
</code></pre>
<p>Source.h</p>
<pre><code class="language-cpp">#pragma once
#include &lt;string&gt;
#include &lt;vector&gt;
#include &quot;Device.h&quot;

using namespace std;

class Source {
public:
	void addDevice(Device dev);
	void removeDevice(Device dev);
	Device getDevice(int pos);

private:
	vector&lt;Device&gt; devices;
};
</code></pre>
<p>Source.cpp</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &quot;Source.h&quot;

void Source::addDevice(Device dev) {
	devices.push_back(dev);
}

void Source::removeDevice(Device dev) {
	devices.erase(remove(devices.begin(), devices.end(), dev), devices.end());
}

Device Source::getDevice(int pos) {
	return devices.at(pos);
}
</code></pre>
<p>Device.h</p>
<pre><code class="language-cpp">#pragma once
#include &lt;string&gt;

using namespace std;

class Device {
public:
	string label;

	Device(void);
	Device(string lab);
};
</code></pre>
<p>Device.cpp</p>
<pre><code class="language-cpp">#include &quot;Device.h&quot;

Device::Device() {
}

Device::Device(string lab) {
	label = lab;
}
</code></pre>
<p>Falls es nötig ist, kann ich auch noch die Fehler-Liste hier posten, aber vielleicht hat ja jemand eine schnelle Antwort und findet den Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234263/entfernen-eines-bestimmten-elements-aus-einem-vector</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 10:20:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234263.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Feb 2009 16:53:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 16:54:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen!!</p>
<p>Ich bin C++-Anfänger und komme eigentlich aus der Java-Ecke. Seit ein paar Tagen arbeite ich mich im Rahmen eines Projekts in C++ ein.</p>
<p>Bevor ich meine Frage erläutere möchte ich sagen, dass ich Google, die Suchfunktion und die gängigen Anfängerfragen bereits durchforstet habe. Leider konnte ich keine erschöpfende Antwort auf meine (wahrscheinlich banale) Frage finden.</p>
<p>Ich hoffe, dass mir hier jemand helfen kann.</p>
<p>Es geht um Folgendes: Ich möchte innerhalb einer Klasse &quot;Source&quot; verschiedene Objekte der Klasse &quot;Device&quot; in einem Vector verwalten. Der Vector soll als private Instanzvariable der Klasse &quot;Source&quot; vorliegen. Per addDevice(), getDevice() und removeDevice() möchte ich auf dem Vector gekapselt operieren. Das Einfügen und Auslesen aus dem Vector funktioniert schonmal ganz gut. Nur das Löschen bereitet mir Probleme. Ich bekomme Fehlermeldungen vom Compiler, wenn ich folgende Funktion benutze:</p>
<pre><code class="language-cpp">devices.erase(remove(devices.begin(), devices.end(), dev), devices.end());
</code></pre>
<p>Zum tieferen Verständnis liste ich am besten einmal meinen (verkürzten) Code. Ich vermute, dass ich mit Pointern arbeiten muss und habe da auch schon Verschiedenes ausprobiert. In den Listings habe ich aber meine Ausgangslösung gepostet.</p>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;Source.h&quot;

using namespace std;

int main() {
	Device d1 = Device(&quot;Device 1&quot;);
	Device d2 = Device(&quot;Device 2&quot;);

	Source src = Source();
	src.addDevice(d1);
	src.addDevice(d2);

	cout &lt;&lt; src.getDevice(0).label &lt;&lt; endl;
	cout &lt;&lt; src.getDevice(1).label &lt;&lt; endl;
	cin.get();
}
</code></pre>
<p>Source.h</p>
<pre><code class="language-cpp">#pragma once
#include &lt;string&gt;
#include &lt;vector&gt;
#include &quot;Device.h&quot;

using namespace std;

class Source {
public:
	void addDevice(Device dev);
	void removeDevice(Device dev);
	Device getDevice(int pos);

private:
	vector&lt;Device&gt; devices;
};
</code></pre>
<p>Source.cpp</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &quot;Source.h&quot;

void Source::addDevice(Device dev) {
	devices.push_back(dev);
}

void Source::removeDevice(Device dev) {
	devices.erase(remove(devices.begin(), devices.end(), dev), devices.end());
}

Device Source::getDevice(int pos) {
	return devices.at(pos);
}
</code></pre>
<p>Device.h</p>
<pre><code class="language-cpp">#pragma once
#include &lt;string&gt;

using namespace std;

class Device {
public:
	string label;

	Device(void);
	Device(string lab);
};
</code></pre>
<p>Device.cpp</p>
<pre><code class="language-cpp">#include &quot;Device.h&quot;

Device::Device() {
}

Device::Device(string lab) {
	label = lab;
}
</code></pre>
<p>Falls es nötig ist, kann ich auch noch die Fehler-Liste hier posten, aber vielleicht hat ja jemand eine schnelle Antwort und findet den Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664292</guid><dc:creator><![CDATA[vell0cet]]></dc:creator><pubDate>Sun, 15 Feb 2009 16:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:03:16 GMT]]></title><description><![CDATA[<p>Du brauchst da den Iterator des Elements, dass du löschen willst.</p>
<p><a href="http://www.cplusplus.com/reference/stl/vector/erase.html" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/erase.html</a></p>
<p>Wenn du lediglich das Objekt hast, kannst du ja einfach danach suchen und dann den Iterator übergeben.</p>
<pre><code class="language-cpp">void Source::removeDevice(Device dev) {
    std::vector&lt;Device&gt;::iterator it = devices.begin();

    if ( it != devices.end () )
        devices.erase ( it );
}
</code></pre>
<p>Das nächste mal wäre aber die Fehlermeldung sicher auch hilfreich.<br />
(Also meist reicht einfach die erste Meldung, weil alles andere normalerweise folgefehler sind und somit selbst verschwinden.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664304</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:17:07 GMT]]></title><description><![CDATA[<p>Ich danke Dir für die schnelle Antwort. Ich werde es später ausprobieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664316</guid><dc:creator><![CDATA[vell0cet]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:25:01 GMT]]></title><description><![CDATA[<p>Da du aus Java kommst... Du willst ja schon, dass die <code>Device</code> -Einträge kopiert werden und nicht nur Verweise im <code>std::vector</code> gespeichert sind, oder? Denn in diesem Fall müsstest du Zeiger einsetzen.</p>
<p>Und hier</p>
<pre><code class="language-cpp">Device::Device(string lab)
</code></pre>
<p>solltest du besser eine Const-Referenz einsetzen, da sonst jedes Mal der ganze <code>std::string</code> kopiert wird.</p>
<pre><code class="language-cpp">Device::Device(const string&amp; lab)
</code></pre>
<p>Das gilt natürlich auch für die Übergaben bei <code>addDevice()</code> und <code>removeDevice()</code> .</p>
<p>Dann ist die folgende Zeile auch umständlich, weil zuerst ein temporäres Objekt erstellt und dieses dann in das eigentliche kopiert wird:</p>
<pre><code class="language-cpp">Device d2 = Device(&quot;Device 2&quot;);
</code></pre>
<p>Besser, du initialisierst es gleich:</p>
<pre><code class="language-cpp">Device d2(&quot;Device 2&quot;);
</code></pre>
<p>Und als letztes ist <code>using namespace</code> in Headern zu vermeiden, da du dann in allen Dateien, wo du den Header einbindest, den gesamten Namensraum offenlegst (was nicht immer erwünscht ist und zu Namenskonflikten führen kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664317</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:25:01 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:37:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Da du aus Java kommst... Du willst ja schon, dass die <code>Device</code> -Einträge kopiert werden und nicht nur Verweise im <code>std::vector</code> gespeichert sind, oder? Denn in diesem Fall müsstest du Zeiger einsetzen.</p>
</blockquote>
<p>Die werden ja kopiert.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<blockquote>
<p>Dann ist die folgende Zeile auch umständlich, weil zuerst ein temporäres Objekt erstellt und dieses dann in das eigentliche kopiert wird:</p>
</blockquote>
<p>Das glaube ich kaum.. Das wird i.d.R wegoptimiert. <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>Allerdings wäre der Einsatz von Initialierungslisten sicher auch angebracht, anstatt die Zuweisugn im c-tor.</p>
<pre><code class="language-cpp">Device::Device()
:label(&quot;&quot;) {
}

Device::Device(string lab)
:label(lab) {
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1664328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664328</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:39:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dann ist die folgende Zeile auch umständlich, weil zuerst ein temporäres Objekt erstellt und dieses dann in das eigentliche kopiert wird:</p>
</blockquote>
<p>Sicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664331</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:40:40 GMT]]></title><description><![CDATA[<p>Ups, war schon einer schneller. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664332</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:40:40 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 17:41:30 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>Ups, war schon einer schneller. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Bist halt nich der einzig kritische hier. <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/1664335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664335</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Feb 2009 17:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 18:20:05 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Bist halt nich der einzig kritische hier. <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>Hoffe du verzeihst mir jetzt auch eine kleine Kritik an deinem ersten Beitrag?!? <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="🙂"
    /></p>
<p>Was vell0cet da versucht ist eingentlich schon OK und er bekommt ja auch den Iterator für das(die) zu löschende(n) Element(e). So muss es eigentlich auch gemacht werden.</p>
<p>In meinen Augen liegt es einfach daran, dass er den <strong>== Operator</strong> für die Klasse Devices vergessen hat.</p>
<p>Aber, gut vielleicht hören wir ja noch mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664353</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Sun, 15 Feb 2009 18:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Sun, 15 Feb 2009 18:47:43 GMT]]></title><description><![CDATA[<p>Kein Problem..</p>
<p>Ich habe den Code gar nicht so intensiv angeschaut gehabt und gesehen, dass er nur ein Objekt löschen will. Und als er etwas von Zeiger geredet hat, habe ich es den Code gar nicht mehr grossartig angeschaut..</p>
<p>Ich denke mal, dass die Fehlermeldung hier mehr ausgesagt hätte. :p - Darum immer posten. <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 />
Hier liegts tatsächlich am fehlenden ==-Operator..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664377</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Feb 2009 18:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Mon, 16 Feb 2009 17:19:29 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Die werden ja kopiert.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Eben deshalb frage ich ja. In Java würde das Objekt soviel ich weiss nicht kopiert.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Das glaube ich kaum.. Das wird i.d.R wegoptimiert. <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>Aha, sich einfach mal von vornherein drauf verlassen, dass der Compiler super wegoptimieren kann, anstatt einen gleichwertigen Fall zu nehmen, bei dem nichts optimiert werden muss? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Es ist vorgesehen, dass in dem Fall ein temporäres Objekt erzeugt wird. Gewisse Umstände verhindern auch ein Wegoptimieren. Bau zum Beispiel mal ein Logging in den Konstruktor ein; ich will sehen, ob man von der erstellten Klasse nichts mitbekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664831</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 16 Feb 2009 17:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Mon, 16 Feb 2009 18:39:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Du willst ja schon, dass die Device-Einträge kopiert werden und nicht nur Verweise im std::vector gespeichert sind, oder? Denn in diesem Fall müsstest du Zeiger einsetzen.</p>
</blockquote>
<p>Wenn da anstatt &quot;in diesem Fall&quot; &quot;andernfalls&quot; gestanden wäre, hätte ichs verstanden. <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>Nexus schrieb:</p>
<blockquote>
<p>Es ist vorgesehen, dass in dem Fall ein temporäres Objekt erzeugt wird. Gewisse Umstände verhindern auch ein Wegoptimieren. Bau zum Beispiel mal ein Logging in den Konstruktor ein; ich will sehen, ob man von der erstellten Klasse nichts mitbekommt.</p>
</blockquote>
<p>Das ist afaik eine sehr gängige und übliche Optimierung.</p>
<pre><code class="language-cpp">struct foo
{
 foo ()
 {
  std::cout &lt;&lt; &quot;ctor-foo&quot; &lt;&lt; std::endl;
 }
};

int main ()
{
 foo f = foo ();
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>ctor-foo
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1664884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664884</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 16 Feb 2009 18:39:39 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Mon, 16 Feb 2009 22:02:31 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Wenn da anstatt &quot;in diesem Fall&quot; &quot;andernfalls&quot; gestanden wäre, hätte ichs verstanden. <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>Stimmt, war etwas missverständlich. Ich bezog mich mit &quot;diesem&quot; auf das letzgenannte (hier die Verweise). <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>drakon schrieb:</p>
<blockquote>
<p>Das ist afaik eine sehr gängige und übliche Optimierung.</p>
</blockquote>
<p>Das dachte ich mir fast, aber dass das Verhalten des Programms verändert wurde, wusste ich nicht (ich kann deine Ausgabe bestätigen). Denn eigentlich müsste streng genommen ein temporäres Objekt erzeugt werden, oder? Zumindest dachte ich, es wäre nicht erlaubt, dass die Optimierung das Programmverhalten ändert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664991</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 16 Feb 2009 22:02:31 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Mon, 16 Feb 2009 23:07:27 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Denn eigentlich müsste streng genommen ein temporäres Objekt erzeugt werden, oder?</p>
</blockquote>
<p>Ja, so ist es. Ohne Optimierung würde ein Konstruktor und anschließend der Copy-Konstruktor aufgerufen. Wenn du den Copy-Konstruktor private deklarierst, dann scheitert auch die ganze Geschichte, im Gegensatz zur Direct-Initialisierung wo ja von Beginn an nur der Konstruktor aufgerufen wird.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Zumindest dachte ich, es wäre nicht erlaubt, dass die Optimierung das Programmverhalten ändert...</p>
</blockquote>
<p>In diesem Fall ist es erlaubt, genauso wie bei der vielgerühmten &quot;return value optimization&quot;, wo ja auch der Copy-Konstruktor umgangen wird.</p>
<p>Dennoch, obwohl unter Strich (meist) dasselbe herauskommt ist die Version</p>
<pre><code class="language-cpp">Device d2(&quot;Device 2&quot;);
</code></pre>
<p>die empfohlene Variante, daher war dein Tipp meiner Meinung nach grundsätzlich berechtigt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665023</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Mon, 16 Feb 2009 23:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Tue, 17 Feb 2009 06:13:52 GMT]]></title><description><![CDATA[<p>Hmm. Merkwürdige Sache. Der Kopierkonstruktor scheint tatsächlich nicht aufgerufen zu werden, ich hab nochmal geschaut...</p>
<p>Vor allem ist die Direktinitialisierung die einzige Möglichkeit, wenn man zum Beispiel nicht-kopierbare Objekte hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665068</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 17 Feb 2009 06:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Tue, 17 Feb 2009 16:30:04 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Hmm. Merkwürdige Sache.</p>
</blockquote>
<p>Wieso ist das merkwürdig? Wir hatten uns doch geeinigt :), dass das Ding wegoptimiert wird.</p>
<p>Dass er aber grundsätzlich gebraucht wird, also tatsächlich erst durch Optimierung wegfällt zeigt die private-Version. Oder verstehe ich dich jetzt falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665386</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Tue, 17 Feb 2009 16:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Tue, 17 Feb 2009 18:02:27 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>Dennoch, obwohl unter Strich (meist) dasselbe herauskommt ist die Version</p>
<pre><code class="language-cpp">Device d2(&quot;Device 2&quot;);
</code></pre>
<p>die empfohlene Variante, daher war dein Tipp meiner Meinung nach grundsätzlich berechtigt</p>
</blockquote>
<p>Dann müsstest du aber auch:</p>
<pre><code class="language-cpp">int i (2);
</code></pre>
<p>machen. <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>Ich Ich finds in manchen Situationen einfach lesbarer und schneller verständlich, wenn ich das mit dem Zuweisungsoperator (welcher hier keiner ist ) zu schreiben.</p>
<p>Klar, wenn man einen Konstruktor verschieden vom Kopierkonstruktor hat, dann hat man in diesem Falle ein Problem..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665420</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 17 Feb 2009 18:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Wed, 18 Feb 2009 01:33:57 GMT]]></title><description><![CDATA[<p>Es geht bei der Empfehlung natürlich um die Initialisierung mit Konstruktoraufruf. Bei int usw. gibt es die Unterschiede ja nicht.</p>
<p>Was jetzt übersichtlicher ist liegt selbstverständlich im Auge des Betrachters, da will ich keine Wertung abgeben.</p>
<p>Aber, klar ist auch, dass die Variante</p>
<pre><code class="language-cpp">int i (2);
Device d2(&quot;Device 2&quot;);
// ... usw. usw.
</code></pre>
<p>immer funktioniert, während man mit</p>
<pre><code class="language-cpp">int i = 2;
Device d2 = Device(&quot;Device 2&quot;);
Device d2 = &quot;Device 2&quot;;
// ... usw. usw.
</code></pre>
<p>durchaus straucheln kann und gezwungen ist die erstgenannte Variante zu wählen, auch wenn man sie als unübersichtlich empfindet.</p>
<p>Nun gut, das sind ja alles mehr oder weniger unwichtige Details, soll jeder machen wie es ihm beliebt .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665549</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Wed, 18 Feb 2009 01:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Wed, 18 Feb 2009 18:26:21 GMT]]></title><description><![CDATA[<p>Kritiker schrieb:</p>
<blockquote>
<p>immer funktioniert, während man mit</p>
</blockquote>
<p>Wirklich immer? <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="🙂"
    /></p>
<pre><code class="language-cpp">foo g = foo ( foo ( foo () ) );
//vs
foo f ( foo( foo ( foo () ) ) );
</code></pre>
<p>Über Sinn und Unsinn von solchen Konstrukten sei wo anders diskutiert..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665961</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 18 Feb 2009 18:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen eines bestimmten Elements aus einem Vector on Thu, 19 Feb 2009 01:44:51 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Wirklich immer? <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="🙂"
    /></p>
</blockquote>
<p>Die Entsprechung zu</p>
<pre><code class="language-cpp">foo g = foo ( foo ( foo () ) );
</code></pre>
<p>ist nicht die Funktionsdeklaration</p>
<pre><code class="language-cpp">foo f ( foo( foo ( foo () ) ) );
</code></pre>
<p>sondern der Aufruf des Standardkonstruktors</p>
<pre><code class="language-cpp">foo f;
</code></pre>
<p>Du könntest jetzt anführen, dass der Copy-Konstruktor wichtige Änderungen am Objekt vornimmt und deshalb genau 3-mal hintereinander aufgerufen werden muss.</p>
<p>Dem halte ich entgegen, dass du</p>
<p>1. den mehrfachen Aufruf nicht garantieren kannst (Wenn doch, will ich wissen wie du es gemacht hast!!!) und</p>
<p>2. wäre ja dann auch nicht garantiert, dass</p>
<pre><code class="language-cpp">foo g = foo();
foo g;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">foo dummy;
foo g = dummy;
foo g(dummy);
</code></pre>
<p>jeweils dasselbe Ergebnis für g liefert.</p>
<p>Du hättest sozusagen ernsthafte Problem zu erklären warum</p>
<pre><code class="language-cpp">foo g = foo ( foo ( foo () ) );
</code></pre>
<p>nicht gleichbedeutend ist mit</p>
<pre><code class="language-cpp">foo f;
</code></pre>
<p>Aber klar, da ich &quot;immer&quot; gesagt habe, hast du meine Aussage sozusagen mit einem chaotischen Copy-Konstruktor &quot;logisch&quot; widerlegt.</p>
<p>Genieße die Genugtuung! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666131</guid><dc:creator><![CDATA[Kritiker]]></dc:creator><pubDate>Thu, 19 Feb 2009 01:44:51 GMT</pubDate></item></channel></rss>