<?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[Schneller Copy Konstruktor für einen Stack]]></title><description><![CDATA[<p>Kennt jemand einen schnellen Copy Konstruktor für nen Stack</p>
<p>zur zeit habe ich:</p>
<pre><code class="language-cpp">#pragma once

template&lt;class T&gt;
class Stack
{
private:
	class Element
	{
	public:
		Element *next;
		T data;
	};
	Element *top;
	int anzahl_elemente;
public:
	Stack();
	~Stack();
	int push(T v);
	int pop(T&amp; v);
	int get_anzahl();
	int is_empty();
	void clear();
};

template&lt;class T&gt;Stack&lt;T&gt;::Stack()
:top(NULL), anzahl_elemente(0)
{
}

template&lt;class T&gt;Stack&lt;T&gt;::~Stack()
{
	T dummy;
	while(pop(dummy))
		;
}

template&lt;class T&gt;int Stack&lt;T&gt;::push(T v)
{
	Element *temp = new Element;
	if(!temp)
		return 0;
	temp-&gt;data = v;
	temp-&gt;next = top;
	top = temp;
	anzahl_elemente++;
	return 1;
}

template&lt;class T&gt;int Stack&lt;T&gt;::pop(T &amp;v)
{
	Element *temp = top;
	if(!temp)
		return 0;
	v = temp-&gt;data;
	top = temp-&gt;next;
	delete (temp);
	anzahl_elemente--;
	return 1;
}

template&lt;class T&gt;int Stack&lt;T&gt;::get_anzahl()
{
	return get_anzahl();
}

template&lt;class T&gt;int Stack&lt;T&gt;::is_empty()
{
	return (get_anzahl == 0);
}

template&lt;class T&gt;void Stack&lt;T&gt;::clear()
{
	T dummy;
	while(pop(dummy))
		;
}
</code></pre>
<p>funktionniert alles prima, hab bis jetzt noch keine mängel entdeckt, allerdings habe ichn keine ahnung wie ich einen Ctor programmieren soll...</p>
<p>das problem liegt darin, dass ich ja nicht auf das unterste element zugreifen kann, ich habe nur top und next. ich könnte natürlich zuerst alles in ein temporären stack kopieren und von da in den richtigen per push und pop, aber ich glaube das ist ziemlich langsam oder?</p>
<p>gibt es keine elegantere Lösung dafür?<br />
ich weiß, in der STL wird der Stack als Deque element genuztz, deshalb wird es da leichter sein, aber ich habe noch keine Deque container programmiert, von daher würde ich gerne einen Stack c_tor selber basteln</p>
<p>Ich hoffe das war klar^^</p>
<p>danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219221/schneller-copy-konstruktor-für-einen-stack</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:57:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219221.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jul 2008 21:42:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Wed, 30 Jul 2008 21:42:28 GMT]]></title><description><![CDATA[<p>Kennt jemand einen schnellen Copy Konstruktor für nen Stack</p>
<p>zur zeit habe ich:</p>
<pre><code class="language-cpp">#pragma once

template&lt;class T&gt;
class Stack
{
private:
	class Element
	{
	public:
		Element *next;
		T data;
	};
	Element *top;
	int anzahl_elemente;
public:
	Stack();
	~Stack();
	int push(T v);
	int pop(T&amp; v);
	int get_anzahl();
	int is_empty();
	void clear();
};

template&lt;class T&gt;Stack&lt;T&gt;::Stack()
:top(NULL), anzahl_elemente(0)
{
}

template&lt;class T&gt;Stack&lt;T&gt;::~Stack()
{
	T dummy;
	while(pop(dummy))
		;
}

template&lt;class T&gt;int Stack&lt;T&gt;::push(T v)
{
	Element *temp = new Element;
	if(!temp)
		return 0;
	temp-&gt;data = v;
	temp-&gt;next = top;
	top = temp;
	anzahl_elemente++;
	return 1;
}

template&lt;class T&gt;int Stack&lt;T&gt;::pop(T &amp;v)
{
	Element *temp = top;
	if(!temp)
		return 0;
	v = temp-&gt;data;
	top = temp-&gt;next;
	delete (temp);
	anzahl_elemente--;
	return 1;
}

template&lt;class T&gt;int Stack&lt;T&gt;::get_anzahl()
{
	return get_anzahl();
}

template&lt;class T&gt;int Stack&lt;T&gt;::is_empty()
{
	return (get_anzahl == 0);
}

template&lt;class T&gt;void Stack&lt;T&gt;::clear()
{
	T dummy;
	while(pop(dummy))
		;
}
</code></pre>
<p>funktionniert alles prima, hab bis jetzt noch keine mängel entdeckt, allerdings habe ichn keine ahnung wie ich einen Ctor programmieren soll...</p>
<p>das problem liegt darin, dass ich ja nicht auf das unterste element zugreifen kann, ich habe nur top und next. ich könnte natürlich zuerst alles in ein temporären stack kopieren und von da in den richtigen per push und pop, aber ich glaube das ist ziemlich langsam oder?</p>
<p>gibt es keine elegantere Lösung dafür?<br />
ich weiß, in der STL wird der Stack als Deque element genuztz, deshalb wird es da leichter sein, aber ich habe noch keine Deque container programmiert, von daher würde ich gerne einen Stack c_tor selber basteln</p>
<p>Ich hoffe das war klar^^</p>
<p>danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556713</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Wed, 30 Jul 2008 21:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Wed, 30 Jul 2008 23:19:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Stack(Stack const&amp; other) {
  anzahl_elemente = other.anzahl_elemente;
  Element* p = other.top;
  top = new Element(p-&gt;value);
  copy=top;
  p=p-&gt;next;
  while(p) {
    copy-&gt;next = new Element(p-&gt;value);
    copy=copy-&gt;next;
    p=p-&gt;next;
  }
}
</code></pre>
<p>aber es ist spaet, ich hab das nur hingenudelt wie man so schoen sagt :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556737</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 30 Jul 2008 23:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 07:35:36 GMT]]></title><description><![CDATA[<p>Deine Implementierung hat noch die eine oder andere Unzulänglichkeit, z.B.<br />
- du verlangst, dass T einen default-Ctor hat (der keine Exception werfen darf)<br />
- du verlangst, dass T einen exceptionsicheren op= hat (sonst kann push() speicherlecks verursachen)<br />
- die if-Abfrage in push ist sinnfrei, new wirft bei Misserfolg eine Exception, statt den Zeiger auf 0 zu setzen<br />
- clear() und der Dtor haben duplizierten Code. Ruf doch einfach im Dtor clear() auf<br />
- is_empty liefert einen int, sollte aber eher bool liefern</p>
<p>Ich versuch mal entsprechend Änderungen vorzuschagen:</p>
<pre><code class="language-cpp">#pragma once

template&lt;class T&gt;
class Stack
{
private:
	class Element
	{
	public:
	  T data;
	  Element *next;
           Element(T const&amp; t) : data(t), next(0) {} //Ctor
	};
         class EmptyStackException : public std::exception {
           virtual const char* what() throw() {return &quot;Stack is empty.&quot;;}
         }

	Element *top;
	int anzahl_elemente;
public:
	Stack();
	~Stack();
	int push(T const&amp; v);  //referenz reicht!
	T pop();               //falls T kein op= hat gehts mit Referenz nicht
	int get_anzahl();
	bool is_empty();
	void clear();
};

template&lt;class T&gt;Stack&lt;T&gt;::Stack()
:top(NULL), anzahl_elemente(0)
{
}

template&lt;class T&gt;Stack&lt;T&gt;::~Stack() //throw()
{
  clear();    //code-duplizierung vermeiden.
}

template&lt;class T&gt;int Stack&lt;T&gt;::push(T const&amp; v)
{
	Element *temp = new Element(v); //wenn der copy-Ctor von T schmeißt, wird der Speicher automatisch befreit -&gt; kein Speicherleck
	temp-&gt;next = top;
	top = temp;
	++anzahl_elemente;
	return 1;
}

template&lt;class T&gt; T Stack&lt;T&gt;::pop()
{
         if (! top) throw EmptyStackException(); 
         T result(top.data);
	Element* temp = top;
	top = top-&gt;next;
	delete (temp);
	--anzahl_elemente;
	return result;
}

template&lt;class T&gt; int Stack&lt;T&gt;::get_anzahl()
{
	return anzahl_elemente; //wolltest keine rekurion, oder?
}

template&lt;class T&gt; bool Stack&lt;T&gt;::is_empty()
{
	return (get_anzahl() == 0);
}

template&lt;class T&gt;void Stack&lt;T&gt;::clear()  //throw() , da keine unnötigen Aufrufe von T-Ctoren
{
  Element* tmp = top;
  while (top)
  {
    top = top-&gt;next;  //-&gt; top steht am Ende auf 0;
    delete tmp;
    tmp = top;
  } 
}

//jetzt der gewuenschte copy-Ctor:
template&lt;class T&gt; Stack(Stack const&amp; rhs) : top(0), anzahl_elemente(0)
{
  if (!rhs.top) return; //leerer stack, nichts zu kopieren

  top = new Element(rhs.top-&gt;data); //wenn hier was fliegt, räumt C++ selber auf
  Element* right = rhs.top;
  Element* left = top;
  while (right-&gt;next)
  {
    try
    {
      left-&gt;next = new Element(right-&gt;next-&gt;data); //sollte hier was fliegen...
      right = right-&gt;next;
      left = left-&gt;next;
    }
    catch(...)
    {
      clear();    //... müssen wir selber aufräumen!
      throw;
    }
  }
}
</code></pre>
<p>Wenn ich nicht irgendwas übersehen hab verlangt diese Implementierung lediglich, dass T einen Copy-Ctor besitzt. Wenn der ne Exception wirft ists nicht schlimm, der Stack wirft die dann einfach weiter, ohne Speicherlecks etc. zu hitnerlassen. Es wird kein op= vorausgesetzt, kein default-Ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556799</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jul 2008 07:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 13:52:51 GMT]]></title><description><![CDATA[<p>ups, das mit dem get_anzahl und is_empty hab ich wohl nicht aufgepasst, natürlich war es so gemeint wie du jetzt geschrieben hast, rekursion war nicht geplant^^</p>
<p>leuchtet mir alles ein, was du geschrieben hast<br />
werde den code jetzt mal entsprechend umändern</p>
<p>Danke für die Hilfe, ist sehr nett.</p>
<p>Funktionniert das auch noch mit Standarttypen? also int, double, ...??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557056</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 14:09:49 GMT]]></title><description><![CDATA[<p>uhsuhz schrieb:</p>
<blockquote>
<p>Funktionniert das auch noch mit Standarttypen? also int, double, ...??</p>
</blockquote>
<p>Jup. Standardtypen haben auch eine Art impliziten &quot;copy-ctor&quot;, den du z.B. bei anzahl_elemente in der init-Liste des Stack benutzt. das <code>data(t)</code> in <code>Stack&lt;int&gt;::Element::Element(int const&amp; t)</code> unterscheidet sich davon z.B. garnicht. Der einizge andere Aufruf des Copy-Ctors von T ist im pop(), und ein** <code>int result(top-&gt;data);</code> **(der '.' war ein Fehler in meinem Code oben) ist eine völlig normale Initialisierung eines int.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557069</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jul 2008 14:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 14:24:20 GMT]]></title><description><![CDATA[<p>ich glaube du hättest den copy-ctor noch müssen in die klasse reinbringen, oder?</p>
<p>also so:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class MyStack
{
private:
	class Element
	{
	public:
		T data;
		Element *next;
		Element(const T&amp; t) :data(t),next(0) {} //C-tor
	};
	class EmptyStackExcetption : public std::exception
	{
		virtual const char* what() throw() {return &quot;Stack is empty&quot;;}
	};
	Element *top;
	int anzahl_elemente;
public:
	MyStack();
	MyStack(const MyStack&amp; other);
	~MyStack();
	void push(const T&amp; v);
	T pop();
	int get_anzahl();
	bool is_empty();
	void clear();
};
</code></pre>
<p>und dann:</p>
<pre><code class="language-cpp">template&lt;class T&gt;MyStack&lt;T&gt;::MyStack(const MyStack &amp;other)
:top(NULL), anzahl_elemente(0)
{
	if(!other.top) //leerer Stack, nichts zu kopieren
		return;
	this-&gt;top = new Element(other.top-&gt;data); //wenn hier was fliegt räumt C++ selber auf
	Element *rigth = other.top;
	Element *left = top;
	while(rigth-&gt;next)
	{
		try
		{
			left-&gt;next = new Element(rigth-&gt;next-&gt;data); //sollte hier was fliegen...
			rigth = rigth-&gt;next;
			left = left-&gt;next;  //müssen wir selber aufräumen
		}
		catch(...)
		{
			clear();
			throw;
		}
	}
}
</code></pre>
<p>hab jetzt auch verstanden, warum in der STL bei den containern left und rigth benutzt wird^^<br />
so werde jetzt noch den operator=, ==, != reinbringen. weiß jemand was genau &lt; bringt bei stacks? ob ein stack größer ist als der andere, oder ???<br />
jedenfalls habe ich mir die header von dem stack angeschaut, und da habe ich auch nicht mehtr funktionen gefunden , als diese hier(mit ==, !=, &lt;, &gt;=, &lt;=, &gt;, <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>außerdem habe ich den rükgabetyp von push fortgemacht gibt keinen sinn mehr... ist jetzt void push(const T&amp; v)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557080</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 14:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Fri, 01 Aug 2008 07:02:26 GMT]]></title><description><![CDATA[<p>sry, selbstverständlich muss die deklaration des copy-ctor in den stack, hatte ich vergessen mit einzutragen.</p>
<p>op= ist recht einfach gemacht, wenn du eine (genauso einfache) swap-methode implementierst:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void Stack&lt;T&gt;::swap(Stack&amp; other)
{
  using std::swap;
  swap(top, other.top);  //einfach die top-Zeiger der Stacks vertauschen
  swap(anzahl_elemente, other.anzahl_elemente);
}

template &lt;class T&gt;
Stack&amp; Stack&lt;T&gt;::operator=(Stack const&amp; rhs)
{
  Stack tmp(rhs);
  swap(tmp);
}
</code></pre>
<p>um op== zu <em>benutzen</em> muss T auch einen op== haben, aber das zu verlangen ist durchaus legitim (wenn T den nicht hat, darf man eben op== nicht benutzen, das ist dann dank SFINAE* kein Fehler)<br />
implementiert wird der indem man sich (wieder mit left, right) die Liste entlanghangelt und die data-attribute der elemente vergleicht</p>
<p>op!= ist einfach mit op== implementiert</p>
<p>Was das mit den arithmetischen vergleichen auf sich hat - keine Ahnung. Schau mal in der Doku zu den stack-klassen die dir vorliegen (z.B. <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> für std::stack)</p>
<p>_____________________________________________<br />
* Substitution Failure Is Not An Error - google hilft bei Interesse weiter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557092</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 01 Aug 2008 07:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 15:02:38 GMT]]></title><description><![CDATA[<p>den operator= und swap hab ich schon fertig, benutzte immer die C-tor+swap methode für operator=</p>
<pre><code class="language-cpp">template&lt;class T&gt;void MyStack&lt;T&gt;::swap(MyStack &amp;stck)
{
	int itemp = this-&gt;anzahl_elemente;
	this-&gt;anzahl_elemente = stck.anzahl_elemente;
	stck.anzahl_elemente = itemp;
	Element *etemp = this-&gt;top;
	this-&gt;top = stck.top;
	stck.top = etemp;
}

template&lt;class T&gt;MyStack&lt;T&gt;&amp; MyStack&lt;T&gt;::operator=(const MyStack&amp; other)
{
	MyStack&lt;T&gt; temp = other;
	this-&gt;swap(temp);
	return *this;
}
</code></pre>
<p>welche header muss ich einbinden um std::swap zu benutzen?</p>
<p>io das mit dem != operator war mir klar, bin ja nicht so doof alles neu zu schreiben, geht ja viel einfacher wenn ich den fertigen == operator schon hab, das gleiche mit &gt; und &lt;= , &lt; und &gt;=</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557100</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 15:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 15:07:02 GMT]]></title><description><![CDATA[<p>uhsuhz schrieb:</p>
<blockquote>
<p>welche header muss ich einbinden um std::swap zu benutzen?</p>
</blockquote>
<p>&lt;algorithm&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557102</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Thu, 31 Jul 2008 15:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 15:21:39 GMT]]></title><description><![CDATA[<p>danke wieder was dazugelernt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557111</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 15:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 16:02:56 GMT]]></title><description><![CDATA[<p>Den copy-ctor können wir eleganter schreiben, da alle notwendigen Operationen bereits in anderen Funktionen realisiert werden.</p>
<pre><code class="language-cpp">template&lt;class T&gt;MyStack&lt;T&gt;::MyStack(const MyStack &amp;other)
:top(NULL), anzahl_elemente(0)
{
    MyStack temp; // !!!
    for ( Element* p = other.top; p != NULL; p = p-&gt;next )
        temp.push( p-&gt;data );
    swap( temp );
}
</code></pre>
<p>sieht fast aus wie op= ? So ein Zufall <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Bzgl. pop bin ich mir etwas unsicher:</p>
<pre><code class="language-cpp">template&lt;class T&gt; T Stack&lt;T&gt;::pop()
{
         if (! top) throw EmptyStackException();
         T result(top.data);
    Element* temp = top;
    top = top-&gt;next;
    delete (temp);
    --anzahl_elemente;
    return result;
}
</code></pre>
<p>Abgesehen von ersten Zeile, kann diese Funktion an 2 Stellen mit einer Exception fehlschlagen. An der ersten Stelle verbleibt das Element im Stack, bei der zweiten Stelle ist es bereits entfernt worden. Das ist nicht optimal, weil sich der benutzende Code nicht auf ein bestimmtes Verhalten einstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557122</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 31 Jul 2008 16:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 19:56:37 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Den copy-ctor können wir eleganter schreiben, da alle notwendigen Operationen bereits in anderen Funktionen realisiert werden.</p>
<pre><code class="language-cpp">template&lt;class T&gt;MyStack&lt;T&gt;::MyStack(const MyStack &amp;other)
:top(NULL), anzahl_elemente(0)
{
    MyStack temp; // !!!
    for ( Element* p = other.top; p != NULL; p = p-&gt;next )
        temp.push( p-&gt;data );
    swap( temp );
}
</code></pre>
<p>sieht fast aus wie op= ? So ein Zufall <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>ne kann nicht funktionnieren, dann liegen die daten den verkehrten weg im Stack, darum muss man ja eine etwas längere funktion schriebn und nicht einfach eine pushmethode benutzen... Damit das funktionnieren könnte müsste man hinten anfangen und nach vorne fahren, klappt aber nicht mit nem stack...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557244</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 19:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 20:02:29 GMT]]></title><description><![CDATA[<p>Mit Linux wäre das nicht passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557251</guid><dc:creator><![CDATA[hehehe]]></dc:creator><pubDate>Thu, 31 Jul 2008 20:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 20:13:52 GMT]]></title><description><![CDATA[<p>hä was soll das denn heißen??</p>
<p>naja egal, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>, den code kann ich aber locker bei der Queue benutzen^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557258</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 20:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 20:24:24 GMT]]></title><description><![CDATA[<p>uhsuhz schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Den copy-ctor können wir eleganter schreiben, da alle notwendigen Operationen bereits in anderen Funktionen realisiert werden.</p>
<pre><code class="language-cpp">template&lt;class T&gt;MyStack&lt;T&gt;::MyStack(const MyStack &amp;other)
:top(NULL), anzahl_elemente(0)
{
    MyStack temp; // !!!
    for ( Element* p = other.top; p != NULL; p = p-&gt;next )
        temp.push( p-&gt;data );
    swap( temp );
}
</code></pre>
<p>sieht fast aus wie op= ? So ein Zufall <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>ne kann nicht funktionnieren, dann liegen die daten den verkehrten weg im Stack, darum muss man ja eine etwas längere funktion schriebn und nicht einfach eine pushmethode benutzen...</p>
</blockquote>
<p>stimmt wohl, hab ich nicht aufgepasst. Aber das try+catch brauchen wir wirklich nicht.</p>
<pre><code class="language-cpp">template&lt;class T&gt;MyStack&lt;T&gt;::MyStack(const MyStack &amp;other)
:top(NULL), anzahl_elemente(other.anzahl_elemente)
{
    MyStack temp;
    for ( Element *p = other.top, **q = &amp;temp.top; p != NULL; p = p-&gt;next )
    {
        *q = new Element( p-&gt;data );
        q = &amp;q-&gt;next;
    }
    std::swap( top, temp.top );
}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1557261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557261</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 31 Jul 2008 20:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Thu, 31 Jul 2008 21:53:46 GMT]]></title><description><![CDATA[<p>ich habs mal so gelassen, ich schau mir das später mal an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557304</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Thu, 31 Jul 2008 21:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to Schneller Copy Konstruktor für einen Stack on Fri, 01 Aug 2008 07:15:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Bzgl. pop bin ich mir etwas unsicher:</p>
<pre><code class="language-cpp">template&lt;class T&gt; T Stack&lt;T&gt;::pop()
{
         if (! top) throw EmptyStackException();
         T result(top.data);
    Element* temp = top;
    top = top-&gt;next;
    delete (temp);
    --anzahl_elemente;
    return result;
}
</code></pre>
<p>Abgesehen von ersten Zeile, kann diese Funktion an 2 Stellen mit einer Exception fehlschlagen. An der ersten Stelle verbleibt das Element im Stack, bei der zweiten Stelle ist es bereits entfernt worden. Das ist nicht optimal, weil sich der benutzende Code nicht auf ein bestimmtes Verhalten einstellen kann.</p>
</blockquote>
<p>Hm, zwei Stellen? Ich nehem mal an, beim Copy-Ctor und beim return?<br />
Folgendes sollte dann aber einheitlich sein, so dass ein pop() auf jeden Fall das oberste Element entfernt:</p>
<pre><code class="language-cpp">template&lt;class T&gt; T Stack&lt;T&gt;::pop()
{
    if (! top) throw EmptyStackException();
    std::auto_ptr&lt;Element&gt; temp(top);
    top = top-&gt;next;
    --anzahl_elemente;
    return temp-&gt;data;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1557379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557379</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 01 Aug 2008 07:15:00 GMT</pubDate></item></channel></rss>