<?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[erase() für slist (aus C++ STL[Breymann]) implementieren]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Buch <a href="http://www.informatik.hs-bremen.de/~brey/stlb.html" rel="nofollow">http://www.informatik.hs-bremen.de/~brey/stlb.html</a> .</p>
<p>Da drin ist folgende Klasse:</p>
<pre><code class="language-cpp">#ifndef SIMPLELIST_H
#define SIMPLELIST_H
#include&lt;cassert&gt;
#include&lt;iterator&gt;
namespace br_stl {
template&lt;class T&gt;
class slist {
    public:
/*Einige Typen der Klasse slist werden mit öffentlichen, außerhalb der Klasse
verwendbaren Namen versehen, damit sie ohne Kenntnis der Implementierung
verwendet werden können.
*/
        typedef T value_type;
        typedef ptrdiff_t difference_type;
        typedef T* pointer;
        typedef T&amp; reference;
// etc. siehe Text
        slist() : firstElement(0), Count(0) {}
/*Kopierkonstruktor, Destruktor und Zuweisungsoperator fehlen! Die Implementierung
von push_front() erzeugt ein neues Listenelement und fügt es am Anfang
der Liste ein:
*/
        void push_front(const T&amp; Datum) { // am Anfang einfügen
            firstElement = new ListElement(Datum, firstElement);
            ++Count;
        }
    private:
        struct ListElement {
                    T Data;
                    ListElement *Next;
                    ListElement(const T&amp; Datum, ListElement* p)
                    : Data(Datum), Next(p) {}
        };
        ListElement *firstElement;
        size_t Count;

    public:
        class iterator {
            public:
                typedef std::forward_iterator_tag iterator_category;
                typedef T value_type;
                typedef T* pointer;
                typedef T&amp; reference;
                typedef size_t size_type;
                typedef ptrdiff_t difference_type;

                iterator(ListElement* Init = 0)
                    : current(Init){}

                T&amp; operator*() { // Dereferenzierung
                        return current-&gt;Data;
                }

                const T&amp; operator*() const { // Dereferenzierung
                    return current-&gt;Data;
                }
                iterator&amp; operator++() 
                { // Präfix
                        if(current) // noch nicht am Ende angelangt?
                        current = current-&gt;Next;
                        return *this;
                }
                iterator operator++(int) { // Postfix
                        iterator temp = *this;
                        ++*this;
                        return temp;
                }
                bool operator==(const iterator&amp; x) const {
                    return current == x.current;
                }
                bool operator!=(const iterator&amp; x) const {
                    return current != x.current;
                }
            private:
                ListElement* current; // Verweis auf aktuelles Element
        }; // iterator
/*Wie oben erkennbar, wird der Kopierkonstruktor innerhalb der Postfix-Variante
des ++-Operators bei der Initialisierung und der Rückgabe von temp benötigt.
Aus diesem Grund sollte die Präfix-Variante bevorzugt werden. Einige Methoden
der Klasse slist benutzen die Klasse iterator:
*/
    iterator begin() const { return iterator(firstElement);}
    iterator end() const { return iterator();}
};
} // namespace br_stl
#endif // SIMPLELIST_H
</code></pre>
<p>[Übungsaufgabe]Dazu soll jetzt noch eine erase Methode implementiert werden:</p>
<pre><code class="language-cpp">iterator erase(iterator p);
</code></pre>
<p>Nur leider habe ich nen Stein vorm Kopf und kriege es nicht hin.<br />
Ich kann ja wohl schlecht über p auf current zugreifen um es zu löschen und ich muss ja auch dafür sorgen, dass das vorherige Element, auf das nach p zeigt.</p>
<p>Und ich habe ja auch kein prev zeiger, der mir ein Element vorger gibt.<br />
Das könnte ich ja noch selber reinmachen aber wie kriege ich denn da jetzt was gelöscht.</p>
<p>Ich habe das Gefühl in dem Code fehlt irgendwas, oder muss ich doch mehr implemtieren als nur eine Funktion..</p>
<p><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="🙄"
    /> <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="🙄"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/133732/erase-für-slist-aus-c-stl-breymann-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 03:14:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/133732.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Jan 2006 11:36:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to erase() für slist (aus C++ STL[Breymann]) implementieren on Fri, 20 Jan 2006 11:38:32 GMT]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Buch <a href="http://www.informatik.hs-bremen.de/~brey/stlb.html" rel="nofollow">http://www.informatik.hs-bremen.de/~brey/stlb.html</a> .</p>
<p>Da drin ist folgende Klasse:</p>
<pre><code class="language-cpp">#ifndef SIMPLELIST_H
#define SIMPLELIST_H
#include&lt;cassert&gt;
#include&lt;iterator&gt;
namespace br_stl {
template&lt;class T&gt;
class slist {
    public:
/*Einige Typen der Klasse slist werden mit öffentlichen, außerhalb der Klasse
verwendbaren Namen versehen, damit sie ohne Kenntnis der Implementierung
verwendet werden können.
*/
        typedef T value_type;
        typedef ptrdiff_t difference_type;
        typedef T* pointer;
        typedef T&amp; reference;
// etc. siehe Text
        slist() : firstElement(0), Count(0) {}
/*Kopierkonstruktor, Destruktor und Zuweisungsoperator fehlen! Die Implementierung
von push_front() erzeugt ein neues Listenelement und fügt es am Anfang
der Liste ein:
*/
        void push_front(const T&amp; Datum) { // am Anfang einfügen
            firstElement = new ListElement(Datum, firstElement);
            ++Count;
        }
    private:
        struct ListElement {
                    T Data;
                    ListElement *Next;
                    ListElement(const T&amp; Datum, ListElement* p)
                    : Data(Datum), Next(p) {}
        };
        ListElement *firstElement;
        size_t Count;

    public:
        class iterator {
            public:
                typedef std::forward_iterator_tag iterator_category;
                typedef T value_type;
                typedef T* pointer;
                typedef T&amp; reference;
                typedef size_t size_type;
                typedef ptrdiff_t difference_type;

                iterator(ListElement* Init = 0)
                    : current(Init){}

                T&amp; operator*() { // Dereferenzierung
                        return current-&gt;Data;
                }

                const T&amp; operator*() const { // Dereferenzierung
                    return current-&gt;Data;
                }
                iterator&amp; operator++() 
                { // Präfix
                        if(current) // noch nicht am Ende angelangt?
                        current = current-&gt;Next;
                        return *this;
                }
                iterator operator++(int) { // Postfix
                        iterator temp = *this;
                        ++*this;
                        return temp;
                }
                bool operator==(const iterator&amp; x) const {
                    return current == x.current;
                }
                bool operator!=(const iterator&amp; x) const {
                    return current != x.current;
                }
            private:
                ListElement* current; // Verweis auf aktuelles Element
        }; // iterator
/*Wie oben erkennbar, wird der Kopierkonstruktor innerhalb der Postfix-Variante
des ++-Operators bei der Initialisierung und der Rückgabe von temp benötigt.
Aus diesem Grund sollte die Präfix-Variante bevorzugt werden. Einige Methoden
der Klasse slist benutzen die Klasse iterator:
*/
    iterator begin() const { return iterator(firstElement);}
    iterator end() const { return iterator();}
};
} // namespace br_stl
#endif // SIMPLELIST_H
</code></pre>
<p>[Übungsaufgabe]Dazu soll jetzt noch eine erase Methode implementiert werden:</p>
<pre><code class="language-cpp">iterator erase(iterator p);
</code></pre>
<p>Nur leider habe ich nen Stein vorm Kopf und kriege es nicht hin.<br />
Ich kann ja wohl schlecht über p auf current zugreifen um es zu löschen und ich muss ja auch dafür sorgen, dass das vorherige Element, auf das nach p zeigt.</p>
<p>Und ich habe ja auch kein prev zeiger, der mir ein Element vorger gibt.<br />
Das könnte ich ja noch selber reinmachen aber wie kriege ich denn da jetzt was gelöscht.</p>
<p>Ich habe das Gefühl in dem Code fehlt irgendwas, oder muss ich doch mehr implemtieren als nur eine Funktion..</p>
<p><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="🙄"
    /> <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="🙄"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/971243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/971243</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 20 Jan 2006 11:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to erase() für slist (aus C++ STL[Breymann]) implementieren on Fri, 20 Jan 2006 11:43:28 GMT]]></title><description><![CDATA[<p>Um den Vorgänger von p zu finden, mußt du dich vom Anfang der Liste aus durchhangeln, bis du an der richtigen Stelle ankommst (pos-&gt;Next = p.current).</p>
<p>PS: Ja, dazu benötigst du friend-Zugriff in deine Iterator-Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/971246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/971246</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 20 Jan 2006 11:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to erase() für slist (aus C++ STL[Breymann]) implementieren on Fri, 20 Jan 2006 12:57:08 GMT]]></title><description><![CDATA[<p>Ok danke <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/971323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/971323</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 20 Jan 2006 12:57:08 GMT</pubDate></item></channel></rss>