<?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[Problem mit tr1::unordered_map]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein merkwürdiges Problem mit der std::tr1::unordered_map. Und zwar habe eine Klasse geschrieben, die als privaten Member eine solche Map enthält. Zudem hat die Klasse die Operatoren &quot;==&quot; und &quot;=&quot; überladen. In einem Testdurchlauf mit weniger Elementen als 66 (&lt;= 66) ist alles ok. Wenn ich 66 oder mehr Elemente hinzufügen und vergleiche sind die Maps plötzlich nicht mehr gleich. Ich verstehe leider nicht ganz warum.</p>
<p>Hier einmal der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;unordered_map&gt;

// Map Klasse
class MyMap
{
private:

    typedef std::tr1::unordered_map&lt;int, int&gt; mm;

    std::tr1::unordered_map&lt;int, int&gt; m_Map;

public:

    bool Add(const int &amp; Key, const int &amp; Value)
    {
        return this-&gt;m_Map.insert(mm::value_type(Key, Value)).second;
    }

    const bool operator == (const MyMap &amp; rhs) const
    {
        if (this != &amp;rhs)
        {
            if (this-&gt;m_Map.size() != rhs.m_Map.size())
                return false;

            for(mm::const_iterator it_lhs = this-&gt;m_Map.begin(), it_rhs = rhs.m_Map.begin();
                    it_lhs != this-&gt;m_Map.end() &amp;&amp; it_rhs != rhs.m_Map.end();
                    it_lhs++, it_rhs++)
            {
                if (it_lhs-&gt;first != it_rhs-&gt;first || it_lhs-&gt;second != it_rhs-&gt;second)
                    return false;                
            }
        }

        return true;
    }

    const MyMap &amp; operator = (const MyMap &amp; rhs)
    {
        this-&gt;m_Map.clear();

        if (rhs.m_Map.empty())
            return *this;
        else
        {
            for(mm::const_reverse_iterator it_rhs = rhs.m_Map.rbegin(); it_rhs != rhs.m_Map.rend(); it_rhs++)
            {
                this-&gt;Add(it_rhs-&gt;first, it_rhs-&gt;second);
            }
        }

        return *this;
    }
};

int main(int argc, char ** argv)
{
    MyMap m1, m2;

    for (int i = 0; i &lt; 66; i++) // &lt;= 66 ist alles ok, mit &gt;= 66 sind die Maps nicht mehr gleich
    {
        m1.Add(i, i);
    }

    m2 = m1;

    std::cout &lt;&lt; &quot;Vergleich: &quot; &lt;&lt; (m2 == m1) &lt;&lt; std::endl;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/234626/problem-mit-tr1-unordered_map</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:45:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234626.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Feb 2009 07:49:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 07:49:51 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein merkwürdiges Problem mit der std::tr1::unordered_map. Und zwar habe eine Klasse geschrieben, die als privaten Member eine solche Map enthält. Zudem hat die Klasse die Operatoren &quot;==&quot; und &quot;=&quot; überladen. In einem Testdurchlauf mit weniger Elementen als 66 (&lt;= 66) ist alles ok. Wenn ich 66 oder mehr Elemente hinzufügen und vergleiche sind die Maps plötzlich nicht mehr gleich. Ich verstehe leider nicht ganz warum.</p>
<p>Hier einmal der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;unordered_map&gt;

// Map Klasse
class MyMap
{
private:

    typedef std::tr1::unordered_map&lt;int, int&gt; mm;

    std::tr1::unordered_map&lt;int, int&gt; m_Map;

public:

    bool Add(const int &amp; Key, const int &amp; Value)
    {
        return this-&gt;m_Map.insert(mm::value_type(Key, Value)).second;
    }

    const bool operator == (const MyMap &amp; rhs) const
    {
        if (this != &amp;rhs)
        {
            if (this-&gt;m_Map.size() != rhs.m_Map.size())
                return false;

            for(mm::const_iterator it_lhs = this-&gt;m_Map.begin(), it_rhs = rhs.m_Map.begin();
                    it_lhs != this-&gt;m_Map.end() &amp;&amp; it_rhs != rhs.m_Map.end();
                    it_lhs++, it_rhs++)
            {
                if (it_lhs-&gt;first != it_rhs-&gt;first || it_lhs-&gt;second != it_rhs-&gt;second)
                    return false;                
            }
        }

        return true;
    }

    const MyMap &amp; operator = (const MyMap &amp; rhs)
    {
        this-&gt;m_Map.clear();

        if (rhs.m_Map.empty())
            return *this;
        else
        {
            for(mm::const_reverse_iterator it_rhs = rhs.m_Map.rbegin(); it_rhs != rhs.m_Map.rend(); it_rhs++)
            {
                this-&gt;Add(it_rhs-&gt;first, it_rhs-&gt;second);
            }
        }

        return *this;
    }
};

int main(int argc, char ** argv)
{
    MyMap m1, m2;

    for (int i = 0; i &lt; 66; i++) // &lt;= 66 ist alles ok, mit &gt;= 66 sind die Maps nicht mehr gleich
    {
        m1.Add(i, i);
    }

    m2 = m1;

    std::cout &lt;&lt; &quot;Vergleich: &quot; &lt;&lt; (m2 == m1) &lt;&lt; std::endl;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1666853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666853</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 20 Feb 2009 07:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 08:10:22 GMT]]></title><description><![CDATA[<p>HaJo. schrieb:</p>
<blockquote>
<p>Wenn ich 66 oder mehr Elemente hinzufügen und vergleiche sind die Maps plötzlich nicht mehr gleich. Ich verstehe leider nicht ganz warum.</p>
</blockquote>
<p>tr1::unordered_map garantiert keine bestimmte Reihenfolge der Elemente.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666858</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 20 Feb 2009 08:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 09:48:04 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>tr1::unordered_map garantiert keine bestimmte Reihenfolge der Elemente.</p>
</blockquote>
<p>Hmm, das ist gut zu wissen. Das heißt für einen Vergleich müsste ich durch eine Map iterieren, in der anderen Map mit find nach Schlüssel und Wert suchen und diese dann vergleichen.</p>
<p>Garantiert die std::map eine Reihenfolge? Oder welcher Schlüssel/Wert Datentyp wäre für einfache Liste, die nach &quot;Einfügen der Elemente&quot; &quot;sortiert&quot; ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666919</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 20 Feb 2009 09:48:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 09:55:26 GMT]]></title><description><![CDATA[<p>HaJo. schrieb:</p>
<blockquote>
<p>MFK schrieb:</p>
<blockquote>
<p>tr1::unordered_map garantiert keine bestimmte Reihenfolge der Elemente.</p>
</blockquote>
<p>Hmm, das ist gut zu wissen. Das heißt für einen Vergleich müsste ich durch eine Map iterieren, in der anderen Map mit find nach Schlüssel und Wert suchen und diese dann vergleichen.</p>
<p>Garantiert die std::map eine Reihenfolge? Oder welcher Schlüssel/Wert Datentyp wäre für einfache Liste, die nach &quot;Einfügen der Elemente&quot; &quot;sortiert&quot; ist?</p>
</blockquote>
<p>Für eine sortierte Collection solltest Du eine <code>std::map</code> nehmen, ja. Die Schlüssel-Wert-Paare werden beim Einfügen sortiert. Das Sortierkriterium lässt sich ggf. selbst festlegen.<br />
Eine <code>std::tr1::</code>  <code>unordered</code>  <code>_map</code> is, wie der Name bereits sagt, unsortiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666926</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Feb 2009 09:55:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 10:11:01 GMT]]></title><description><![CDATA[<p>Map garatiert eine Reihenfolge, die durch die Vergleichsfunktion der Map bestimmt wird, welche standardmäßig der operator&lt; des Keys ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666942</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 20 Feb 2009 10:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 10:40:49 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Map garatiert eine Reihenfolge, die durch die Vergleichsfunktion der Map bestimmt wird, welche standardmäßig der operator&lt; des Keys ist.</p>
</blockquote>
<p>Super danke. Also bei ganzzahligen Werten, die monoton steigen/fallen ist eine map die Wahl.</p>
<p>Bei Strings wäre dann z.B. ein std::vector mit einem Objekt&lt;Key, Value&gt; die Wahl, wenn die Werte nicht geordnet werden sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666957</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 20 Feb 2009 10:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 10:54:34 GMT]]></title><description><![CDATA[<p>HaJo. schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Map garatiert eine Reihenfolge, die durch die Vergleichsfunktion der Map bestimmt wird, welche standardmäßig der operator&lt; des Keys ist.</p>
</blockquote>
<p>Super danke. Also bei ganzzahligen Werten, die monoton steigen/fallen ist eine map die Wahl.</p>
<p>Bei Strings wäre dann z.B. ein std::vector mit einem Objekt&lt;Key, Value&gt; die Wahl, wenn die Werte nicht geordnet werden sollen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Wie das denn? Du kannst der Map eine Vergleichfunktion für Strings übergeben. Warum sollte man keine Strings in einem Map nutzen sollen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666964</guid><dc:creator><![CDATA[Bulli]]></dc:creator><pubDate>Fri, 20 Feb 2009 10:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 11:11:04 GMT]]></title><description><![CDATA[<p>HaJo. schrieb:</p>
<blockquote>
<p>Bei Strings wäre dann z.B. ein std::vector mit einem Objekt&lt;Key, Value&gt; die Wahl, wenn die Werte nicht geordnet werden sollen.</p>
</blockquote>
<p>Es kommt drauf an, was Du machen willst. Wenn es Dir um schnelles Suchen geht, wären die unordered_* Container besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666971</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Feb 2009 11:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 11:23:15 GMT]]></title><description><![CDATA[<p>Bulli schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Wie das denn? Du kannst der Map eine Vergleichfunktion für Strings übergeben. Warum sollte man keine Strings in einem Map nutzen sollen?</p>
</blockquote>
<p>Sorry. Ich habe mich wohl etwas missverständlich ausgedrückt. Natürlich lassen sich Strings in u-/maps nutzen.</p>
<p>Ich wollte nur einen Container, der Wert/Schlüssel nicht nach Schlüssel sortiert, sondern der Reihe nach einfügt.</p>
<p>Falls die Schlüssel Zeitstempel beispielsweise sind, ist ein map möglich da die Zeitstempel monoton steigend vorkommen.</p>
<p>Falls die Schlüssel vom Datentyp String sind, und diese nicht mit &lt; oder &gt; der Größe nach geordnet werden sollen, ist weder map noch u-map eine Wahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666985</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 20 Feb 2009 11:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 11:23:36 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>HaJo. schrieb:</p>
<blockquote>
<p>Bei Strings wäre dann z.B. ein std::vector mit einem Objekt&lt;Key, Value&gt; die Wahl, wenn die Werte nicht geordnet werden sollen.</p>
</blockquote>
<p>Es kommt drauf an, was Du machen willst. Wenn es Dir um schnelles Suchen geht, wären die unordered_* Container besser.</p>
</blockquote>
<p>Es kommt drauf an, was Du machen willst. Bei langen strings sind ordered maps zum suchen wieder besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1666986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1666986</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 20 Feb 2009 11:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 11:55:59 GMT]]></title><description><![CDATA[<p>HaJo. schrieb:</p>
<blockquote>
<p>Ich wollte nur einen Container, der Wert/Schlüssel nicht nach Schlüssel sortiert, sondern der Reihe nach einfügt.</p>
</blockquote>
<p>Dann willst du ein vector&lt;pair&lt;Key, Value&gt; &gt; haben... und keine map...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667002</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 20 Feb 2009 11:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 12:04:25 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Es kommt drauf an, was Du machen willst. Bei langen strings sind ordered maps zum suchen wieder besser.</p>
</blockquote>
<p>Ahh. Gut zu wissen. Danke.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Dann willst du ein vector&lt;pair&lt;Key, Value&gt; &gt; haben... und keine map...</p>
</blockquote>
<p>Oder so. Ist warscheinlich besser, wg. Verwendung der STL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667007</guid><dc:creator><![CDATA[HaJo.]]></dc:creator><pubDate>Fri, 20 Feb 2009 12:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 18:38:31 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Es kommt drauf an, was Du machen willst. Bei langen strings sind ordered maps zum suchen wieder besser.</p>
</blockquote>
<p>Wieso das denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667248</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Feb 2009 18:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 19:23:47 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Es kommt drauf an, was Du machen willst. Bei langen strings sind ordered maps zum suchen wieder besser.</p>
</blockquote>
<p>Wieso das denn?</p>
</blockquote>
<p>weil das berechnen des hashcodes passiert, indem der ganze lange string gelesen wird. das kann teurer sein, als zehn strungvergleiche, die früh abbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667294</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 20 Feb 2009 19:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 22:34:33 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Es kommt drauf an, was Du machen willst. Bei langen strings sind ordered maps zum suchen wieder besser.</p>
</blockquote>
<p>Wieso das denn?</p>
</blockquote>
<p>weil das berechnen des hashcodes passiert, indem der ganze lange string gelesen wird. das kann teurer sein, als zehn strungvergleiche, die früh abbrechen.</p>
</blockquote>
<p>Und wieso sollten die Stringvergleiche früh abbrechen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667368</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Feb 2009 22:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit tr1::unordered_map on Fri, 20 Feb 2009 23:12:54 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Und wieso sollten die Stringvergleiche früh abbrechen?</p>
</blockquote>
<p>weil sie beim ersten unterschied abbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667381</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 20 Feb 2009 23:12:54 GMT</pubDate></item></channel></rss>