<?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[Kopieren von Maps unterschiedlichen Typs]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe zwei maps unterschiedlichen Typs und würde nun gerne eine Map in die andere kopieren (zum. die Keys).</p>
<pre><code class="language-cpp">typedef std::map&lt;IMyClass*, bool&gt; RegisteredMyClass;
  RegisteredMyClass m_mRegisteredMyClass;

  typedef std::map&lt;IMyClass*, int&gt; WaitingList;
  WaitingList m_mWaitingListMyClass;
</code></pre>
<p>Die Elemente der WaitingList sollen in die RegisteredMyClass kopiert werden oder genauer etwas genauer die Keys und jeder bool sollte auf false gesetzt werden.</p>
<p>Meine erster Ansatz ist nun dieser:</p>
<pre><code class="language-cpp">void MyClass::Register()
    {
      WaitingList::const_iterator itCurrent(m_mWaitingListMyClass.begin());
      WaitingList::const_iterator itEnd(m_mWaitingListMyClass.end());

      for ( ; itCurrent != itEnd; ++itCurrent)
      {
        m_mRegisteredMyClass[itCurrent-&gt;first] = false;
      }

      m_mWaitingListMyClass.clear();
    }
</code></pre>
<p>Gibt es einen schöneren und eleganteren Weg Keys zu kopieren mit der STL (copy, transform, ...)?</p>
<p>Danke,<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209514/kopieren-von-maps-unterschiedlichen-typs</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 03:28:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209514.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Mar 2008 16:09:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopieren von Maps unterschiedlichen Typs on Mon, 31 Mar 2008 16:12:43 GMT]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe zwei maps unterschiedlichen Typs und würde nun gerne eine Map in die andere kopieren (zum. die Keys).</p>
<pre><code class="language-cpp">typedef std::map&lt;IMyClass*, bool&gt; RegisteredMyClass;
  RegisteredMyClass m_mRegisteredMyClass;

  typedef std::map&lt;IMyClass*, int&gt; WaitingList;
  WaitingList m_mWaitingListMyClass;
</code></pre>
<p>Die Elemente der WaitingList sollen in die RegisteredMyClass kopiert werden oder genauer etwas genauer die Keys und jeder bool sollte auf false gesetzt werden.</p>
<p>Meine erster Ansatz ist nun dieser:</p>
<pre><code class="language-cpp">void MyClass::Register()
    {
      WaitingList::const_iterator itCurrent(m_mWaitingListMyClass.begin());
      WaitingList::const_iterator itEnd(m_mWaitingListMyClass.end());

      for ( ; itCurrent != itEnd; ++itCurrent)
      {
        m_mRegisteredMyClass[itCurrent-&gt;first] = false;
      }

      m_mWaitingListMyClass.clear();
    }
</code></pre>
<p>Gibt es einen schöneren und eleganteren Weg Keys zu kopieren mit der STL (copy, transform, ...)?</p>
<p>Danke,<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483890</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Mon, 31 Mar 2008 16:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kopieren von Maps unterschiedlichen Typs on Thu, 03 Apr 2008 13:01:05 GMT]]></title><description><![CDATA[<p>Also für copy müsstest du dir wahrscheinlich einen eigenen Iterator schreiben, den du als dritten Parameter übergibst.<br />
Ich habs mit transform versucht, hab aber leider immer irgendwelche Compilerfehler bekommen.<br />
Hier wäre eine Variante mit for_each:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;map&gt;
#include &lt;iostream&gt;

typedef std::map&lt;int, bool&gt; IntBool;
typedef std::map&lt;int, int&gt; IntInt;

class func
{
    public:
        func(std::map&lt;int, bool&gt;&amp; m) : ii(m) {}
        void operator() (const std::pair&lt;int, int&gt;&amp; p) { ii.insert(std::make_pair(p.first, false)); }
    private:
        std::map&lt;int, bool&gt;&amp; ii;
};

int main(int argc, char* argv[])
{
    IntInt ii;
    IntBool ib;

    ii[0] = 0;
    ii[1] = 1;
    ii[2] = 2;
    ii[3] = 3;

    for(std::map&lt;int, int&gt;::iterator iter1 = ii.begin(); iter1 != ii.end(); ++iter1)
        std::cout &lt;&lt; iter1-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter1-&gt;second &lt;&lt; std::endl;

    std::for_each(ii.begin(), ii.end(), func(ib));

    for(std::map&lt;int, bool&gt;::iterator iter2 = ib.begin(); iter2 != ib.end(); ++iter2)
        std::cout &lt;&lt; iter2-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter2-&gt;second &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1485811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485811</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Thu, 03 Apr 2008 13:01:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kopieren von Maps unterschiedlichen Typs on Thu, 03 Apr 2008 17:22:40 GMT]]></title><description><![CDATA[<p>Also ich habs jetzt doch noch mit transform hinbekommen. Ist ein bisschen kürzer weil eine freie Funktion reicht und du keinen Funktor schreiben musst.</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;map&gt;
#include &lt;iostream&gt;

typedef std::map&lt;int, bool&gt; IntBool;
typedef std::map&lt;int, int&gt; IntInt;

std::pair&lt;int, bool&gt; func(const std::pair&lt;int, int&gt;&amp; p)
{
    return std::make_pair(p.first, false);
}

int main(int argc, char* argv[])
{
    IntInt ii;
    IntBool ib;

    ii[0] = 0;
    ii[1] = 1;
    ii[2] = 2;
    ii[3] = 3;

    for(std::map&lt;int, int&gt;::iterator iter1 = ii.begin(); iter1 != ii.end(); ++iter1)
        std::cout &lt;&lt; iter1-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter1-&gt;second &lt;&lt; std::endl;

    std::transform(ii.begin(), ii.end(), std::inserter(ib, ib.end()), func);

    for(std::map&lt;int, bool&gt;::iterator iter2 = ib.begin(); iter2 != ib.end(); ++iter2)
        std::cout &lt;&lt; iter2-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter2-&gt;second &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1485972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485972</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Thu, 03 Apr 2008 17:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kopieren von Maps unterschiedlichen Typs on Fri, 04 Apr 2008 11:50:19 GMT]]></title><description><![CDATA[<p>Es ist evtl. sinnvoll anzumerken, dass diese Lösung zwar einigermaßen elegant aber auch, zumindest wenn IntInt nicht zuvor leer ist, möglicherweise ineffizient ist.<br />
Wenn N die Anzahl der Elemente in IntBool, und M die Anzahl IntInt ist, können wir die Komplexität obigen Algorithmuses in erster Näherung als O(N*lg(M)) abschätzen. Das stimmt nicht so ganz, weil die Größe der Map ja während des Einfügens anwächst, aber damit erhöht sich die Komplexität ja nur noch weiter.<br />
Es ist aber andererseits sehr einfach, einen Algorithmus anzugeben mit O(N+M), dann müssen wir aber ohne Standardalgorithmen auskommen:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;map&gt;
#include &lt;iostream&gt;

typedef std::map&lt;int, bool&gt; IntBool;
typedef std::map&lt;int, int&gt; IntInt;

int main(int argc, char* argv[])
{
    IntInt ii;
    IntBool ib;

    ii[0] = 0;
    ii[1] = 1;
    ii[2] = 2;
    ii[3] = 3;

    for(std::map&lt;int, int&gt;::iterator iter1 = ii.begin(); iter1 != ii.end(); ++iter1)
        std::cout &lt;&lt; iter1-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter1-&gt;second &lt;&lt; std::endl;

//  std::transform(ii.begin(), ii.end(), std::inserter(ib, ib.end()), func);
    {
        std::map&lt;int, int&gt;::const_iterator iter1 = ii.begin();
        std::map&lt;int, bool&gt;::iterator iter2 = ib.begin();
        if ( iter1 != ii.end() &amp;&amp; iter2 != ib.end() )
            for ( ;; )
            {
                if ( iter1-&gt;first &lt; iter2-&gt;first )
                {
                    ib.insert( std::make_pair( iter1-&gt;first, false ), iter2 );
                    if ( ++iter1 == ii.end() )
                        break;
                }
                else
                    if ( ++iter2 == ib.end() )
                        break;
            }
        while ( iter1 != ii.end() )
            ib.insert( std::make_pair( iter1-&gt;first, false ), ib.end() );
    }

    for(std::map&lt;int, bool&gt;::iterator iter2 = ib.begin(); iter2 != ib.end(); ++iter2)
        std::cout &lt;&lt; iter2-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; iter2-&gt;second &lt;&lt; std::endl;
}
</code></pre>
<p>Das ist schneller zumindest dann, wenn M nicht 0 und nicht sehr groß gegen N ist. Will man die beste Lösung, müsste man wohl zuerst die Größen der Maps untersuchen, und in Abhängigkeit davon dann den Algorithmus auswählen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486397</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 04 Apr 2008 11:50:19 GMT</pubDate></item></channel></rss>