<?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[Zwei Elemente an Iteratorposition von Vector entfernen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte von einem std::vector jeweils das größte und das kleinste Element entfernen. Dazu habe ich mit std::minmax_element(C++11) das größte und kleinste Element gesucht, da ich die Werte der Elemente noch weiter verwenden möchte. Um jetzt die beiden Elemente von dem Vektor zu entfernen, müsste ich zweimal vector::erase aufrufen. Das funktioniert aber nicht, da dann der zweite Iterator ungültig wird. Wie kann man das verhindern bzw. gibt es eine andere Möglichkeit zwei Elemente von einem Vektor zu entfernen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302979/zwei-elemente-an-iteratorposition-von-vector-entfernen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 00:51:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302979.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 May 2012 14:39:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 14:39:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte von einem std::vector jeweils das größte und das kleinste Element entfernen. Dazu habe ich mit std::minmax_element(C++11) das größte und kleinste Element gesucht, da ich die Werte der Elemente noch weiter verwenden möchte. Um jetzt die beiden Elemente von dem Vektor zu entfernen, müsste ich zweimal vector::erase aufrufen. Das funktioniert aber nicht, da dann der zweite Iterator ungültig wird. Wie kann man das verhindern bzw. gibt es eine andere Möglichkeit zwei Elemente von einem Vektor zu entfernen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207621</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 02 May 2012 14:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 14:52:55 GMT]]></title><description><![CDATA[<p>Ist die Reihenfolge wichtig? Falls nein, dann kopier doch das hinterste Element an die Stelle und verkleiner den vector um 1. Oder du löscht zuerst den hinteren der beiden Werte, denn erase macht nur Iteratoren ungültig, die auf den gelöschten Wert folgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207626</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 May 2012 14:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 14:56:00 GMT]]></title><description><![CDATA[<p>Hallo pyhax,</p>
<p>Du musst Dir eben für das Löschen des zweiten Elements den Index merken. Damit sich dieser nicht verändert, muss das Element mit dem größeren Index zuerst gelöscht werden. Weiter muss noch der Fall, dass beide Iteratoren gleich sind bedacht werden. Eine Skizze:</p>
<pre><code class="language-cpp">vector&lt; int &gt; v;
    // v = ...
    std::pair&lt; vector&lt; int &gt;::iterator, vector&lt; int &gt;::iterator &gt; res = minmax_element( v.begin(), v.end() );
    if( res.second &lt; res.first )
        swap( res.first, res.second );
    const bool min_equal_max = res.first == res.second; // auch vor erase merken, ob  Iteratoren gleich sind
    const vector&lt; int &gt;::size_type idx1 = res.first - v.begin();
    v.erase( res.second ); // nach diesem Aufruf kann man mit res nichts mehr anfangen
    if( !min_equal_max )
        v.erase( v.begin() + idx1 );
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207627</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 02 May 2012 14:56:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 15:01:59 GMT]]></title><description><![CDATA[<p>Ok, danke SeppJ, dass erase nur die Iteratoren ungültig macht, die auf den gelöschten Wert folgen wusste ich nicht. Dann lösche ich als erstes den hinteren.</p>
<p>Edit:</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das beide Iteratoren gleich sind kann bei mir nicht passieren, da der Vektor immer mindestens 3 Werte enthält (wird durch eine andere Funktion sichergestellt).</p>
<p>Edit2:</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Eigentlich müsste idx1 ja vom Typ vector::difference_type sein, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207628</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 02 May 2012 15:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 15:10:12 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Ok, danke SeppJ, dass erase nur die Iteratoren ungültig macht, die auf den gelöschten Wert folgen wusste ich nicht. Dann lösche ich als erstes den hinteren.</p>
</blockquote>
<p>funktioniert wahrscheinlich mit 100% aller vector-Implementierungen, aber ich glaube nicht, dass der Standard das garantiert. Müsste man mal nachlesen</p>
<p>pyhax schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das beide Iteratoren gleich sind kann bei mir nicht passieren, da der Vektor immer mindestens 3 Werte enthält (wird durch eine andere Funktion sichergestellt).</p>
</blockquote>
<p>.. und wenn die drei Werte gleich sind?</p>
<p>pyhax schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Eigentlich müsste idx1 ja vom Typ vector::difference_type sein, oder?</p>
</blockquote>
<p>stimmt difference_type ist richtig</p>
<p>Mir fällt gerade ein, dass ein remove-Mechanismus wesentlich performanter wäre, als ein doppelter erase. Muss ich noch mal drüber nachdenken. Wie groß sind die Vektoren in etwa?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207632</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 02 May 2012 15:10:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 15:22:20 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>pyhax schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Das beide Iteratoren gleich sind kann bei mir nicht passieren, da der Vektor immer mindestens 3 Werte enthält (wird durch eine andere Funktion sichergestellt).</p>
</blockquote>
<p>.. und wenn die drei Werte gleich sind?</p>
<p>pyhax schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>: Eigentlich müsste idx1 ja vom Typ vector::difference_type sein, oder?</p>
</blockquote>
<p>stimmt difference_type ist richtig</p>
<p>Mir fällt gerade ein, dass ein remove-Mechanismus wesentlich performanter wäre, als ein doppelter erase. Muss ich noch mal drüber nachdenken. Wie groß sind die Vektoren in etwa?</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<ol>
<li>Dann ist der Vektor auch ungültig. In dem Vektor werden Punkte eines Polygons gespeichert, die sollte nicht alle 3 gleich sein <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="🙂"
    /></li>
<li>Nicht so groß. Ist mir eigentlich egal, bis jetzt stört mich Performace weniger.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2207636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207636</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 02 May 2012 15:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 15:40:07 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>pyhax schrieb:</p>
<blockquote>
<p>Ok, danke SeppJ, dass erase nur die Iteratoren ungültig macht, die auf den gelöschten Wert folgen wusste ich nicht. Dann lösche ich als erstes den hinteren.</p>
</blockquote>
<p>funktioniert wahrscheinlich mit 100% aller vector-Implementierungen, aber ich glaube nicht, dass der Standard das garantiert. Müsste man mal nachlesen</p>
</blockquote>
<p>Das ist garantiertes Verhalten:</p>
<p>C++ 23.3.6.6,3 schrieb:</p>
<blockquote>
<p>Effects: Invalidates iterators and references at or after the point of the erase.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2207646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207646</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 May 2012 15:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Elemente an Iteratorposition von Vector entfernen on Wed, 02 May 2012 17:10:01 GMT]]></title><description><![CDATA[<p>Mal ne Frage, bei der ich mich wundere, warum sie noch keiner gestellt hat: Was machst du sonst noch mit dem vetor? Wenn das &quot;remove_minmax&quot; die Hauptaufgabe ist, würde sich für einfaches Handling ein std::(multi)set anbieten. Sonst würde ichs vermutlich wie folgt lösen:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void remove_minmax(std::vector&lt;T&gt;&amp; v)
{
  auto size = v.size();
  auto minmax = std::minmax_element(std::begin(v), std::end(v));
  std::swap(*(minmax.first), v[size-1]);
  std::swap(*(minmax.second), v[size-2]);
  v.resize(size-2);
};
</code></pre>
<p>Ich habs mir jetzt nicht komplett durchgedacht, aber vermutlich würds auch reichen, an Stelle des swap move-Zuweisungen zu nehmen, weil man die beiden letzten Stellen ja eh wegwirft:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void remove_minmax(std::vector&lt;T&gt;&amp; v)
{
  auto size = v.size();
  auto minmax = std::minmax_element(std::begin(v), std::end(v));
  *(minmax.first) = std::move(v[size-1]);
  *(minmax.second) = std::move(v[size-2]);
  v.resize(size-2);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207697</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 May 2012 17:10:01 GMT</pubDate></item></channel></rss>