<?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[Objekte in Container löschen]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe Objekte in einem Container (map) und leere den Container mit container.clear(); Ruft der Container für jedes Objekt den Destructor auf, oder muss ich das selber machen?</p>
<p>Vielen Dank schon mal,<br />
M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159751/objekte-in-container-löschen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:23:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159751.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Sep 2006 14:57:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte in Container löschen on Mon, 18 Sep 2006 14:57:47 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe Objekte in einem Container (map) und leere den Container mit container.clear(); Ruft der Container für jedes Objekt den Destructor auf, oder muss ich das selber machen?</p>
<p>Vielen Dank schon mal,<br />
M. Incani</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139704</guid><dc:creator><![CDATA[BlackPepper]]></dc:creator><pubDate>Mon, 18 Sep 2006 14:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Mon, 18 Sep 2006 15:23:39 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ja clear löscht auch die einzelnen Elemente des Containers. Allerdings must du beachten, das bei Pointern als Elementen nicht die Instanzen gelöscht werden.</p>
<pre><code class="language-cpp">std::vector&lt;MyClass&gt; test1; // Instanzen werden bei clear gelöscht
std::vector&lt;MyClass*&gt; test1; // Instanzen werden bei clear nicht gelöscht
</code></pre>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139735</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 18 Sep 2006 15:23:39 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Mon, 18 Sep 2006 15:24:40 GMT]]></title><description><![CDATA[<p>Ja, es werden, wie bei den anderen STL-Containern auch, jeweils die Destruktoren aufgerufen. Nur wenn du Zeiger verwendest, dann mußt du die Objekte selbst löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139736</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 18 Sep 2006 15:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 11:08:13 GMT]]></title><description><![CDATA[<p>Ich habe auch mal eine Frage zum Container map:</p>
<p>Kann man irgendwie auch einzelne Elemente aus der map löschen? In Python geht das einfach, aber in C++ scheint es einfach nicht zu gehen oder ich finde nicht die entsprechenden Hinweise wie es funktionieren soll.</p>
<p>Ich habe eine map erstellt die als Key eine Zahl speichert und als value die Anzahl. Der Key geht dabei von 1..n, also sowas hier:</p>
<pre><code class="language-cpp">map&lt;int,int&gt; vals;
</code></pre>
<p>dann eine for Schleife die Werte analysiert und immer, wenn der Wert vorhanden ist, ihn inkrementiert oder neu anlegt:</p>
<pre><code class="language-cpp">for (int i = 1; i &lt; irgendwas(); i++)
    vals[i] = vals[i] ? vals[i] += 1 : 1;
</code></pre>
<p>Das funktioniert auch, nun möchte ich aber alle Werte, wo die Anzahl kleiner 10 ist, aus der Map löschen. Wie kann ich das denn machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341416</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 11:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 11:11:46 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Die Basisfunktion zum Löschen von Elementen ist <a href="http://www.cppreference.com/cppmap/erase.html" rel="nofollow">std:<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f5fa.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--world_map"
      title=":map:"
      alt="🗺"
    />:erase</a></p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341418</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 09 Aug 2007 11:11:46 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 11:20:54 GMT]]></title><description><![CDATA[<p>Hallo, das scheint leider nicht so ganz zu funktionieren, wahrscheinlich weil die Map sofort neu sortiert wird oder jedenfalls der Pointer nicht mehr gültig ist?</p>
<p>Hier mal meine Testausgabe nach Löschen der Werte mit einer kleineren Anzahl als 10 (nach dem Muster ZAHLENWERT:ANZAHL):</p>
<blockquote>
<p>4:203 - 19:155 - 25:3 - 26:32 - 29:2 - 30:45 - 31:584 - 33:1 - 35:10 - 36:829 - 40:25 - 41:12 - 56:11 - 64:27 - 66:39 - 77:26 - 81:1 - 88:25 - 90:268 - 93:25 - 95:29 - 97:14 - 99:79 - 113:1 - 117:12 - 121:236 - 125:5 - 127:18 - 128:84 - 129:16 - 133:11 - 137:35 - 141:12 - 143:12 - 145:8 - 155:1187 - 157:2 - 159:33 - 160:157 - 167:27</p>
</blockquote>
<p>Wie man sieht sind immer noch Werte dabei, die weniger als 10mal vorkommen, z.B. die 113 oder die 125...</p>
<p>Meine Schleife zum Löschen sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">for (map&lt;int,int&gt;::iterator it = labelValues.begin(); it != labelValues.end(); ++it)
{
    if (it-&gt;second &lt; 10)
        labelValues.erase(it);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1341427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341427</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 11:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 11:23:55 GMT]]></title><description><![CDATA[<p>Ja, beim erase() wird der Ziel-Iterator ungültig - aber als Gegenleistung liefert die Methode dir einen Iterator auf die nächste gültige Position:</p>
<pre><code class="language-cpp">for (map&lt;int,int&gt;::iterator it = labelValues.begin(); it != labelValues.end();)
{
    if (it-&gt;second &lt; 10)
        it=labelValues.erase(it);
    else
        ++it;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1341430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341430</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Aug 2007 11:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 11:34:40 GMT]]></title><description><![CDATA[<p>Ich habe heute wohl einen schlechten Tag, kapiere nicht was ich schon wieder falsch mache, aber ich kann wohl den Iterator nicht zuweisen:</p>
<blockquote>
<p>eyelocator.cpp:289: error: no match for ‘operator=’ in ‘it = ((EyeLocatorPriv*)this)-&gt;EyeLocatorPriv::labelValues. std::map&lt;_Key, _Tp, _Compare, _Alloc&gt;::erase [with _Key = int, _Tp = int, _Compare = std::less&lt;int&gt;, _Alloc = std::allocator&lt;std::pair&lt;const int, int&gt; &gt;](it)’</p>
</blockquote>
<p>Ich habe dann den Iterator mal außerhalb definiert, aber auch dann der selbe Fehler. Der Code ist genau der selbe den du eben gepostet hast...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341438</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 11:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:15:43 GMT]]></title><description><![CDATA[<p>Ok mit einer Map scheint das einfach nicht zu gehen, denn dann liefert erase() nur void. Kann ich vielleicht versuchen eine andere Lösung zu nutzen?<br />
Ich brauche einen Container der einem Wert einen anderen zuordnen kann. Mir fällt da nur eine Map ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341473</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:26:33 GMT]]></title><description><![CDATA[<p>*grübelt* Stimmt, das könnte ein Problem sein - hatte das mit list::erase() verwechselt.</p>
<p>Eine Möglichkeit wäre es noch, den Iterator erst zu inkrementieren und danach die alte Position zu löschen:</p>
<pre><code class="language-cpp">for (map&lt;int,int&gt;::iterator it = labelValues.begin(); it != labelValues.end();)
{
    if (it-&gt;second &lt; 10)
        labelValues.erase(it++);//Post-Inkrement gibt den ursprünglichen Iterator zurück
    else
        ++it;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1341480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341480</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:35:37 GMT]]></title><description><![CDATA[<p>ok das scheint zu gehen, hoffen wir mal das er auch alle Zahlen richtig löscht und nicht doch einige falsch herausfummelt.<br />
So ganz kapiere ich es aber nicht. Wie kann denn Post-Inkrement noch gehen wenn der Iterator ab dann ungültig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341491</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:40:57 GMT]]></title><description><![CDATA[<p>Der Post-Inkrement-Operator wird vor dem Funktionsaufruf ausgeführt - und liefert eine (ältere) <strong>Kopie</strong> deines Iterators zurück. Darum zeigt it während des Aufrufs auch nicht mehr auf das zu löschende Element (und andere Elemente werden von erase() nicht ungültig gesetzt).</p>
<p>Im Prinzip sieht das so aus:</p>
<pre><code class="language-cpp">iterator temp = it++;
labelValues.erase(temp);

// oder - op++ auseinandergenommen:
iterator temp = it;
++it;
labelValues.erase(temp);
</code></pre>
<p>(temp wird am Ende der erase()-Anweisung wieder zerstört, also stört es niemanden, daß er nicht mehr auf ein gültiges Map-Element zeigt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341495</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:43:26 GMT]]></title><description><![CDATA[<p>Ah danke schön für die Erklärung und die Lösung!!<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1341497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341497</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 12:59:28 GMT]]></title><description><![CDATA[<p>Oh ich habe doch noch eine Frage, ihr merkt ich kenne mich noch nicht so gut in C++ aus, komme von Python her.</p>
<p>Ich habe nun eine Datenstruktur (CImg) und diese Map und will nun einfach für jeden Bildpunkt schauen, ob der Wert in der Map vorkommt.</p>
<p>In Python würde ich es so machen (pseudocode):</p>
<pre><code>if (img(x,y) in map.keys())
    // setze auf eine Farbe
else
    // setze auf 0
</code></pre>
<p>Wie kann man das denn nun in C++ umsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341518</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 13:34:00 GMT]]></title><description><![CDATA[<p>mit</p>
<pre><code class="language-cpp">if (mymap.find(mykey) != mymap.end()) //...
</code></pre>
<p>Erlaeuterung: map::find(const key_type&amp; x) liefert einen iterator auf den Wert, dessen key x ist. Wenn x in der map nicht vorhanden ist, liefert find() einen iterator hinter dem letzten element, genau wie map::end().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341547</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte in Container löschen on Thu, 09 Aug 2007 13:43:41 GMT]]></title><description><![CDATA[<p>Cool das geht, vielen vielen Dank. So langsam komme ich mit C++ auch klar, ist halt komplett anders, vor allem die Pointer-Sachen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341557</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:43:41 GMT</pubDate></item></channel></rss>