<?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[STL - Untermenge Von STL-Container &amp;quot;List&amp;quot;]]></title><description><![CDATA[<p>Hallo,</p>
<p>So, es geht um folgendes:</p>
<p>ich muss leider STL Conteiner-Klasse &quot;List&quot; selbst implementieren als z.B. mit der Name &quot;Clist&quot; und muss selber alle memberfunktion</p>
<p>· list::assign<br />
· list::back<br />
· list::begin<br />
· list::clear<br />
· list::empty<br />
· list::end<br />
· list::erase<br />
· list::front<br />
· list::get_allocator<br />
· list::insert<br />
· list::max_size<br />
· list::merge<br />
· list::operator=<br />
· list::pop_back<br />
· list::pop_front<br />
· list::push_back<br />
· list::push_front<br />
· list::rbegin<br />
· list::remove<br />
· list::remove_if<br />
· list::rend<br />
· list::resize<br />
· list::reverse<br />
· list::size<br />
· list::sort<br />
· list::splice<br />
· list::swap<br />
· list::unique</p>
<p>implementieren. Kann jemand mir vielleicht helfen, ob es dafür eine Quelle gibt oder eine Idee vielleicht, wie ich diese Aufgabe lösen kann?? Die Aufgaben von Funktionen sind schon klar. Aber selbst implementieren kann ich leider nicht <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>Noch mal meine Aufgabe:</p>
<p>list::unique() -&gt; Clist:unique()</p>
<p>usw. für alle member Funktionen(oben) von STL Containerklasse &quot;List&quot;.</p>
<p>Viele Grüße</p>
<p>Strong</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208121/stl-untermenge-von-stl-container-quot-list-quot</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 13:44:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208121.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Mar 2008 00:16:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 00:16:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>So, es geht um folgendes:</p>
<p>ich muss leider STL Conteiner-Klasse &quot;List&quot; selbst implementieren als z.B. mit der Name &quot;Clist&quot; und muss selber alle memberfunktion</p>
<p>· list::assign<br />
· list::back<br />
· list::begin<br />
· list::clear<br />
· list::empty<br />
· list::end<br />
· list::erase<br />
· list::front<br />
· list::get_allocator<br />
· list::insert<br />
· list::max_size<br />
· list::merge<br />
· list::operator=<br />
· list::pop_back<br />
· list::pop_front<br />
· list::push_back<br />
· list::push_front<br />
· list::rbegin<br />
· list::remove<br />
· list::remove_if<br />
· list::rend<br />
· list::resize<br />
· list::reverse<br />
· list::size<br />
· list::sort<br />
· list::splice<br />
· list::swap<br />
· list::unique</p>
<p>implementieren. Kann jemand mir vielleicht helfen, ob es dafür eine Quelle gibt oder eine Idee vielleicht, wie ich diese Aufgabe lösen kann?? Die Aufgaben von Funktionen sind schon klar. Aber selbst implementieren kann ich leider nicht <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>Noch mal meine Aufgabe:</p>
<p>list::unique() -&gt; Clist:unique()</p>
<p>usw. für alle member Funktionen(oben) von STL Containerklasse &quot;List&quot;.</p>
<p>Viele Grüße</p>
<p>Strong</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474620</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 00:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 00:41:01 GMT]]></title><description><![CDATA[<p>die Implementierungen kannst du alle hier nachlesen:<br />
<a href="http://www.cplusplus.com/reference/algorithm" rel="nofollow">http://www.cplusplus.com/reference/algorithm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474627</guid><dc:creator><![CDATA[smooth_op]]></dc:creator><pubDate>Sat, 15 Mar 2008 00:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 13:08:34 GMT]]></title><description><![CDATA[<p>Die sind die Algorithmen. Ich brauche die Implementierung von Member Fuktionen von Klasse List.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474787</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 13:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 13:35:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// +---------------------------------------------------------------------------
// +  Datei: SWE3/2007.07/rotate/Clist.hpp
// +  AutorIn: 
// +  Beschreibung: Die Schnittstelle zu Clist&lt;T&gt;
// +  Revision: 2007/06/22
// +---------------------------------------------------------------------------
#if !defined(Clist_hpp) 
  #define Clist_hpp

// --- Zusätzliche Deklarationen
#include &lt;cstddef&gt;
#include &lt;iterator&gt;  // für std::bidirectional_iterator_tag

// +---------------------------------------------------------------------------
// +  namespace swe3
// +  
// +---------------------------------------------------------------------------
namespace swe3 {

// +---------------------------------------------------------------------------
// +  Vorwärtsdeklaration der Listenelemente - als Schablone.
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt; class ClistElem;

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt; - eine funktionelle Untermenge von std::list&lt;T&gt;
// +  2007/06/12
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
class Clist {
  public:
    // Die STL Typen - neu
    typedef T value_type;
    typedef value_type *pointer;
    typedef value_type const *const_pointer;
    typedef value_type &amp;reference;
    typedef value_type const &amp;const_reference;
    typedef std::ptrdiff_t difference_type;
    typedef std::size_t size_type;
    typedef void reverse_iterator;        // nicht definiert
    typedef void const_reverse_iterator;  // nicht definiert
    typedef void allocator;               // nicht definiert

    // iterator
    class iterator {
      public:
        // Die STL Typen - neu
        typedef typename Clist&lt;T&gt;::value_type value_type;
        typedef typename Clist&lt;T&gt;::pointer pointer;
        typedef typename Clist&lt;T&gt;::reference reference;
        typedef typename Clist&lt;T&gt;::difference_type difference_type;
        typedef std::bidirectional_iterator_tag iterator_category;

        // Kon- und Destruktoren
        iterator() throw();
        iterator(iterator const&amp;) throw();
        ~iterator() throw();

        // In- und Dekrement-Operatoren
        iterator&amp; operator++() throw();      // Präfix
        iterator operator++(int) throw();    // Postfix
        iterator&amp; operator--() throw();
        iterator operator--(int) throw();

        // Zuweisungsoperator
        iterator&amp; operator=(iterator const&amp;) throw();

        // Vergleichsoperatoren
        bool operator==(iterator const&amp;) const throw();
        bool operator!=(iterator const&amp;) const throw();

        // Zugriff auf die Elemente im Vektor
        T &amp;operator*();
        T *operator-&gt;();

      private:
        ClistElem&lt;T&gt; *prev_, *current_, *next_;
      friend class Clist&lt;T&gt;;
    };

    // const_iterator
    class const_iterator {
      public:
        // Die STL Typen - neu
        typedef typename Clist&lt;T&gt;::value_type const value_type;
        typedef typename Clist&lt;T&gt;::const_pointer pointer;
        typedef typename Clist&lt;T&gt;::const_reference reference;
        typedef typename Clist&lt;T&gt;::difference_type difference_type;
        typedef std::bidirectional_iterator_tag iterator_category;

        // Kon- und Destruktoren
        const_iterator() throw();
        const_iterator(const_iterator const&amp;) throw();
        const_iterator(iterator const&amp;) throw();
        ~const_iterator() throw();

        // In- und Dekrement-Operatoren
        const_iterator&amp; operator++() throw();      // Präfix
        const_iterator operator++(int) throw();    // Postfix
        const_iterator&amp; operator--() throw();
        const_iterator operator--(int) throw();

        // Zuweisungsoperator
        const_iterator&amp; operator=(const_iterator const&amp;) throw();

        // Vergleichsoperatoren
        bool operator==(const_iterator const&amp;) const throw();
        bool operator!=(const_iterator const&amp;) const throw();

        // Zugriff auf die Elemente im Vektor
        T const &amp;operator*() const;
        T const *operator-&gt;() const;

      private:
        ClistElem&lt;T&gt; *prev_, *current_, *next_;
      friend class Clist&lt;T&gt;;
    };

    // Kon- und Destruktoren
    Clist() throw();
    Clist(Clist&lt;T&gt; const&amp;);
    Clist(size_type, T const &amp;);
    ~Clist();

    // Den Zustand abfragen
    size_t size() const throw();
    bool empty() const throw();

    // Elemente einfügen, löschen (die &quot;modifiers&quot;)
    void push_back(T const&amp;);
    void pop_back();
    void push_front(T const&amp;);
    void pop_front();
    iterator insert(iterator position, T const&amp;);
    void insert(iterator position, size_type, T const&amp;);
    iterator erase(iterator position);
    iterator erase(iterator first, iterator last);
    void clear();

    // Zugriff auf einzelne Elemente (kein wahlfreier Zugriff)
    T &amp;front();
    T const &amp;front() const;
    T &amp;back();
    T const &amp;back() const;

    // Operationen auf ganzen Listen - neu mit sort
    Clist&lt;T&gt;&amp; operator=(Clist&lt;T&gt; const &amp;);
    void swap(Clist&lt;T&gt;&amp;) throw();
    // Die speziellen Sortieralgorithmen für Clist&lt;T&gt;
    //   die zweite Form als sogenannte Methoden-Schablone
    //   (member template)
    void sort();
    template &lt;typename Compare&gt; void sort(Compare);

    // begin, end
    iterator begin() throw();
    const_iterator begin() const throw();
    iterator end() throw();
    const_iterator end() const throw();

  private:
    // Die Datenelemente
    ClistElem&lt;T&gt; *head_, *tail_;
    size_type size_;
    // Hilfsmethoden
    void del_();
};

// +---------------------------------------------------------------------------
// +  void Clist&lt;T&gt;::sort(char const *) - Spezialisierung für nullterminierte
// +    Zeichenketten.
// +  
// +---------------------------------------------------------------------------
template &lt; &gt;
void Clist&lt;char const *&gt;::sort();

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt; - die Listenelemente einer doppelt verketteten Liste mit
// +    Anker. Hier definiert für Zugriff durch den Testtreiber.
// +  2007/05/09
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
class ClistElem {
  private:
    // Elemente anlegen nur für &quot;friends&quot;
    explicit ClistElem(T const &amp; =T());

  private:
    // Die Datenelemente
    ClistElem&lt;T&gt; *prev_, *next_; T value_;
    // Hilfsfunktionen
    void link_(ClistElem&lt;T&gt; *, bool append =true) throw();
    void link_(ClistElem&lt;T&gt; *, ClistElem&lt;T&gt; *, bool append=true) throw();
    void unlink_() throw();
    void unlink_(ClistElem&lt;T&gt; *) throw();

  private:  // Keine Kopien
    ClistElem(const ClistElem&lt;T&gt;&amp;);
    ClistElem&lt;T&gt;&amp; operator=(const ClistElem&lt;T&gt;&amp;);
  friend class Clist&lt;T&gt;; friend class Clist&lt;T&gt;::iterator;
  friend class Clist&lt;T&gt;::const_iterator;
};

// +---------------------------------------------------------------------------
// +  operator==(Clist&lt;T&gt; const&amp;, Clist&lt;T&gt; const&amp;)
// +    externer Operator entsprechend den STL Gepflogenheiten
// +  ------------------------------------------------------------------------
template &lt;typename T&gt;
inline bool operator==(Clist&lt;T&gt; const &amp;a, Clist&lt;T&gt; const &amp;b) {
  if (a.size() != b.size()) return false;
  typename Clist&lt;T&gt;::const_iterator aiter(a.begin()), biter(b.begin());
  for( ; aiter!=a.end() &amp;&amp; biter!=b.end() &amp;&amp; *aiter==*biter; ++aiter, ++biter);
  return aiter==a.end() &amp;&amp; biter==b.end();
}

// +---------------------------------------------------------------------------
// +  operator!=(Clist&lt;T&gt; const&amp;, Clist&lt;T&gt; const&amp;)
// +    externer Operator entsprechend den STL Gepflogenheiten
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
inline bool operator!=(Clist&lt;T&gt; const &amp;a, Clist&lt;T&gt; const &amp;b) {
  return !(a==b);
}

} // namespace

// --- Die Implementierungsdatei einbinden ------------------------------------
#include &quot;Clist.cpp&quot;
//
#endif
//
//  Ende der Datei
//
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1474793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474793</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 13:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 13:37:19 GMT]]></title><description><![CDATA[<pre><code>//+---------------------------------------------------------------------------
//+  Datei: SWE3/Clist.cpp
//+  
//+  Beschreibung: Implementierung der Klassenschablone Clist&lt;T&gt; als
//+    Untermenge von std::list&lt;T&gt;.
//+  KorrektorIn:
//+   
//+  Revision:  - Details am Ende der Datei
//+---------------------------------------------------------------------------
#if !defined(Clist_cpp) 
  #define Clist_cpp

#include &lt;cstddef&gt;
#include &lt;stdexcept&gt;
#include &quot;Clist.hpp&quot;

// --- using directives
using namespace std;

// +---------------------------------------------------------------------------
// +  namespace swe3
// +  
// +---------------------------------------------------------------------------
namespace swe3 {

// +---------------------------------------------------------------------------
// +  Clist::Clist() - Standardkonstruktor
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::Clist() throw() : head_(0), tail_(0), size_(0) {}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::Clist(Clist const&amp;) - Kopierkonstruktor; wird vom Zuweisungs-
// +    operator benutzt zur einfacheren Gewährleistung der &quot;exception 
// +    safety&quot; - es wird eine vollständige Kopie erzeugt oder nur ein
// +    leeres Objekt. Auftretende Ausnahmen werden weitergereicht.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::Clist(Clist&lt;T&gt; const &amp; list )  : head_( 0 ), tail_( 0 ), size_( 0 ) {

  //Liste leer?
  if( list.empty() ) 
	return;
  //Wenn Objekt gleiche ist, muss nichts getan werden. 
  if( this == &amp;list ) 
    return; 

  try{
    for(ClistElem&lt;T&gt; *elem=list.head_; elem ; elem=elem-&gt;next_) 
      push_back(elem-&gt;value_);
  }catch(...) { del_(); throw(&quot;Kopierkonstruktor\n&quot;); }
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::Clist(size_t n, T const &amp;s) - neue Liste mit n gleichen 
// +    Elementen. Exception safety wie beim Kopierkonstruktor: Es wird
// +    eine vollständige Liste mit n Elementen angelegt oder eine leere
// +    Liste. Auftretende Ausnahmen werden weitergereicht.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::Clist(std::size_t n, T const &amp; s ): head_( 0 ), tail_( 0 ), size_( 0 ) {

  //Wenn n null ist
  if( !n ) 
	return;
  try{
    for(size_t i=0; i&lt;n; ++i)
	  push_back(s);
  }catch(...) { del_(); throw(&quot;Clist(size_t n, T const &amp;s)\n&quot;); }
}
// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::~Clist() - Destruktor - wirft keine Ausnahmen, falls ~T keine
// +    Ausnahmen wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::~Clist() {

  //Destruktor ruft Funktion clear() auf 
  clear();	
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::size() const throw() - liefert die Anzahl enthaltener Elemente
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
size_t Clist&lt;T&gt;::size() const throw() { 

  //Anzahl von Elementen der Listen zurückgeben
  return size_; 
} 

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::empty() const throw() - liefert true, falls die Liste leer
// +    ist, sonst false,
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
bool Clist&lt;T&gt;::empty() const throw() {

  return !size_; 
} 

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::push_back(T const&amp;) - neues Element am Ende einfügen
// +    Exception safe: Einfügen oder die Liste unverändert lassen.
// +    Die Funktion kann bei Mangel an freiem Speicher Ausnahmen werfen,
// +    bzw. falls der T Konstruktor eine Ausnahme wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::push_back(T const &amp; s) {

  //dynamisch (mit *elem new ClistElem&lt;T&gt;(s)) erzeugen
  ClistElem&lt;T&gt; *elem = new ClistElem&lt;T&gt;( s ); 
  //Wenn es Speicherplatz nicht gibt
  if( !elem ) 
    throw bad_alloc();
  //Wenn noch kein Element eingefügt
  if( !head_ )
  //zeigt head auf das erste Element  
	head_ = elem; 
  else
  //das neue Element mit dem letzten Element (tail) verlinken (link_(elem))
  	tail_-&gt;link_( elem );
  //Tail zeigt auf auf das neue Element
  tail_ = elem; 
  //Size eins erhoehen, da ein Element mehr in der Liste
  ++size_;		
} 

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::pop_back() - das Element am aktuellen Ende löschen.
// +    Die Funktion wirft keine Ausnahmen, falls ~T keine wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::pop_back() {

  //Wenn tail nichts zeigt,
  if( !tail_ ) 
	throw out_of_range(&quot;pop_back()-Clist ist leer&quot;);
  //Neue ClistElem initialisieren mit tail-prev 
  ClistElem&lt;T&gt; *letzte =  tail_-&gt;prev_; 
  //Letze Element muss aus der Liste unlinken
  tail_-&gt;unlink_(); 
  //tail zeigt auf letzte
  tail_ = letzte;
  //Wenn tail =0, dann head ist auch =0
  if( !tail_ )  
    head_ = 0;  
  //Size eins erniedrigen, da ein Element weniger in der Liste
  --size_;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::push_front(T const&amp;) - neues Element am Anfang einfügen
// +    Exception safe: Einfügen oder die Liste unverändert lassen.
// +    Die Funktion kann bei Mangel an freiem Speicher Ausnahmen werfen,
// +    bzw. falls der T Konstruktor eine Ausnahme wirft (vgl. push_back).
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::push_front(T const&amp;s) {

  //dynamisch (mit *elem new ClistElem&lt;T&gt;(s)) erzeugen
  ClistElem&lt;T&gt; *elem = new ClistElem&lt;T&gt;( s );
  //Wenn es Speicherplatz nicht zur Verfuegung steht
  if( !elem ) 
	throw bad_alloc();
  //Wenn noch kein Element eingefügt
  if( !head_ )
  {
     //zeigt head auf das erste Element
     head_ = elem;	
     //tail ist head
     tail_ = head_; 
  }
    else 
    //ansonsten vor head_ linken deswegen 2.Parameter false
     head_-&gt;link_( elem, false );	

  //Neues head_ ist elem
  head_ = elem; 
  //Size eins erhoehen, da ein Element mehr in der Liste
  ++size_;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::pop_front() - das Element am aktuellen Anfang löschen.
// +    Die Funktion wirft keine Ausnahmen, falls ~T keine wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::pop_front() {

  //Wenn head nichts zeigt, 
  if( !head_ ) 
	throw out_of_range(&quot;pop_front() CList is empty \n&quot;);
  //Neue ClistElem initialisieren mit head-&gt;next
  ClistElem&lt;T&gt; *erste =  head_-&gt;next_;
  //Letze Element muss aus der Liste unlinken
  head_-&gt;unlink_();
  //head mit erste zuweisen
  head_ = erste;
  //wenn head nichts zeigt, dann tail ist 0
  if( !head_ ) 
	tail_ = 0;
  //Size eins erniedrigen, da ein Element weniger in der Liste
  --size_;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::insert(iterator pos, T const &amp;t) - ein Element einfügen
// +    vor pos. Gibt einen Iterator zum neu eingefügten Element zurück.
// +    Exception safe: Einfügen oder die Liste unverändert lassen.
// +    Die Funktion kann bei Mangel an freiem Speicher Ausnahmen werfen,
// +    bzw. falls der T Konstruktor eine Ausnahme wirft (wie push_back).
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::insert(Clist&lt;T&gt;::iterator pos, T const &amp; t) {

  if( !pos.prev_ &amp;&amp; !pos.next_ &amp;&amp; pos.current_ != head_ ){
    return typename Clist&lt;T&gt;::iterator(); 
  }

  //Überprüfen, ob pos == begin() 
  if (pos==begin()){
    insert(pos, 1, t); 
	return begin(); 
  }

  //Überprüfen, ob pos == end() 
  if( pos==end() ){ 
    insert(pos, 1, t); 
	return (--end());
  }
  //Wenn in die Mitte der Liste
  else {
    insert(pos, 1, t); 
    typename Clist&lt;T&gt;::iterator iter;
    iter.prev_ = pos.prev_; 
    iter.current_ = pos.current_-&gt;prev_;  
    iter.next_ = pos.current_;
    return iter; 
  }

}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::insert(iterator pos, size_type n, T const &amp;t) - n neue
// +    Element mit Wert t vor pos einfügen.
// +    Exception safe: Einfügen oder die Liste unverändert lassen.
// +    Die Funktion kann bei Mangel an freiem Speicher Ausnahmen werfen,
// +    bzw. falls der T Konstruktor eine Ausnahme wirft (wie insert).
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::insert(iterator pos, size_type n, T const &amp; t) {

  //Wenn n = 0 ist, muss nichts zurückgeben
  if (!n) return; 
  //Temporaer Clist Element erzeugen durch Clist&lt;T&gt; tmp(n,t)
  Clist&lt;T&gt; temp(n, t); 
  //Wenn aktuelle Element-&gt;empty() 
  if (this-&gt;empty()) {
    *this = temp; 
    return; 
  }
  //Wenn pos == begin() 
  if (pos == begin()) {
    pos.current_-&gt;link_(temp.head_, temp.tail_, false); 
    head_ = temp.head_; 
  }
  //Wenn pos == end()
  else if (pos == end()) {
    pos.prev_-&gt;link_(temp.head_, temp.tail_, true);
    tail_ = temp.tail_;
  }
   else 
     pos.current_-&gt;link_(temp.head_, temp.tail_, false);
  //size muss n mal erhöht werden
  size_ = n + size_; 
  //Temporaer Objekt loeschen(head, tail, size) 
  temp.head_ = temp.tail_ =  0; temp.size_ = 0; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::erase(iterator pos) - das Element beim Iterator pos löschen.
// +   Rückgabewert ist ein Iterator zum ersten Element nach pos, end() falls
// +   das Element am Ende der Liste gelöscht wurde (pos==--end()).
// +    Die Funktion wirft keine Ausnahmen, falls ~T keine wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::erase(iterator pos) {

  if( !pos.prev_ &amp;&amp; !pos.next_ &amp;&amp; pos.current_ != head_ ){
    return typename Clist&lt;T&gt;::iterator(); 
  }
  if( (pos==--begin()) || (pos==end()) )
    return typename Clist&lt;T&gt;::iterator();

  //Am Anfang der Liste kann pop_front() verwendet werden 
  //Vorteil: pop_front() setzt auch den head_ Zeiger entsprechend 
  //bzw. passt die Groesse an
  if( pos == begin() ) {
    pop_front(); 
    return begin(); 
  }
  //Am Ende der Liste kann pop_back() verwendet werden
  //Vorteil: pop_back() setzt auch den tail_ Zeiger entsprechend 
  //bzw. passt die Groesse an
  if( pos == --end() ) {
    pop_back(); 
    return end(); 
  }

  //Wenn es nicht zu loeschen ist, dann leere Iterator zurück

  //irgendwo in der Mitte der Liste loeschen -&gt; unlink_() Funktion 
  //für ein Element der Liste 
  else {
    typename Clist&lt;T&gt;::iterator iter; 
    iter.prev_ = pos.prev_; 
    iter.current_ = pos.next_; 
    iter.next_= pos.next_-&gt;next_; 
	//pos.current unlinken
    pos.current_-&gt;unlink_();
	//Size eins erniedrigen, da ein Element weniger in der Liste
    --size_; 
    return iter; 
  }
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::erase(iterator first, iterator last) - die Elemente im Inter-
// +    vall [frst,lst) löschen. Rückgabewert ist ein Iterator zum ersten
// +    Element nach den gelöschten Elementen, end() falls auch das Element
// +    am Ende der Liste gelöscht wurde (last==end()).
// +    Die Funktion wirft keine Ausnahmen, falls ~T keine wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::erase(iterator first, iterator last) {
  //Wenn first ist gleich last ist, dann last zurückgeben
  if (first==last) return last;
  //2 ClistElem&lt;T&gt; temporaer element erzeugen und erste mit first.current, 
  //zweite mit last.prev_ initialisieren
  ClistElem&lt;T&gt; *p(first.current_), *q(last.prev_);
  // head_, tail_
  if (head_==p) head_=q-&gt;next_;
  if (tail_==q) tail_=p-&gt;prev_;

  // Aushaengen
  p-&gt;unlink_(q);

  // garbage collection
  q-&gt;next_ = 0;
  size_t anz(0);
  ClistElem&lt;T&gt; *n(p-&gt;next_);
  while (p) {
    ++anz;
    delete p; p=n; n=(n)?n-&gt;next_:0;
  }

  //size ist size - anz
  size_ -= anz;    

  //Rueckgabewert ist iterator
  typename Clist&lt;T&gt;::iterator iter;
  iter.current_ = last.current_; iter.next_ = last.next_;
  iter.prev_=first.prev_;

  return iter;

}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::clear - alles löschen. Die Funktion wirft keine Ausnahmen, 
// +    falls ~T keine wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::clear(){
  //Solange tail_ darauf zeigt, durch pop_back() von hinten
  while(tail_)
    pop_back();
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::front() - Zugriff zum ersten Element
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
T&amp; Clist&lt;T&gt;::front(){ 
  if(!head_) throw(&quot;Front&quot;); 
  return head_-&gt;value_; 

}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::front() const - Zugriff zum ersten Element
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
const T&amp; Clist&lt;T&gt;::front() const {
  if(!head_) throw(&quot;Front&quot;);
  return head_-&gt;value_; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::back() - Zugriff zum letzten Element
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
T&amp; Clist&lt;T&gt;::back(){
  if(!tail_) throw(&quot;Front&quot;);	
  return tail_-&gt;value_;

}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::back() const - Zugriff zum letzten Element
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
const T&amp; Clist&lt;T&gt;::back() const {
  if(!tail_) throw(&quot;Front&quot;);
  return tail_-&gt;value_; 

}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::operator=(Clist const&amp;) - Zuweisungsoperator. 
// +    Exception safe: Die Zuweisung wird vollständig durchgeführt, oder
// +    die Zielliste (lvalue) wird nicht verändert. Auftretende Ausnahmen
// +    werden weitergegeben.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;&amp; Clist&lt;T&gt;::operator=(Clist&lt;T&gt; const &amp;list){
  //wenn this gleich &amp;list dann gibt einfach this zurück
  if( this == &amp;list ) 
    return *this; 
  //Neue Clist erzeugen und  mit list initialisieren
  Clist&lt;T&gt; listCopy( list );
  //swap funktion aufrufen um neue Clist zu vertauschen 
  //swap als Parameter mit neuen Element aufrufen
  swap( listCopy );
  // Ende this zurück
  return *this;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::swap throw() - Inhalte tauschen in O(1) Zeit , dh. unab-
// +    hängig von der Länge der Listen.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::swap(Clist&lt;T&gt; &amp; list )throw(){ 
  //2 Elemente als temporaer vom Typ ClistElem&lt;T&gt; für head und tail
  ClistElem&lt;T&gt; *anfang = list.head_;
  ClistElem&lt;T&gt; *ende = list.tail_;  
  size_t size = list.size_;
  //Memberdaten von List tauschen
  list.head_ = head_; 
  list.tail_ = tail_; 
  list.size_ = size_;
  //Neue werte von head,tail und size zuweisen
  head_ = anfang; 
  tail_ = ende; 
  size_ = size;	
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::sort() - die Liste sortieren mittels des &lt; Operators für T.
// +    Als Algorithmus wird bubble-sort verwendet - nicht optimal!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::sort()throw(){
  for (ClistElem&lt;T&gt; *p(head_); p; p=p-&gt;next_) {
    for (ClistElem&lt;T&gt; *q(p-&gt;next_); q; q=q-&gt;next_) {
      if(q-&gt;value_ &lt; p-&gt;value_) std::swap(p-&gt;value_,q-&gt;value_);
    }
  }
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::sort(Compare comp) - die Liste sortieren nach der von comp
// +    bestimmten Ordung. Als Algorithmus wird bubble-sort verwendet.
// +    Eine Methoden-Schablone: template geschachtelt!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt; 
template &lt;typename Compare&gt;  //sort() ist selbst ein template
void Clist&lt;T&gt;::sort(Compare comp)throw() {
  for (ClistElem&lt;T&gt; *p(head_); p; p=p-&gt;next_) {
    for (ClistElem&lt;T&gt; *q(p-&gt;next_); q; q=q-&gt;next_) { 
      if (comp(q-&gt;value_, p-&gt;value_)) std::swap(p-&gt;value_,q-&gt;value_);
    }
  }
}

// +---------------------------------------------------------------------------
// +  Clist&lt;char const *&gt;::sort() - die Liste sortieren nach dem &lt; Operator
// +    für T; Spezialisierung für const char * mit strcmp.
// +    Als Algorithmus wird bubble-sort verwendet - nicht optimal!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt; &gt;
inline void Clist&lt;char const *&gt;::sort()throw(){
  for (ClistElem&lt;char const *&gt; *p(head_); p; p=p-&gt;next_) {
    for (ClistElem&lt;char const *&gt; *q(p-&gt;next_); q; q=q-&gt;next_) { 
      if (strcmp(q-&gt;value_, p-&gt;value_) &lt; 0) std::swap(p-&gt;value_,q-&gt;value_);
    }
  }
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::begin() - Iterator auf den Anfang der Liste -&gt; Rückgabewert iterator
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::begin()throw(){
  //Neu iterator definieren
 iterator it; 
 //für neue iterator prev ist gleich Null
 it.prev_ = 0; 
 //für neue iterator current ist gleich head
 it.current_ = head_; 
 if (head_) it.next_ = head_-&gt;next_; 
   else it.next_ = 0;  
 //neue iterator zurueck geben
 return it;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::begin() const - Iterator auf den Anfang der Liste
// +  , 20.12.2007-&gt; ist wie begin(), aber als const
// +  Kommentare: Wie iterator begin(), allerdings als const
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator Clist&lt;T&gt;::begin() const throw(){
  const_iterator it;
  it.prev_ = 0; 
  it.current_ = head_; 
  if (head_) it.next_ = head_-&gt;next_; 
    else it.next_ = 0;   
  return it; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::end() - Iterator auf erste Element &quot;nach&quot; dem Vektor:
// +    &quot;off-the-end iterator&quot;
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::end()throw(){
	//Neue Iterator it definieren
	iterator it; 
	//it.prev ist gleich tail
	it.prev_ = tail_; 
	//it.current und it.next ist gleich null
    it.current_ = it.next_ = 0;
	//Neue Iterator zurückgeben
	return it;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::end() const - Iterator auf erste Element &quot;nach&quot; dem Vektor:
// +    &quot;off-the-end iterator&quot;
// +  , 20.12.2007-&gt; wie end(), aber als const
// +  Kommentare: Wie iterator end(), allerdings als const
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator Clist&lt;T&gt;::end() const throw() {
  const_iterator iter; 
  iter.prev_ = tail_;
  iter.current_ = iter.next_ = 0; 
  return iter; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::del_() - alle Elemente einer Clist löschen. Die Methode 
// +    arbeitet vom Ende her. Sie wirft keine Ausnahmen, falls ~T keine
// +    wirft.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void Clist&lt;T&gt;::del_() {
  //Solange tail was zeigt durch pop_back (von hinten) elemente loeshen
  while( tail_ )
    this-&gt;pop_back();
}

// +--------------------------------------------------------------------------
// +  Implementierung von Iteratoren
// +  Innerhalb Clist Klasse gibt es auch andere Klassen wie z.B. class iterator und
// +  class const_iterator. Die müssen auch in Clist.cpp implementiert werden. 
// +  A.Güclü Ercin, 20.12.2007
// +--------------------------------------------------------------------------

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::iterator() - Standard-Konstruktor; die Einträge
// +    werden über begin() und end() gesetzt, bzw. über die In- und De-
// +    krement-Operatoren verändert
// +  Standard-Konstruktor setzt alle Member Daten(prev_,current_, next_) auf 0
// +  , 20.12.2007
// +---------------------------------------------------------------------------

template &lt;typename T&gt;
Clist&lt;T&gt;::iterator::iterator()throw(): prev_(0), current_(0), next_(0){ }

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::iterator(iterator const&amp;) - Kopier-Konstruktor
// +   , 20.12.2007
// +  Kopier-Konstruktor setzt alle Member Daten auf als parameter übergegebene Werte
// +  mit sich selbt z.B. prev(it.prev_)
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::iterator::iterator(iterator const &amp;it) throw(): 
          prev_( it.prev_ ),current_( it.current_ ), next_( it.next_ ) { }

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::~iterator() - Destruktor
// +  , 20.12.2007
// +  Destruktor setzt alle Member Daten auf Null in Funktionskörper.
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::iterator::~iterator() throw() {prev_ = 0; current_ = 0; next_ = 0; }

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator++() - Inkrement, Präfix
// +    Keine Plausibilitätsprüfung! Spezielle Behandlung der Fälle &quot;vor&quot; und
// +    &quot;nach&quot; der Liste.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator&amp; Clist&lt;T&gt;::iterator::operator++()throw(){      

  if( current_ ){      
    prev_ = current_; 
    current_ = next_;	
    if( current_ ) next_ = current_-&gt;next_ ;
	  else next_ = 0; 
  }
  else 
  if( next_ ){   // vor dem Anfang
    prev_ = 0; 
    current_ = next_; 
    if( current_ )next_ = current_-&gt;next_;
	  else next_ = 0; 
  }

  return *this;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator++(int) - Inkrement, Postfix
// +    Keine Plausibilitätsprüfung!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::iterator::operator++(int)throw(){    

  iterator it( *this );
  ++( *this );	
  return it;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator--() - Dekrement, Präfix
// +    Keine Plausibilitätsprüfung! Spezielle Behandlung der Fälle &quot;vor&quot; und
// +    &quot;nach&quot; der Liste.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator&amp; Clist&lt;T&gt;::iterator::operator--()throw(){

  if( current_ ){ 
	next_ = current_; 
    current_ = prev_; 
    if( current_ ) prev_ = current_-&gt;prev_ ;
	  else prev_ = 0;
  }
  else 
  if( prev_ ){
	next_ = 0; 
    current_ = prev_; 
    if( current_ ) prev_ = current_-&gt;prev_;
	  else prev_ = 0; 
  } 

  return *this;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator--(int) - Dekrement, Postfix
// +    Keine Plausibilitätsprüfung!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator Clist&lt;T&gt;::iterator::operator--(int)throw(){

	iterator it( *this );
	--(*this);
	return it;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator=(iterator const&amp;)
// +  , 20.12.2007
// +  &quot;Operator =&quot; setzt alle Member Daten auf als parameter übergegebene Werte
// +  mit sich selbt z.B. prev(it.prev_) und gibt *this zurück
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::iterator&amp; Clist&lt;T&gt;::iterator::operator=(iterator const&amp; it)
throw(){

 prev_ = it.prev_; 
 current_ = it.current_; 
 next_ = it.next_;

 return (*this);
}

// +----------------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator==(iterator const&amp;) - nur iteratoren zum
// +    selben Container können gleich sein!
// +  , 20.12.2007
// +  Gibt true zurück wenn Member Daten gleich mit als parameter übergegebene
// +  Objekt ist. so z.B. prev_==it.prev_ &amp;&amp; current_==it.current_ &amp;&amp; next_==it.next_
// +-----------------------------------------------------------------------------------
template &lt;typename T&gt;
bool Clist&lt;T&gt;::iterator::operator==(iterator const &amp; it ) const throw(){

	return  prev_==it.prev_ &amp;&amp; current_==it.current_ 
            &amp;&amp; next_==it.next_;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator!=(iterator const&amp;)
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
bool Clist&lt;T&gt;::iterator::operator!=(iterator const &amp; it) const throw(){

	return !( *this == it );
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator*() - Zugriff auf das Element, auf das der
// +    aktuelle Iterator &quot;verweist&quot;. Die Plausibilitätskontrolle ist bei
// +    den gängigen STL Implementierungen nicht vorhanden wegen der Lauf-
// +    zeitverschlechterung.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
T&amp; Clist&lt;T&gt;::iterator::operator*(){

  if ( ((!current_) &amp;&amp; (!next_)) || ((!prev_) &amp;&amp; (!current_)) ) 
    throw out_of_range(&quot;*op bad iterator&quot;);
  // (!current_) &amp;&amp; (!next_) -&gt; am hinteren Ende der Liste?
  // (!prev_) &amp;&amp; (!current_) -&gt; am vorderen Ende der Liste?

  return current_-&gt;value_; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::iterator::operator-&gt;() - Zugriff auf Elemente des Ts,
// +    auf den der aktuelle Iterator &quot;verweist&quot;. 
// +    Die Plausibilitätskontrolle ist bei den gängigen STL Implementierungen
// +    nicht vorhanden wegen der Laufzeitverschlechterung.
// +  , 20.12.2007
// +---------------------------------------------------------------------------

template &lt;typename T&gt;
T* Clist&lt;T&gt;::iterator::operator-&gt;(){

  if ( ((!current_) &amp;&amp; (!next_)) || ((!prev_) &amp;&amp; (!current_)) ) 
   throw out_of_range(&quot;-&gt;op bad iterator&quot;); 
    //Erklärung siehe operator*()
    //(!current_) &amp;&amp; (!next_) -&gt; am hinteren Ende der Liste?
    //(!prev_) &amp;&amp; (!current_) -&gt; am vorderen Ende der Liste?
  return &amp;(current_-&gt;value_); 
}

// +---------------------------------------------------------------------------
// + Implementierung von Const_Iteratoren - class const_iterator
// +---------------------------------------------------------------------------
// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::const_iterator() - Standard-Konstruktor; die
// +    Einträge werden über begin() const und end() const gesetzt, bzw. über
// +    die In- und Dekrement-Operatoren verändert
// +  , 20.12.2007
// + Standard-Konstruktor setzt alle Member Daten auf Null
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::const_iterator::const_iterator()throw(): 
prev_(0), current_(0), next_(0) {}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::const_iterator(const_iterator const&amp;) -
// +    Kopier-Konstruktor
// +  , 20.12.2007
// +  wie oben bei der Klasse iterator-&gt; Kopierkonstruktor
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::const_iterator::const_iterator(const_iterator const &amp; it) throw(){

  prev_ = it.prev_; 
  current_ = it.current_; 
  next_ = it.next_; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::const_iterator(iterator const&amp;) -
// +    Konvertierung von iterator zu const_iterator
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::const_iterator::const_iterator(iterator const &amp; it) throw() {

  prev_ = it.prev_; 
  current_ = it.current_; 
  next_ = it.next_; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::~const_iterator() - Destruktor
// +  , 20.12.2007
// +  wie bei der Klasse iterator Destruktor
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
Clist&lt;T&gt;::const_iterator::~const_iterator() throw(){

  prev_ = 0; current_ = 0; next_ = 0; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator++() - Inkrement, Präfix
// +    Keine Plausibilitätsprüfung! Spezielle Behandlung der Fälle &quot;vor&quot; und
// +    &quot;nach&quot; der Liste.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator&amp; Clist&lt;T&gt;::const_iterator::operator++() throw(){

   if( current_ ){      
    prev_ = current_; 
    current_ = next_;	
    if( current_ ) next_ = current_-&gt;next_ ;
	  else next_ = 0; 
  }
  else 
  if( next_ ){   // vor dem Anfang
    prev_ = 0; 
    current_ = next_; 
    if( current_ )next_ = current_-&gt;next_;
	  else next_ = 0; 
  }

  return *this;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator++(int) - Inkrement, Postfix
// +    Keine Plausibilitätsprüfung!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator Clist&lt;T&gt;::const_iterator::operator++(int)
throw(){  
  //die Werte des alten Operanden &quot;sichern&quot; 
  iterator It; It.prev_ = prev_; It.current_ = current_;
  It.next_ = next_; 
  ++( *this );	
  return It;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator--() - Dekrement, Präfix
// +    Keine Plausibilitätsprüfung! Spezielle Behandlung der Fälle &quot;vor&quot; und
// +    &quot;nach&quot; der Liste.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator&amp; Clist&lt;T&gt;::const_iterator::operator--()
throw(){

  if( current_ ){ 
	next_ = current_; 
    current_ = prev_; 
    if( current_ ) prev_ = current_-&gt;prev_ ;
	  else prev_ = 0;
  }
  else 
  if( prev_ ){
	next_ = 0; 
    current_ = prev_; 
    if( current_ ) prev_ = current_-&gt;prev_;
	  else prev_ = 0; 
  } 

  return *this;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator--(int) - Dekrement, Postfix
// +    Keine Plausibilitätsprüfung!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator Clist&lt;T&gt;::const_iterator::operator--(int)
throw(){
	//die Werte des alten Operanden &quot;sichern&quot;
  iterator It; It.prev_ = prev_; It.current_ = current_;
  It.next_ = next_; 
  --( *this );	
  return It;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator=(const_iterator const&amp;)
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
typename Clist&lt;T&gt;::const_iterator&amp; Clist&lt;T&gt;::const_iterator::
                   operator=(const_iterator const&amp;it)throw(){

 prev_ = it.prev_; 
 current_ = it.current_; 
 next_ = it.next_;
 return (*this);
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator==(const_iterator const&amp;) - nur
// +    const_iteratoren zum selben Container können gleich sein!
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
bool Clist&lt;T&gt;::const_iterator::
               operator==(const_iterator const &amp; it ) const throw(){

  return prev_==it.prev_ &amp;&amp; current_==it.current_ &amp;&amp; next_==it.next_;
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator!=(const_iterator const&amp;)
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
bool Clist&lt;T&gt;::const_iterator::
               operator!=(const_iterator const &amp; it) const throw(){

	return !( *this == it );
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator*() - Zugriff auf das Element, auf
// +    das der aktuelle const_Iterator &quot;verweist&quot;.
// +    Die Plausibilitätskontrolle ist bei den gängigen STL Implementierungen
// +     nicht vorhanden wegen der Laufzeitverschlechterung.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
const T&amp; Clist&lt;T&gt;::const_iterator::operator*()const {

  if( ((!current_) &amp;&amp; (!next_)) || ((!prev_) &amp;&amp; (!current_)) ) 
    throw out_of_range(&quot;*op bad iterator&quot;);
  // (!current_) &amp;&amp; (!next_) -&gt; am hinteren Ende der Liste?
  // (!prev_) &amp;&amp; (!current_) -&gt; am vorderen Ende der Liste?
  return current_-&gt;value_; 
}

// +---------------------------------------------------------------------------
// +  Clist&lt;T&gt;::const_iterator::operator-&gt;() - Zugriff auf das Elemente, 
// +    auf das der aktuelle const_Iterator &quot;verweist&quot;. 
// +    Die Plausibilitätskontrolle ist bei den gängigen STL Implementierungen
// +    nicht vorhanden wegen der Laufzeitverschlechterung.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
const T* Clist&lt;T&gt;::const_iterator::operator-&gt;() const {

  if( ((!current_) &amp;&amp; (!next_)) || ((!prev_) &amp;&amp; (!current_)) ) 
    throw out_of_range(&quot;-&gt;op bad iterator&quot;); 
    //Erklärung siehe operator*()
    //(!current_) &amp;&amp; (!next_) -&gt; am hinteren Ende der Liste?
   //(!prev_) &amp;&amp; (!current_) -&gt; am vorderen Ende der Liste?
  return &amp;(current_-&gt;value_); 
}

// +---------------------------------------------------------------------------
// + Implementierung von Klasse ClistElem 
// +---------------------------------------------------------------------------

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt;::ClistElem(T const &amp; =T()) - der einzige Konstruktor;
// +    definiert den Standardkonstruktor mit, da der einzige Parameter
// +    wegen der Vorbesetzung auch fehlen kann.
// +  , 20.12.2007
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
ClistElem&lt;T&gt;::ClistElem(T const &amp;s) : prev_(0), next_(0), value_(s) {}

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt;::link_(ClistElem *, bool) - ein neues Element p beim
// +    aktuellen Listenelement einfügen.
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void ClistElem&lt;T&gt;::link_(ClistElem *elem, bool append) throw() {
  if (!elem) return;
  if (append) {  // elem nach dem aktuellen einhängen
    elem-&gt;prev_ = this; elem-&gt;next_ = next_;
    if (next_) next_-&gt;prev_ = elem;
    next_ = elem;
  } else {  // ... vor dem aktuellen 
    elem-&gt;next_ = this;  elem-&gt;prev_ = prev_;
    if (prev_) prev_-&gt;next_ = elem;
    prev_ = elem;
  }
}

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt;::link_(ClistElem *first, ClistElem *last, bool append) -
// +    beim aktuellen Element eine ganze bereits verkettete Liste einfügen
// +    (&quot;merge&quot;): [first,last] - also inklusive last!
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void ClistElem&lt;T&gt;::link_(ClistElem *first, ClistElem *last, bool append)
   throw() {
  if (!first || !last) return;
  if (append) {  // nach dem aktuellen Element einhängen
    first-&gt;prev_ = this; last-&gt;next_ = next_;
    if (next_) next_-&gt;prev_ = last;
    next_ = first;
  } else {  // vor dem aktuellen Element einhängen
    last-&gt;next_ = this;  first-&gt;prev_ = prev_;
    if (prev_) prev_-&gt;next_ = first;
    prev_ = last;
  }
}

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt;::unlink_() - das aktuelle Element aus der Liste aushängen.
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void ClistElem&lt;T&gt;::unlink_() throw() {
  if (prev_) prev_-&gt;next_ = next_;
  if (next_) next_-&gt;prev_ = prev_;
}

// +---------------------------------------------------------------------------
// +  ClistElem&lt;T&gt;::unlink_(ClistElem *last) - den Teil der Liste vom
// +    aktuellen Element bis einschließlich(!) last aushängen (&quot;splice&quot;)
// +    [this,last] - also inklusive last!
// +  
// +---------------------------------------------------------------------------
template &lt;typename T&gt;
void ClistElem&lt;T&gt;::unlink_(ClistElem *last)  throw() {
  if (!last) return;
  if (prev_) prev_-&gt;next_ = last-&gt;next_;
  if (last-&gt;next_) last-&gt;next_-&gt;prev_ = prev_;
}

template&lt;typename T&gt;
void Clist&lt;T&gt;::resize(size_type sz, T c ){

}

template&lt;typename T&gt;
void Clist&lt;T&gt;::reverse(){
/*
  if(!head_) return;
  while( head_ != tail_ ){  // ---&gt; endlose Schleife, falls die Liste nicht
   std::swap(head_-&gt; value_ , tail_ -&gt; value_);  // ---&gt; leer ist!!!
   //head_ ++;
    }
*/

ClistElem&lt;T&gt; *p(head_);
ClistElem&lt;T&gt; *q(tail_);

  for( ; p !=q ; p=p-&gt;nxt_,--q)
    std::swap(p-&gt;value, q-&gt;value);

}
/* 
  for( ;head_ != tail_; head_=head_-&gt;next_)
    head_ = tail_;
*/

} // namespace swe3
//
#endif
//
// +---------------------------------------------------------------------------
// +  Liste der Änderungen
// +  Datenelement       Datum        AutorIn       Beschreibung
// +---------------------------------------------------------------------------
// +  Modul         20.12.2007     erste Version
// +				24.12.2007     zweite Version
// +                04.12.2007     letzte Version
// +
//
//  Ende der Datei
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1474796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474796</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 13:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 13:41:21 GMT]]></title><description><![CDATA[<p>Ich muss jetzt oben stehende Klasse-Clist mit anderen Funktionen wie resize,rend usw. erweitern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474798</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 13:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 14:33:33 GMT]]></title><description><![CDATA[<p>strong schrieb:</p>
<blockquote>
<p>Ich muss jetzt oben stehende Klasse-Clist mit anderen Funktionen wie resize,rend usw. erweitern.</p>
</blockquote>
<p>Woran haperts denn genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474824</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 15 Mar 2008 14:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 15:05:46 GMT]]></title><description><![CDATA[<p>Einer von diesen Funktionen wird Klausur-Aufgabe. Wir müssen Implementierungen selbst schreiben. Der will nicht, dass man einfach die Funktionen aus der Bibliothek nutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474844</guid><dc:creator><![CDATA[strong]]></dc:creator><pubDate>Sat, 15 Mar 2008 15:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to STL - Untermenge Von STL-Container &amp;quot;List&amp;quot; on Sat, 15 Mar 2008 16:23:28 GMT]]></title><description><![CDATA[<p>Hier Lösungen oder Lösungsskizzen zu zeigen, wäre so etwas wie Hausaufgaben machen. Der bisherige Aufbau ist nicht ganz unbrauchbar, aber es haben sich auch einige Fehler (die ich hier nicht aufzählen will, das wäre nach der Klausur denkbar) eingeschlichen und es wird an einigen Stellen - wahrscheinlich aus Unwissenheit - ohne Not vom Verhalten von std::list abgewichen. Der Verzicht auf einen Allokator gehört sicherlich nicht dazu, aber logischerweise führt das natürlich dazu, dass get_allocator überflüssig wird. max_size ist eher uninteressant, wenn man ohne Allokatoren arbeitet. Gleiches gilt dann entsprechend für rbegin,rend.<br />
Was am meisten auffällt, ist, dass offenbar das Wesen - oder die spezielle Eigenheit - doppelt verketteter Listen nicht erkannt wurde: im Gegensatz zu Container wie vector oder deque kann man (im Prinzip - wenn man auf konstante Laufzeit von size() verzichtet, was erlaubt ist) alle interessanten Listenoperationen ausschließlich über Iteratoren implementieren, ohne jedesmal das konkrete Containerobjekt als solches anfassen zu müssen. Oder möglicherweise ist das auch ein fehlendes Verständnis dafür, was ein Iterator ist - jedenfalls ist dessen Implementierung etwas seltsam.</p>
<p>Ein paar Kleinigkeiten, die nichts direkt mit dem Problem zu tun haben, kann ich anmerken:<br />
So etwas wie Selbstzuweisung gibt es im Copy-ctor nicht, eine entsprechende Prüfung ist dort fehl am Platz (und ein exceptionsicherer Zuweisungsoperator bedarf einer solchen Prüfung normalerweise auch nicht). Zudem sollten Funktionen durchlässig für Exceptions sein: wenn eine Funktion fehlschlägt, weil zum Beispiel das Kopieren eines Elements fehlschlägt, sollte diese Exception - nach den entsprechenden Aufräumaktionen - unverändert weitergeworfen werden. Dem Aufrufer anzuzeigen, welche Funktion fehlgeschlagen ist, ist schließlich sinnlos: das weis der Aufrufer sowieso - nicht aber welche konkrete elementare Funktion nicht durchgeführt werden konnte. new liefert niemals 0 zurück.<br />
Destruktoren sollten (im Zusammenhang mit der Standardbibliothek) niemals Exceptions auslösen. Es ist praktisch unmöglich, excptionsicher zu progammieren, wenn diese Regel nicht eingehalten wird, das muss daher dann auch nicht behandelt werden. der Vollständigkeit halber kannst du dem Destruktor auch noch die entsprechende leere Exceptionspezifikation verpassen.<br />
Die Iterator-Operatoren * und -&gt; sollten const sein.<br />
Der value_type eines const_iterators bleibt ohne zusätzliches const (wird nicht vorgeschrieben - aber Analogie zu iterator_traits&lt;T*&gt;)</p>
<p>Die einzig wirklich interessante und sehr wichtige Operation mit Listen ist splice - damit lassen sich andere Funktionen leichter implementieren: indem swaps durch splice durchgeführt werden, entfallen potentielle Quellen für das Werfen von Exceptions, und zum Einhalten der Komplexitätsgarantien ist es ebenfalls unverzichtbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1474907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1474907</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 15 Mar 2008 16:23:28 GMT</pubDate></item></channel></rss>