<?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[Mehrfacheinträge entfernen]]></title><description><![CDATA[<p>Gibt es eine Möglichkeit aus einem Array oder Vector Mehrfacheinträge zu entfernen, so dass nur eindeutige Werte vorhanden sind? Für die Sortierung gibts ja sort(). Gibts dafür auch eine Methode oder muss man das anders machen und wie ginge das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226137/mehrfacheinträge-entfernen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 21:13:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226137.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Oct 2008 22:22:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Wed, 29 Oct 2008 22:22:23 GMT]]></title><description><![CDATA[<p>Gibt es eine Möglichkeit aus einem Array oder Vector Mehrfacheinträge zu entfernen, so dass nur eindeutige Werte vorhanden sind? Für die Sortierung gibts ja sort(). Gibts dafür auch eine Methode oder muss man das anders machen und wie ginge das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606871</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Wed, 29 Oct 2008 22:22:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Wed, 29 Oct 2008 22:26:16 GMT]]></title><description><![CDATA[<p>Ich kenne jetzt keine für dieses Problem zugeschnittene Funktion.</p>
<p>Die STL-Algorithmen werden dir aber sicher dabei helfen. Du kannst mit <code>std::count()</code> z.B. die Anzahl Vorkommen zählen und mit <code>std::vector::erase()</code> dann entsprechende Elemente löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606874</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 29 Oct 2008 22:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 03:00:36 GMT]]></title><description><![CDATA[<p>Es gibt einen STL-Algorythmus der fast das macht was du möchtest: <code>std::unique</code><br />
<code>std::unique</code> &quot;schiebt&quot; aufeinanderfolgende, sich wiederholende Elemente eines Containers hinter das letzte eindeutige Element des Containers. Wenn z.B. ein Vektor die folgenden Elemente hätte:</p>
<pre><code>1 2 2 3 3 4
</code></pre>
<p>Dann würde <code>std::unique</code> die Elemente folgendermaßen &quot;umordnen&quot;:</p>
<pre><code>1 2 3 4 2 3
</code></pre>
<p>Aber wie oben erwähnt müssen die sich wiederholenden Elemente aufeinanderfolgend sein, weshalb <code>std::unique</code> an einem Vektor mit den folgenden Elementen nichts umsortieren würde:</p>
<pre><code>1 2 3 2 3 4
</code></pre>
<p>Allerdings kannst du ja mit <code>std::sort</code> die Elemente des Containers so sortieren, dass diese dann hintereinander stehen würden. Anschließend könntest du dann die sich wiederholenden und nun auch aufeinanderfolgenden Elemente mit <code>std::unique</code> an das Ende des Containers &quot;schieben&quot; und diese dann mit Hilfe des zurückgegebenen Iterators, der auf das Element hinter dem letzten eindeutigen Element des Containers zeigt, löschen.</p>
<p>Puh, falls das jetzt zu kompliziert war, habe ich hier noch ein kleines Beispiel:</p>
<pre><code class="language-cpp">//main.cpp
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using std::cout;
using std::endl;
using std::vector;
using std::sort;
using std::unique;

int main()
{
	vector&lt;int&gt; ivec;
	// Vector mit 2 Werten füllen
	ivec.push_back(2);
	ivec.push_back(5);
	// Füllt den Vector mit weiteren Werten
	for(int i = 0; i != 10; ++i)
		ivec.push_back(i);
	// und zusätzlich noch ein paar bereits enthaltene Werte hinzufügen
	ivec.push_back(3);
	ivec.push_back(7);
	ivec.push_back(9);
	// Alle Elemente des Vectors ausgeben
	cout &lt;&lt; &quot;Alle Werte des Vectors:&quot; &lt;&lt; endl;
	for(vector&lt;int&gt;::iterator it = ivec.begin(); it != ivec.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; &quot; &quot;;
	cout &lt;&lt; endl;
	// Die Elemente des Vectors sortieren, damit Elemente mit gleichen Werten
	// hintereinander stehen
	sort(ivec.begin(), ivec.end());
	// 'unique' &quot;schiebt&quot; aufeinanderfolgende, sich wiederholende Elemente hinter
	// das letzte eindeutige Element des Vectors und gibt einen Iterator auf das
	// erste nach hinten &quot;geschobene&quot; Element zurück
	vector&lt;int&gt;::iterator unique_iter = unique(ivec.begin(), ivec.end());
	// Und jetzt noch die Elemente, die sich wiederholten, löschen
	ivec.erase(unique_iter, ivec.end());
	// Nun alle noch übrigen, eindeutigen Elemente ausgeben
	cout &lt;&lt; &quot;Eindeutige Elemente:&quot; &lt;&lt; endl;
	for(vector&lt;int&gt;::iterator it = ivec.begin(); it != ivec.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; &quot; &quot;;
	cout &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Die erste Ausgabe des Beispiels würde lauten:</p>
<pre><code>Alle Werte des Vectors:
2 5 0 1 2 3 4 5 6 7 8 9 3 7 9
</code></pre>
<p>Und die Ausgabe nach <code>std::sort</code> und <code>std::unique</code> und <code>std::vector::erase()</code> würde lauten:</p>
<pre><code>Eindeutige Elemente:
0 1 2 3 4 5 6 7 8 9
</code></pre>
<p>So, das war hoffentlich hilfreich <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1606911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606911</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Thu, 30 Oct 2008 03:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 05:56:55 GMT]]></title><description><![CDATA[<p>Danke, so richtig blicke ich da noch nicht durch aber mal sehen. Von array_unique() in PHP habe ich mal was gehört. Evtl. kann man sowas nachbauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606923</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Thu, 30 Oct 2008 05:56:55 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 07:11:14 GMT]]></title><description><![CDATA[<p>dixidix schrieb:</p>
<blockquote>
<p>Evtl. kann man sowas nachbauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Wozu nachbauen was es schon gibt? Eine Referenz für std::unique findest du übrigens hier:<br />
<a href="http://www.cplusplus.com/reference/algorithm/unique.html" rel="nofollow">http://www.cplusplus.com/reference/algorithm/unique.html</a></p>
<p>Das zeigt auch, dass Mizar's Ausführungen nicht ganz richtig waren: die mehrfach vorkommenden Elemente werden NICHT nach hinten kopiert.</p>
<p>Wenn du viele mehrfache Elemente hast ist es unter Umständen auch sinnvoll, den vector anschließend &quot;zu schrumpfen&quot;:</p>
<pre><code class="language-cpp">std::vector&lt;MyType&gt; vec;
//füllen...

std::vector&lt;MyType&gt;::iterator begin = vec.begin(), end = vec.end();
std::sort(begin, end);
std::vector(begin, std::unique(begin,end)).swap(vec);
//temporärer vector wird mit dem ergebnis von unique copy-initialisiert
//swap sorgt dafür, dass in vec dieses ergebnis steht und der komplette alte Inhalt im temporären vector
//der temporäre vector wird zerstört und nimmt den ganzen &quot;müll&quot; mit
</code></pre>
<p>Der Vollständigkeit halber für (dynamische) Arrays, inklusive &quot;Schrumpfung&quot;:</p>
<pre><code class="language-cpp">MyType *myArr = new MyType[wievielauchimmer];
//myArr füllen

std::sort(myArr, myArr+wievielauchimmer);
std::size_t newlen = std::unique(myArr, myArr+wievielauchimmer) - myArr;
MyType *tmp = new MyType[newlen];
std::copy(myArr, myArr+newlen, tmp);
delete[] myArr; //alten Müll löschen
myArr = tmp; //myArr zeigt jetzt auf das neue Array mit den &quot;einzigartigen&quot; Elementen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1606932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606932</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Oct 2008 07:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 07:30:49 GMT]]></title><description><![CDATA[<blockquote>
<p>Wozu nachbauen was es schon gibt?</p>
</blockquote>
<p>Danke für den Tipp, soweit bin ich noch nicht vorgedrungen. Werd's mal probieren, sobald ich dazu komme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606954</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Thu, 30 Oct 2008 07:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 13:14:58 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Das zeigt auch, dass Mizar's Ausführungen nicht ganz richtig waren: die mehrfach vorkommenden Elemente werden NICHT nach hinten kopiert.</p>
</blockquote>
<p>Das verstehe ich ehrlich gesagt nicht. In der Referenz heißt es doch auch:</p>
<blockquote>
<p>Removes the duplicate consecutive elements from the range [first,last). This is done by removing all the elements that compare equal to the element right preceding them (only the first element in each group of consecutive equal elements is kept).</p>
</blockquote>
<p>Also, mehrfach vorkommende, aufeinanderfolgende Elemente wandern hinter das letzte eindeutige Element.</p>
<p>Vielleicht hatte ich in meinem Post das ganze auch etwas zu ausufernd geschrieben. Das Prinzip ist eigentlich ganz einfach:</p>
<pre><code class="language-cpp">vector&lt;int&gt; ivec;
//füllen
std::sort(ivec.begin(), ivec.end()) // Elemente mit gleichem Wert stehen hintereinander
ivec.erase(std::unique(ivec.begin(), ivec.end()), ivec.end());
</code></pre>
<p>std::unique &quot;vertauscht&quot; sich gleichende, aufeinanderfolgende Elemente, so dass am Ende sich wiederholende Elemente hinter dem letzten eindeutigen Element stehen. Der zurückgegebene Iterator zeigt auf das Element hinter dem letzten eindeutigen Element und kann dann z. B. dazu benutzt werden, den Anfang eines zu löschenden Bereiches anzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607164</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Thu, 30 Oct 2008 13:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 13:06:44 GMT]]></title><description><![CDATA[<p>Wie wär's mit std::set ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607165</guid><dc:creator><![CDATA[Setter]]></dc:creator><pubDate>Thu, 30 Oct 2008 13:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 13:25:25 GMT]]></title><description><![CDATA[<p>unique vertauscht nicht, es geht etwas anders vor.</p>
<p>Beispiel:<br />
122345 wird zu 123455</p>
<p>Die zweite 2 wird gelöscht indem alle Elemte dahinter (bis auf das letzte) einen &quot;aufrücken&quot;.</p>
<p>1222345 wird zu 1234545</p>
<p>Das Ergebnis ist also so als wenn du das eigentliche Ergebnis in seiner neuen Länge über das alte rüberkopierst.</p>
<p>Übrigens geht auch folgendes:</p>
<pre><code class="language-cpp">myVec.resize(std::unique(myVec.begin(), myVec.end()) - myVec.begin());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1607185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607185</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 30 Oct 2008 13:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 13:39:18 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Beispiel:<br />
122345 wird zu 123455</p>
<p>Die zweite 2 wird gelöscht indem alle Elemte dahinter (bis auf das letzte) einen &quot;aufrücken&quot;.</p>
<p>1222345 wird zu 1234545</p>
<p>Das Ergebnis ist also so als wenn du das eigentliche Ergebnis in seiner neuen Länge über das alte rüberkopierst.</p>
</blockquote>
<p>Ok, ich habe deine Beispiele mal schnell getestet und musste dabei feststellen, das ich die Vorgehensweise von std::unique bisher doch etwas falsch verstanden hatte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Naja, zumindest lag ich damit richtig, dass man std::unique dazu nutzen kann Mehrfacheinträge zu entfernen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1607196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607196</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Thu, 30 Oct 2008 13:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 14:55:31 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Übrigens geht auch folgendes:</p>
<pre><code class="language-cpp">myVec.resize(std::unique(myVec.begin(), myVec.end()) - myVec.begin());
</code></pre>
</blockquote>
<p>Jup. Im Vergleich dazu war mein Vorschlag weniger performant (da das Ergebnis einmal komplett kopiert wird), aber platzsparender (weil der Speicher der überflüssigen Elemente freigegeben wird). Außerdem werden bei dem Kopiervorgang Iteratoren ungültig, beim resize() nicht (aber auch nur, weil der Vector nicht vergrößert wird)<br />
Ist also ein wenig Geschmackssache und ein wenig Profilersache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607257</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Oct 2008 14:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Thu, 30 Oct 2008 19:41:15 GMT]]></title><description><![CDATA[<p>also so hat es was gebracht:</p>
<pre><code class="language-cpp">...
	sort(v.begin(), v.end());

	v.resize(unique(v.begin(), v.end()) - v.begin());
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1607436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607436</guid><dc:creator><![CDATA[dixidix]]></dc:creator><pubDate>Thu, 30 Oct 2008 19:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfacheinträge entfernen on Fri, 31 Oct 2008 07:48:03 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>...aber platzsparender (weil der Speicher der überflüssigen Elemente freigegeben wird)...</p>
</blockquote>
<p>Kommt dabei natürlich immer drauf an, was man weiterhin mit dem Vector vor hat. Wenn kurz darauf eh wieder neue Elemente angehängt werden, ist es von Vorteil den Platz nicht freizugeben. Ansonsten natürlich anders herum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607816</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 31 Oct 2008 07:48:03 GMT</pubDate></item></channel></rss>