<?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[Alle Keys einer map aus einer anderen Map entfernen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wenn ich 2 maps vom selben Typ habe und aus der einen Map alle Einträge die einen Key haben, der auch in der anderen map enthalten ist, wie geht das dann am besten?<br />
Gibts da vll irgendnen algorithmus, den man verwenden kann oder so?</p>
<p>Mein naiver Ansatz wäre:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;string&gt;
using namespace std;

void foo()
{
   typedef map&lt;int, string&gt; MyMap;
   MyMap m1,m2;
   fillWithValues(m1);
   fillWithOtherValues(m2);
   for(MyMap::iterator i = m1.begin(); i!= m1.end(); ++i)
   {
      m2.erase(i-&gt;first);
   }
}
</code></pre>
<p>Geht das vll noch kürzer/besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290641/alle-keys-einer-map-aus-einer-anderen-map-entfernen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 07:15:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290641.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Jul 2011 11:28:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:28:59 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wenn ich 2 maps vom selben Typ habe und aus der einen Map alle Einträge die einen Key haben, der auch in der anderen map enthalten ist, wie geht das dann am besten?<br />
Gibts da vll irgendnen algorithmus, den man verwenden kann oder so?</p>
<p>Mein naiver Ansatz wäre:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;string&gt;
using namespace std;

void foo()
{
   typedef map&lt;int, string&gt; MyMap;
   MyMap m1,m2;
   fillWithValues(m1);
   fillWithOtherValues(m2);
   for(MyMap::iterator i = m1.begin(); i!= m1.end(); ++i)
   {
      m2.erase(i-&gt;first);
   }
}
</code></pre>
<p>Geht das vll noch kürzer/besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100025</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:38:45 GMT]]></title><description><![CDATA[<p>Deine jetzige Implementierung hat Komplexität O(m * log n), wobei m die Größe von m1 und n die Größe von m2 ist. Es geht auch in linearer Zeit O(m + n), wenn du die Sortierung berücksichtigst. Das geht in etwa so:</p>
<pre><code class="language-cpp">auto i = m1.begin();
auto j = m2.begin();
while(i != m1.end() &amp;&amp; j != m2.end())
{
    if(i-&gt;first == j-&gt;first)
    {
        m2.erase(j++);
        ++i;
    }
    else
        ++j;
}
</code></pre>
<p>Es kommt auf die Größenverhältnisse zwischen den beiden Maps an, welche Komplexität als besser zu betrachten ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100026</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:38:45 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:39:05 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Deine jetzige Implementierung hat Komplexität O(n* log n). Es geht auch in linearer Zeit, wenn du die Sortierung berücksichtigst. Das geht in etwa so:</p>
<pre><code class="language-cpp">auto i = m1.begin();
auto j = m2.begin();
while(i != m1.end() &amp;&amp; j != m2.end())
{
    if(i-&gt;first == j-&gt;first)
    {
        m2.erase(j++);
        ++i;
    }
    else
        ++j;
}
</code></pre>
</blockquote>
<p>Ohne es groß durchzuprobieren, ahbe ich meine Zweifel, dass ein == reicht, um zu entscheiden, ob es ++i oder ++j sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100028</guid><dc:creator><![CDATA[HighendCoder]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:42:28 GMT]]></title><description><![CDATA[<p>Ok, sofern es funktioniert, wirds wirklich etwas schneller sein.<br />
Mir gings aber eigentlich hauptsächlich um die einfachheit/kürze/verständlichkeit, deswegen hatte ich auf nen algorithmus gehofft der da funktioniert.<br />
Mehr Schnelligkeit ist natürlich auch nich verkehrt, aber nicht das hauptanliegen.<br />
Für set gibts ja einiges<br />
set_difference<br />
set_intersection<br />
set_symmetric_difference<br />
set_union</p>
<p>Ich muss aber zugeben, dass ich ohne nachzuschaun nicht genau weiß, wie die funktionieren.<br />
Aber für map wird das vermutlich nicht funktionieren.</p>
<p>Zu dem keyword</p>
<pre><code class="language-cpp">auto
</code></pre>
<p>: Das funktioniert aber nur mit C++0x, oder?<br />
Ich benutz MSVC 2010 und hab bisher noch nichts mit 0x versucht, aber eigentlich siehts ganz praktisch aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100029</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:48:33 GMT]]></title><description><![CDATA[<p>Mir fällt so spontan set_difference ein, wobei der Kram dann in eine dritte Map kopiert wird:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;map&gt;
#include &lt;string&gt;

struct pair_key_compare {
  template&lt;typename T, typename U&gt;
  bool operator()(std::pair&lt;T, U&gt; const &amp;lhs,
                  std::pair&lt;T, U&gt; const &amp;rhs) {
    return lhs.first &lt; rhs.first;
  }
};

int main() {
  std::map&lt;int, std::string&gt; m1, m2, m3;

  m1[1] = &quot;foo&quot;;
  m1[2] = &quot;bar&quot;;
  m1[3] = &quot;baz&quot;;

  m2[1] = &quot;qux&quot;;
  m2[3] = &quot;quux&quot;;
  m2[5] = &quot;xyzzy&quot;;

  std::set_difference(m2.begin(), m2.end(),
                      m1.begin(), m1.end(),
                      std::inserter(m3, m3.begin()),
                      pair_key_compare());

  for(std::map&lt;int, std::string&gt;::const_iterator i = m3.begin(); i != m3.end(); ++i) {
    std::cout &lt;&lt; i-&gt;first &lt;&lt; &quot; -&gt; &quot; &lt;&lt; i-&gt;second &lt;&lt; '\n';
  }
}
</code></pre>
<p>Was den Algorithmus angeht, da reicht == in der Tat nicht, zumal der Schlüssel einer Map diesen Operator gar nicht zwingend braucht. So sollte es gehen:</p>
<pre><code class="language-cpp">auto i = m1.begin();
auto j = m2.begin();

while(i != m1.end() &amp;&amp; j != m2.end()) {
  if(i-&gt;first &lt; j-&gt;first) {
    ++i;
  } else if(j-&gt;first &lt; i-&gt;first) {
    ++j;
  } else {
    m2.erase(j++);
    ++i;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2100032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100032</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 11:50:12 GMT]]></title><description><![CDATA[<p>HighendCoder schrieb:</p>
<blockquote>
<p>Ohne es groß durchzuprobieren, ahbe ich meine Zweifel, dass ein == reicht, um zu entscheiden, ob es ++i oder ++j sein muss.</p>
</blockquote>
<p>Wie meinst du das? Edit: Jetzt seh ichs auch.</p>
<p>BTW: Man kann die Performance noch steigern, indem man zwei verschachtelte Schleifen macht, sodass nciht nach jedem Inkrementieren von j geprüft werden muss, ob i == m1.end() ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100033</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 31 Jul 2011 11:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 15:34:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if (!m1.empty() &amp;&amp; !m2.empty() &amp;&amp; &amp;m1 != &amp;m2) {
    auto i = m1.begin();
    auto j = m2.begin();
    auto comp = m1.value_comp();
    for ( ;; ) {
        if(m1.comp()(*i, *j) {
            if (++i == m1.end())
                break;
        } else if(comp()(*j, *i) {
            if (++j == m2.end())
                break;
        } else {
            m2.erase(j++);
            if (j == m2.end() || ++i == m1.end())
                break;
        }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2100095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100095</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 31 Jul 2011 15:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 16:28:35 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Deine jetzige Implementierung hat Komplexität O(m * log n), wobei m die Größe von m1 und n die Größe von m2 ist. Es geht auch in linearer Zeit O(m + n), wenn du die Sortierung berücksichtigst. Das geht in etwa so:</p>
<pre><code class="language-cpp">auto i = m1.begin();
auto j = m2.begin();
while(i != m1.end() &amp;&amp; j != m2.end())
{
    if(i-&gt;first == j-&gt;first)
    {
        m2.erase(j++);
        ++i;
    }
    else
        ++j;
}
</code></pre>
<p>Es kommt auf die Größenverhältnisse zwischen den beiden Maps an, welche Komplexität als besser zu betrachten ist.</p>
</blockquote>
<p>Du geht davon aus, daß erase() O(1) ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100109</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 31 Jul 2011 16:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 17:57:00 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Du geht davon aus, daß erase() O(1) ist?</p>
</blockquote>
<p>Ja:</p>
<blockquote>
<p>Complexity<br />
For the first version ( erase(position) ), amortized constant.</p>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/map/erase/" rel="nofollow">http://www.cplusplus.com/reference/stl/map/erase/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100122</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 31 Jul 2011 17:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Sun, 31 Jul 2011 19:09:32 GMT]]></title><description><![CDATA[<p>Hmmm...Vorsicht, das ist amortisiert konstant, nicht einfach konstant. Wenn der Baum sich beim Löschen immer das kleinste Element des rechten Unterbaumes herholt, kann man sich damit fiese Worst-Case-Szenarien einhandeln, wenn lange, zusammenhängende Bereiche des Baums gelöscht werden sollen.</p>
<p>Unter gewissen Umständen könnte es wesentlich schneller sein, zusammenhängende Bereiche per range-erase abzuhandeln. Das verkompliziert allerdings den Algorithmus - Q, mit welchen Datenmengen wirfst du hier um dich? Lohnt sich der Aufwand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100139</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 31 Jul 2011 19:09:32 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Mon, 01 Aug 2011 20:27:06 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Lohnt sich der Aufwand?</p>
</blockquote>
<p>Nein.</p>
<p>Ich benutze dann doch einfach, das, was ich im ersten Post geschrieben hab.<br />
Die Datenmengen sind nicht besonders groß, ich hatte eigentlich nur auf einen algorithmus aus &lt;algorithm&gt; gehofft, den es schon gibt und das ganze einfacht macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100599</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Mon, 01 Aug 2011 20:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Alle Keys einer map aus einer anderen Map entfernen on Tue, 02 Aug 2011 08:14:32 GMT]]></title><description><![CDATA[<p>Q schrieb:</p>
<blockquote>
<p>[...] ich hatte eigentlich nur auf einen algorithmus aus &lt;algorithm&gt; gehofft, den es schon gibt und das ganze einfacht macht.</p>
</blockquote>
<p>Den gibt's doch.</p>
<p>Um die Vorzüge von seldons Code (set_difference) und campers Code (value_comp) zu kombinieren:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;map&gt;
#include &lt;string&gt;

int main() {
  std::map&lt;int, std::string&gt; m1, m2;

  m1[1] = &quot;foo&quot;;
  m1[2] = &quot;bar&quot;;
  m1[3] = &quot;baz&quot;;

  m2[1] = &quot;qux&quot;;
  m2[3] = &quot;quux&quot;;
  m2[5] = &quot;xyzzy&quot;;

  // &quot;m1 aus m2 entfernen&quot; ...
  {
    std::map&lt;int, std::string&gt; mt;
    std::set_difference(m2.begin(), m2.end(),
                        m1.begin(), m1.end(),
                        std::inserter(mt, mt.begin()),
                        m2.value_comp());
    m2.swap(mt);
  }

  for(auto i = m2.begin(); i != m2.end(); ++i) {
    std::cout &lt;&lt; i-&gt;first &lt;&lt; &quot; -&gt; &quot; &lt;&lt; i-&gt;second &lt;&lt; '\n';
  }
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2100711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2100711</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Aug 2011 08:14:32 GMT</pubDate></item></channel></rss>