<?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[std::list Element verschieben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein spezielles Element einer std::list nach vorne bringen. Da ich jedoch einen Pointer auf dieses Element habe, möchte ich nicht push_front/erase verwenden, da dies ein neues Element anlegen würde und die Referenzierung somit ungültig werden würde.<br />
Die Verwendung der Methode splice ist zwar funktionabel, aber nicht unbedingt performant, da der Zweck ja eigentlich das einfügen von (mehreren) Elementen in einer andere Liste ist.</p>
<p>Ich hab für beides mal ein Beispiel gemacht, damit ihr wisst was ich meine.</p>
<pre><code class="language-cpp">#include &lt;list&gt;
using std::list;

int main()
{
	int *p0 = nullptr;
	list&lt;int&gt; l(10);
	auto iter0 = l.begin();

	for( int i = 0; i &lt; l.size(); ++i, ++iter0 ) {
		*iter0 = i;
	}

	iter0 = l.begin();
	++iter0;	// -&gt; 1
	++iter0;	// -&gt; 2
	++iter0;	// -&gt; 3

	p0 = &amp;*iter0;	// p0 -&gt; 3

	l.push_front(*iter0);
	l.erase(iter0);
	iter0 = l.begin();	// -&gt; 3

	/*
	list == { 3, 0, 1, 2, 4, 5, 6, 7, 8, 9 };
	p0 -&gt; ???
	*/

	return 0;
}
</code></pre>
<pre><code class="language-cpp">int main()
{
	int *p0 = nullptr;
	list&lt;int&gt; l(10);
	auto iter0 = l.begin();

	for( int i = 0; i &lt; l.size(); ++i, ++iter0 ) {
		*iter0 = i;
	}

	iter0 = l.begin();
	++iter0;	// -&gt; 1
	++iter0;	// -&gt; 2
	++iter0;	// -&gt; 3

	p0 = &amp;*iter0;	// p0 -&gt; 3

	auto iter1 = iter0;
	l.splice(l.begin(), l, iter0, ++iter1);
	iter0 = l.begin();	// -&gt; 3

	/*
	list == { 3, 0, 1, 2, 4, 5, 6, 7, 8, 9 };
	p0 -&gt; 3
	*/

	return 0;
}
</code></pre>
<p>Welche Alternative hätte ich dazu? Ich möchte zwingend die std::list verwenden, da alle anderen STL-Container ggf. mehrere Elemente auf einmal allokieren wollen und dies mein Custom-Allocator (wie gewünscht) nicht unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272183/std-list-element-verschieben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 00:09:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272183.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Aug 2010 10:20:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list Element verschieben? on Thu, 12 Aug 2010 10:20:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein spezielles Element einer std::list nach vorne bringen. Da ich jedoch einen Pointer auf dieses Element habe, möchte ich nicht push_front/erase verwenden, da dies ein neues Element anlegen würde und die Referenzierung somit ungültig werden würde.<br />
Die Verwendung der Methode splice ist zwar funktionabel, aber nicht unbedingt performant, da der Zweck ja eigentlich das einfügen von (mehreren) Elementen in einer andere Liste ist.</p>
<p>Ich hab für beides mal ein Beispiel gemacht, damit ihr wisst was ich meine.</p>
<pre><code class="language-cpp">#include &lt;list&gt;
using std::list;

int main()
{
	int *p0 = nullptr;
	list&lt;int&gt; l(10);
	auto iter0 = l.begin();

	for( int i = 0; i &lt; l.size(); ++i, ++iter0 ) {
		*iter0 = i;
	}

	iter0 = l.begin();
	++iter0;	// -&gt; 1
	++iter0;	// -&gt; 2
	++iter0;	// -&gt; 3

	p0 = &amp;*iter0;	// p0 -&gt; 3

	l.push_front(*iter0);
	l.erase(iter0);
	iter0 = l.begin();	// -&gt; 3

	/*
	list == { 3, 0, 1, 2, 4, 5, 6, 7, 8, 9 };
	p0 -&gt; ???
	*/

	return 0;
}
</code></pre>
<pre><code class="language-cpp">int main()
{
	int *p0 = nullptr;
	list&lt;int&gt; l(10);
	auto iter0 = l.begin();

	for( int i = 0; i &lt; l.size(); ++i, ++iter0 ) {
		*iter0 = i;
	}

	iter0 = l.begin();
	++iter0;	// -&gt; 1
	++iter0;	// -&gt; 2
	++iter0;	// -&gt; 3

	p0 = &amp;*iter0;	// p0 -&gt; 3

	auto iter1 = iter0;
	l.splice(l.begin(), l, iter0, ++iter1);
	iter0 = l.begin();	// -&gt; 3

	/*
	list == { 3, 0, 1, 2, 4, 5, 6, 7, 8, 9 };
	p0 -&gt; 3
	*/

	return 0;
}
</code></pre>
<p>Welche Alternative hätte ich dazu? Ich möchte zwingend die std::list verwenden, da alle anderen STL-Container ggf. mehrere Elemente auf einmal allokieren wollen und dies mein Custom-Allocator (wie gewünscht) nicht unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939104</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 12 Aug 2010 10:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::list Element verschieben? on Thu, 12 Aug 2010 10:27:09 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Die Verwendung der Methode splice ist zwar funktionabel, aber nicht unbedingt performant, da der Zweck ja eigentlich das einfügen von (mehreren) Elementen in einer andere Liste ist.</p>
</blockquote>
<p><a href="http://cplusplus.com/reference/stl/list/splice/" rel="nofollow">http://cplusplus.com/reference/stl/list/splice/</a> sagt, dass die Variante mit mehreren Elementen O(n) hat, die mit einem Element O(1).<br />
Wie viel performanter willst du es denn noch?</p>
<p>Edit: ach ja, das O(n) bei mehreren Elementen gilt auch nur, wenn in eine andere Liste eingefügt wird, beim Verschieben innerhalb einer Liste ist es auch O(1).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939107</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 12 Aug 2010 10:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to std::list Element verschieben? on Thu, 12 Aug 2010 10:29:52 GMT]]></title><description><![CDATA[<p>[quote=&quot;ipsec&quot;]</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>die mit einem Element O(1).</p>
</blockquote>
<p>Das ist <strong>viel</strong> zu langsam ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Das wollte ich wissen. Danke dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939110</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 12 Aug 2010 10:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::list Element verschieben? on Thu, 12 Aug 2010 12:53:52 GMT]]></title><description><![CDATA[<p>Ich habe mich von Microsofts Deklaration irritieren lassen:</p>
<pre><code class="language-cpp">void splice(
   iterator _Where,
   list&lt;Allocator&gt;&amp; _Right,
   iterator _First
);
</code></pre>
<p>Beschreibung dazu:</p>
<pre><code>[b]_First[/b]
The first element in the range to be inserted from the argument list.
</code></pre>
<p>Es sah für mich so aus, als würden von _First an, alle Elemente kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939200</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 12 Aug 2010 12:53:52 GMT</pubDate></item></channel></rss>