<?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[Hilfsfunktion zum Löschen von STL-Containern]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mir schon vor einiger Zeit zwei Funktionen geschrieben die mir helfen STL-Container (list, vector) zu löschen:</p>
<p>template &lt;typename T&gt;<br />
struct delete_unary : public std::unary_function &lt;T, void&gt;<br />
{<br />
void operator () (T &amp;t)<br />
{<br />
delete t;<br />
}<br />
};</p>
<p>template &lt;typename T, typename S&gt;<br />
void delete_stl_container (T &amp;t)<br />
{<br />
for_each (t.begin (), t.end (), delete_unary &lt;S&gt; ());<br />
t.clear ();<br />
}</p>
<p>Ich benutze es dann so:</p>
<p>std::vector &lt;State*&gt; mStateList;<br />
...<br />
delete_stl_container &lt;std::vector &lt;State*&gt;, State*&gt; (mStateList);</p>
<p>Jetzt möchte ich es gerne für std::map benutzen...</p>
<p>std::map &lt;std::string, Part*&gt; mPartList;<br />
...<br />
delete_stl_container &lt;std::map &lt;std::string, Part*&gt;, Part*&gt; (mPartList);</p>
<p>...und bekomme diesen Kompilerfehler:</p>
<p>In file included from /usr/include/c++/4.4/algorithm:62,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:5,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/Eflxx.h:9,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/evasxx/include/evasxx/Object.h:10,<br />
from ../include/edjexx/Part.h:10,<br />
from Object.cpp:5:<br />
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::_Rb_tree_iterator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt; &gt;, _Funct = Eflxx::delete_unary<a href="Edjexx::Part*" rel="nofollow">Edjexx::Part*</a>]’:<br />
/home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:37: instantiated from ‘void Eflxx::delete_stl_container(T&amp;) [with T = std::map&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*, std::less&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::allocator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt; &gt; &gt;, S = Edjexx::Part*]’<br />
Object.cpp:75: instantiated from here<br />
/usr/include/c++/4.4/bits/stl_algo.h:4200: error: no match for call to ‘(Eflxx::delete_unary<a href="Edjexx::Part*" rel="nofollow">Edjexx::Part*</a>) (std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt;&amp;)’<br />
/home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:28: note: candidates are: void Eflxx::delete_unary&lt;T&gt;::operator()(T&amp;) [with T = Edjexx::Part*]</p>
<p>Ich vermute schon warum es nicht geht. Ich will ja nur das &quot;second&quot; Argument &quot;Part*&quot; löschen und nicht das ganze iterator-Ergebnis.</p>
<p>Auf Anhieb habe ich keine Idee wie ich meine Hilfsfunktion so abändern kann, dass es auch std::map unterstützt. Zur Not halt mit einer zweiten Hilfsfunktion.</p>
<p>Hat jemand eine kreative Idee und kann mir helfen?</p>
<p>Gruß<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279692/hilfsfunktion-zum-löschen-von-stl-containern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 11:09:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279692.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Jan 2011 17:56:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 17:56:28 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mir schon vor einiger Zeit zwei Funktionen geschrieben die mir helfen STL-Container (list, vector) zu löschen:</p>
<p>template &lt;typename T&gt;<br />
struct delete_unary : public std::unary_function &lt;T, void&gt;<br />
{<br />
void operator () (T &amp;t)<br />
{<br />
delete t;<br />
}<br />
};</p>
<p>template &lt;typename T, typename S&gt;<br />
void delete_stl_container (T &amp;t)<br />
{<br />
for_each (t.begin (), t.end (), delete_unary &lt;S&gt; ());<br />
t.clear ();<br />
}</p>
<p>Ich benutze es dann so:</p>
<p>std::vector &lt;State*&gt; mStateList;<br />
...<br />
delete_stl_container &lt;std::vector &lt;State*&gt;, State*&gt; (mStateList);</p>
<p>Jetzt möchte ich es gerne für std::map benutzen...</p>
<p>std::map &lt;std::string, Part*&gt; mPartList;<br />
...<br />
delete_stl_container &lt;std::map &lt;std::string, Part*&gt;, Part*&gt; (mPartList);</p>
<p>...und bekomme diesen Kompilerfehler:</p>
<p>In file included from /usr/include/c++/4.4/algorithm:62,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:5,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/Eflxx.h:9,<br />
from /home/andreas/src/svn/e/trunk/BINDINGS/cxx/evasxx/include/evasxx/Object.h:10,<br />
from ../include/edjexx/Part.h:10,<br />
from Object.cpp:5:<br />
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::_Rb_tree_iterator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt; &gt;, _Funct = Eflxx::delete_unary<a href="Edjexx::Part*" rel="nofollow">Edjexx::Part*</a>]’:<br />
/home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:37: instantiated from ‘void Eflxx::delete_stl_container(T&amp;) [with T = std::map&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*, std::less&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::allocator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt; &gt; &gt;, S = Edjexx::Part*]’<br />
Object.cpp:75: instantiated from here<br />
/usr/include/c++/4.4/bits/stl_algo.h:4200: error: no match for call to ‘(Eflxx::delete_unary<a href="Edjexx::Part*" rel="nofollow">Edjexx::Part*</a>) (std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, Edjexx::Part*&gt;&amp;)’<br />
/home/andreas/src/svn/e/trunk/BINDINGS/cxx/eflxx/include/eflxx/MemoryUtil.h:28: note: candidates are: void Eflxx::delete_unary&lt;T&gt;::operator()(T&amp;) [with T = Edjexx::Part*]</p>
<p>Ich vermute schon warum es nicht geht. Ich will ja nur das &quot;second&quot; Argument &quot;Part*&quot; löschen und nicht das ganze iterator-Ergebnis.</p>
<p>Auf Anhieb habe ich keine Idee wie ich meine Hilfsfunktion so abändern kann, dass es auch std::map unterstützt. Zur Not halt mit einer zweiten Hilfsfunktion.</p>
<p>Hat jemand eine kreative Idee und kann mir helfen?</p>
<p>Gruß<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001071</guid><dc:creator><![CDATA[andreas99]]></dc:creator><pubDate>Sat, 01 Jan 2011 17:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 18:15:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt;
struct delete_second
{
   void operator() (T&amp; object) const
   {
      delete object.second;
   }
};

std::map&lt;int, int*&gt; m;
m[3] = new int(27));
std::for_each(m.begin(), m.end(), delete_second&lt;std::map&lt;int, int*&gt;::value_type&gt;());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2001082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001082</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 01 Jan 2011 18:15:45 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 20:03:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">delete_stl_container &lt;std::vector &lt;State*&gt;, State*&gt; (mStateList); // deine Funktion
std::for_each(map.begin(), map.end(), delete_second&lt;std::map&lt;int, int*&gt;::value_type&gt;()); // thetas komische `Lösung'
delete_stl_container_plusplus(vec); // meine schöne und einheitliche
delete_stl_container_plusplus(map); // Schnittstelle
...

template &lt;typename T&gt;
void delete_stl_container_plusplus (T &amp;cnt)
{
  for (typename T::iterator it=cnt.begin(); it!=cnt.end(); ++it)
    delete *it;
  cnt.clear();
}

// Spezialisation, eigentlich eine Überladung, die für alle std::maps gilt
template &lt;typename Key, typename T&gt;
void delete_stl_container_plusplus (std::map&lt;Key, T&gt; &amp;cnt)
{
  for (typename std::map&lt;Key, T&gt;::iterator it=cnt.begin(); it!=cnt.end(); ++it)
    delete it-&gt;second;
  cnt.clear ();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2001120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001120</guid><dc:creator><![CDATA[Iota]]></dc:creator><pubDate>Sat, 01 Jan 2011 20:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 20:28:01 GMT]]></title><description><![CDATA[<p>Danke euch beiden!</p>
<p>Gruß<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001130</guid><dc:creator><![CDATA[andreas99]]></dc:creator><pubDate>Sat, 01 Jan 2011 20:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 20:37:58 GMT]]></title><description><![CDATA[<p>Wer ι (Iota) sagt, muss auch κ (Kappa) sagen (bin der gleiche Unreg wie Iota).</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class container_ptr {
public:
  container_ptr (T *ptr=0) : ptr(ptr) {}
 ~container_ptr () { delete ptr; }
  operator T* ()   { return ptr; }
  void reset  (T *p=0) { if (p!=ptr) { delete ptr; ptr = p; } }
  T *  release(T *p)   { T *tmp = ptr; ptr = 0; return tmp;   }
  container_ptr&amp; operator=(container_ptr&amp; a) { reset(a.release()); return *this; }
  container_ptr&amp; operator=(T *a            ) { reset(a          ); return *this; }
private:
  T *ptr;
};

std::map &lt;int, container_ptr&lt;State&gt; &gt; mappi;
for (int i=0;i&lt;256;++i)
  mappi[i] = new State; // alles geht normal
mappi.clear(); // alle Elemente werden zerstört
</code></pre>
<p>Mein <code>container_ptr</code> ist übrigens nur eine schlechte Kopie von <code>std::auto_ptr</code> .<br />
Falls du Boost benutzt, kannst du dir noch die Pointer Container anschauen, die machen das ganze ohne einen zusätzlichen Wrapper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001135</guid><dc:creator><![CDATA[Kappa]]></dc:creator><pubDate>Sat, 01 Jan 2011 20:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sat, 01 Jan 2011 20:57:32 GMT]]></title><description><![CDATA[<p>In STL-Containern darfst du nur Objekte mit Wertsemantik speichern. Dein <code>container_ptr</code> hat aber wie <code>std::auto_ptr</code> Move-Semantik, da er das Originalobjekt bei einer Kopie verändert. Das kann zu unangenehmen Überraschungen führen...</p>
<p>Für mehr Informationen kannst du mal bei Google &quot;auto_ptr in stl container&quot; eingeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001138</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Jan 2011 20:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sun, 02 Jan 2011 00:54:25 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_container.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001171</guid><dc:creator><![CDATA[ptr_container]]></dc:creator><pubDate>Sun, 02 Jan 2011 00:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfsfunktion zum Löschen von STL-Containern on Sun, 02 Jan 2011 10:04:53 GMT]]></title><description><![CDATA[<p>Kappa schrieb:</p>
<blockquote>
<p>Wer ι (Iota) sagt, muss auch κ (Kappa) sagen (bin der gleiche Unreg wie Iota).</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class container_ptr {
public:
  container_ptr (T *ptr=0) : ptr(ptr) {}
 ~container_ptr () { delete ptr; }
  operator T* ()   { return ptr; }
  void reset  (T *p=0) { if (p!=ptr) { delete ptr; ptr = p; } }
  T *  release(T *p)   { T *tmp = ptr; ptr = 0; return tmp;   }
  container_ptr&amp; operator=(container_ptr&amp; a) { reset(a.release()); return *this; }
  container_ptr&amp; operator=(T *a            ) { reset(a          ); return *this; }
private:
  T *ptr;
};
</code></pre>
</blockquote>
<p>Sorry, aber das ist totaler Blödsinn. Implizite Konvertierung von T* zu container_ptr&lt;T&gt; gehört sich nicht. Dein reset ist fehlerhaft. Der Compiler-generierte Kopierkonstruktor führt zu doppelten Löschungen.</p>
<p>Dieser Ansatz funktioniert erst, wenn wir Rvalue-Referenzen haben und Container, die move-only Typen unterstützen. Und wenn es soweit ist, können wir dann std::unique_ptr&lt;T&gt; benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001193</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 02 Jan 2011 10:04:53 GMT</pubDate></item></channel></rss>