<?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-Command für UndoManager]]></title><description><![CDATA[<p>Hallo,<br />
ich benutze in einem Projekt einen UndoManager. Wie so etwas aussieht könnt ihr euch sicher vorstellen. Nun brauche ich ein Kommando, welches auf Containern operiert und erase ausführt bzw. rückgängig macht. Leider scheinen dabei Iteratoren ungültig zu werden o.ä., so dass nach einer Abfolge von Kommandos irgendwann ein Crash auftritt. Es hängt jedenfalls definitiv mit dem EraseCommand zusammen.</p>
<pre><code class="language-cpp">template&lt;typename Type, template&lt;typename, typename&gt; class Container&gt;
class Erase : public Command
{
	typedef Container&lt;Type*, std::allocator&lt;Type*&gt; &gt; ContainerType;
	typedef typename ContainerType::iterator Iterator;
	ContainerType&amp; container;
	Type* val;
	Iterator pos;

public:
	Erase(Iterator const&amp; pos, ContainerType&amp; container)
		: val(*pos), pos(pos), container(container) {}

	virtual ~Erase()
	{
		if(isInUndoStack())
			delete val;
	};

	bool exec()
	{
		container.erase(pos++);
		return true;
	}

	void undo()
	{
		pos = container.insert(pos, val);
	}
};
</code></pre>
<p>Im Grunde besteht das Problem darin, etwas aus einem Container (in meinem Fall std::list) zu löschen und später an genau dieser Stelle wieder einzufügen, ohne dass die Iteratoren ungültig werden.</p>
<p>Vielleicht hat ja jemand von euch eine Idee?</p>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167734/erase-command-für-undomanager</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 02:23:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167734.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Dec 2006 12:57:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to erase-Command für UndoManager on Thu, 14 Dec 2006 12:57:43 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich benutze in einem Projekt einen UndoManager. Wie so etwas aussieht könnt ihr euch sicher vorstellen. Nun brauche ich ein Kommando, welches auf Containern operiert und erase ausführt bzw. rückgängig macht. Leider scheinen dabei Iteratoren ungültig zu werden o.ä., so dass nach einer Abfolge von Kommandos irgendwann ein Crash auftritt. Es hängt jedenfalls definitiv mit dem EraseCommand zusammen.</p>
<pre><code class="language-cpp">template&lt;typename Type, template&lt;typename, typename&gt; class Container&gt;
class Erase : public Command
{
	typedef Container&lt;Type*, std::allocator&lt;Type*&gt; &gt; ContainerType;
	typedef typename ContainerType::iterator Iterator;
	ContainerType&amp; container;
	Type* val;
	Iterator pos;

public:
	Erase(Iterator const&amp; pos, ContainerType&amp; container)
		: val(*pos), pos(pos), container(container) {}

	virtual ~Erase()
	{
		if(isInUndoStack())
			delete val;
	};

	bool exec()
	{
		container.erase(pos++);
		return true;
	}

	void undo()
	{
		pos = container.insert(pos, val);
	}
};
</code></pre>
<p>Im Grunde besteht das Problem darin, etwas aus einem Container (in meinem Fall std::list) zu löschen und später an genau dieser Stelle wieder einzufügen, ohne dass die Iteratoren ungültig werden.</p>
<p>Vielleicht hat ja jemand von euch eine Idee?</p>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191735</guid><dc:creator><![CDATA[stephan.m]]></dc:creator><pubDate>Thu, 14 Dec 2006 12:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to erase-Command für UndoManager on Thu, 14 Dec 2006 13:06:27 GMT]]></title><description><![CDATA[<p>Beim Löschen in list's wird eigentlich nur das Ziel ungültig. Aber wenn du zwischendurch weitere Elemente gelöscht (und wiederhergestellt hast), könnte das auch deinen Iterator pos betreffen. Als Alternative könntest du den Index des gelöschten Objekts notieren und beim Wiederherstellen die richtige Position abzählen.</p>
<p>(aber dazu ist list&lt;&gt; eher ungeeignet)</p>
<p>PS: Ich hoffe, du achtest immer darauf, daß jedes Kommando nur einmal (und dann in umgekehrter Reihenfolge) rückgängig gemacht wird <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1191746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191746</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Dec 2006 13:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to erase-Command für UndoManager on Thu, 14 Dec 2006 14:12:16 GMT]]></title><description><![CDATA[<p>Hmm, ich glaube, dass ich dann um einen vector wohl nicht herumkomme. Denn nat. will ich auch mehrere Objekte löschen und wiederherstellen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191808</guid><dc:creator><![CDATA[stephan.m]]></dc:creator><pubDate>Thu, 14 Dec 2006 14:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to erase-Command für UndoManager on Fri, 15 Dec 2006 09:04:57 GMT]]></title><description><![CDATA[<p>Ich sagte nicht, daß es mit list nicht geht, list ist &quot;nur&quot; ungeeignet, weil es keine Random-Access-Iteratoren hat. Du kannst aber immernoch advance() verwenden, um das i-te Element deiner Liste zu erreichen (im Gegensatz zum vector benötigt das jedoch lineare Zeit).</p>
<p>Damit hängt es wohl von deiner konkreten Anwendung ab, ob vector oder list günstiger ist - vector benötigt i.a. länger zum Löschen der Elemente (alles hinter der Position muß umkopiert werden), list zum Wiederherstellen (durchhangeln zur richtigen Position).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192211</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 15 Dec 2006 09:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to erase-Command für UndoManager on Fri, 15 Dec 2006 11:08:49 GMT]]></title><description><![CDATA[<p>stephan.m schrieb:</p>
<blockquote>
<p>Hmm, ich glaube, dass ich dann um einen vector wohl nicht herumkomme. Denn nat. will ich auch mehrere Objekte löschen und wiederherstellen können.</p>
</blockquote>
<p>Genau umgekehrt. Es ist generell keine gute Idee Iteratoren eines &quot;dynamischen&quot; vectors langfristig zu speichern.</p>
<p>D.h. du wendest dich <code>std::list</code> zu oder überlegst dir für vectoren eine andere Strategie (z.B. Offset statt Iterator speichern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192342</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 15 Dec 2006 11:08:49 GMT</pubDate></item></channel></rss>