<?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[std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben]]></title><description><![CDATA[<p>Hallo @all</p>
<p>Ich möchte aus einer std::multimap alle Werte ausgeben bzw. verwerten aber ich benötige nur jeweils einmal den Schlüssel.</p>
<p>Die Werte für einen bestimmten Schlüssel bekomme ich so:</p>
<pre><code>std::multimap&lt;Key,Value&gt; mmap;
for( auto werte = mmap.equal_range(mykey); werte.first != werte.second; werte++)
{
    // ...
}
</code></pre>
<p>Möchte ich alle Werte ausgeben:</p>
<pre><code>for( auto eintrag : mmap)
{
    // ...
}
</code></pre>
<p>Jetzt habe ich aber das Problem, dass ich bei der zweiten Variante mir immer merken muss, welchen Schlüssel ich schon verwendet habe und in jedem Schritt überprüfen muss, ob sich der Schlüssel geändert hat.</p>
<p>Und Deshalb meine Frage, ob es dafür eine elegantere Möglichkeit gibt, als immer zu überprüfen, ob sich der Schlüsselwert verändert hat.</p>
<p>MfG</p>
<p>Hlymur</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334380/std-multimap-alle-werte-aber-nur-jeweils-einmal-den-schlüssel-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 17:52:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334380.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Sep 2015 17:48:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 17:48:30 GMT]]></title><description><![CDATA[<p>Hallo @all</p>
<p>Ich möchte aus einer std::multimap alle Werte ausgeben bzw. verwerten aber ich benötige nur jeweils einmal den Schlüssel.</p>
<p>Die Werte für einen bestimmten Schlüssel bekomme ich so:</p>
<pre><code>std::multimap&lt;Key,Value&gt; mmap;
for( auto werte = mmap.equal_range(mykey); werte.first != werte.second; werte++)
{
    // ...
}
</code></pre>
<p>Möchte ich alle Werte ausgeben:</p>
<pre><code>for( auto eintrag : mmap)
{
    // ...
}
</code></pre>
<p>Jetzt habe ich aber das Problem, dass ich bei der zweiten Variante mir immer merken muss, welchen Schlüssel ich schon verwendet habe und in jedem Schritt überprüfen muss, ob sich der Schlüssel geändert hat.</p>
<p>Und Deshalb meine Frage, ob es dafür eine elegantere Möglichkeit gibt, als immer zu überprüfen, ob sich der Schlüsselwert verändert hat.</p>
<p>MfG</p>
<p>Hlymur</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467452</guid><dc:creator><![CDATA[Hlymur]]></dc:creator><pubDate>Wed, 09 Sep 2015 17:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 17:54:18 GMT]]></title><description><![CDATA[<p>Machs doch genauso wie schon gezeigt:</p>
<pre><code>auto iter = mmap.begin(), end = mmap.end();
while (iter != end) {
    auto&amp; key = iter-&gt;first; // Falls erwünscht
    auto pair = mmap.equal_range(key);
    for (iter = pair.first; iter != pair.second; ++iter)
        // …
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2467453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467453</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 09 Sep 2015 17:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 19:06:28 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Machs doch genauso wie schon gezeigt:</p>
<pre><code>auto iter = mmap.begin(), end = mmap.end();
while (iter != end) {
    auto&amp; key = iter-&gt;first; // Falls erwünscht
    auto pair = mmap.equal_range(key);
    for (iter = pair.first; iter != pair.second; ++iter)
        // …
}
</code></pre>
</blockquote>
<p>Das ist O(n log n), nicht?</p>
<pre><code>auto iter = mmap.begin(), end = mmap.end();
while (iter != end) {
    auto&amp; key = iter-&gt;first;
    do {
        // …
    } while (++iter != end &amp;&amp; iter-&gt;key == key);
}
</code></pre>
<p>O(n) und sollte damit schneller sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467469</guid><dc:creator><![CDATA[eqr]]></dc:creator><pubDate>Wed, 09 Sep 2015 19:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 19:55:28 GMT]]></title><description><![CDATA[<p>AFAICS, wenn <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span></span></span></span> die Anzahl der Elemente und <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03148em;">k</span></span></span></span> die Anzahl der unterschiedlichen Keys angibt, benötigt dein Code <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span></span></span></span> Vergleiche und meiner <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">Θ</mi><mo>(</mo><mi>k</mi><mi>log</mi><mi>n</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">\Theta(k \log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathrm">Θ</span><span class="mopen">(</span><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mord mathit">n</span><span class="mclose">)</span></span></span></span> (nicht mehr als <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo>(</mo><mn>2</mn><msub><mi>log</mi><mn>2</mn></msub><mi>n</mi><mo>+</mo><mi>O</mi><mo>(</mo><mn>1</mn><mo>)</mo><mo>)</mo></mrow><annotation encoding="application/x-tex">k ( 2\log_2 n + O(1))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mopen">(</span><span class="mord mathrm">2</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="vlist"><span style="top:0.24444em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle cramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathit">n</span><span class="mbin">+</span><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathrm">1</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span> um genau(er) zu sein). I.e. meiner wird mit vergleichsweise niedrig werdender Key-Anzahl besser.</p>
<p>Die Vorgehensweise mit <code>equal_range</code> kann im Übrigen mittels <code>std::upper_bound</code> deutlich verbessert werden.</p>
<pre><code>auto iter = mmap.begin(), end = mmap.end();
while (iter != end) {
    auto last = std::upper_bound(iter, end, *iter, mmap.value_comp()); 
    for (; iter != last; ++iter)
        // …
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2467476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467476</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 09 Sep 2015 19:55:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 20:48:49 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>AFAICS, wenn <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span></span></span></span> die Anzahl der Elemente und <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03148em;">k</span></span></span></span> die Anzahl der unterschiedlichen Keys angibt, benötigt dein Code <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.43056em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span></span></span></span> Vergleiche und meiner <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">Θ</mi><mo>(</mo><mi>k</mi><mi>log</mi><mi>n</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">\Theta(k \log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathrm">Θ</span><span class="mopen">(</span><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mord mathit">n</span><span class="mclose">)</span></span></span></span> [...]. I.e. meiner wird mit vergleichsweise niedrig werdender Key-Anzahl besser.</p>
</blockquote>
<p>Richtig, aber der OP will sowieso durch alle Elemente durchiterieren, von daher fällt alles unter O(n) nicht uns Gewicht und nur deine Variante ist potentiell schädlich (ausser es ist garantiert, dass die Schlüssel durchschnittlich O(log n) mal vorkommen).</p>
<blockquote>
<p>(nicht mehr als <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo>(</mo><mn>2</mn><msub><mi>log</mi><mn>2</mn></msub><mi>n</mi><mo>+</mo><mi>O</mi><mo>(</mo><mn>1</mn><mo>)</mo><mo>)</mo></mrow><annotation encoding="application/x-tex">k ( 2\log_2 n + O(1))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mopen">(</span><span class="mord mathrm">2</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="vlist"><span style="top:0.24444em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle cramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathit">n</span><span class="mbin">+</span><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathrm">1</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span> um genau(er) zu sein)</p>
</blockquote>
<p>Durchaus möglich, kannst du mir eine Quelle geben, dass der Baum höchstens Tiefe 2 hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467483</guid><dc:creator><![CDATA[eqr]]></dc:creator><pubDate>Wed, 09 Sep 2015 20:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Wed, 09 Sep 2015 21:47:52 GMT]]></title><description><![CDATA[<p>Mein Code ist potenziell aber auch besser als deiner, der definitiv ins Gewicht fällt, während meiner, sublineares Vorkommen unterschiedlicher Keys vorausgesetzt, nicht.</p>
<p>eqr schrieb:</p>
<blockquote>
<blockquote>
<p>(nicht mehr als <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo>(</mo><mn>2</mn><msub><mi>log</mi><mn>2</mn></msub><mi>n</mi><mo>+</mo><mi>O</mi><mo>(</mo><mn>1</mn><mo>)</mo><mo>)</mo></mrow><annotation encoding="application/x-tex">k ( 2\log_2 n + O(1))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.75em;"></span><span class="strut bottom" style="height:1em;vertical-align:-0.25em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mopen">(</span><span class="mord mathrm">2</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="vlist"><span style="top:0.24444em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle cramped"><span class="mord mathrm">2</span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span><span class="mord mathit">n</span><span class="mbin">+</span><span class="mord mathit" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathrm">1</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span> um genau(er) zu sein)</p>
</blockquote>
<p>Durchaus möglich, kannst du mir eine Quelle geben, dass der Baum höchstens Tiefe 2 hat?</p>
</blockquote>
<p>Was soll denn die Tiefe des Baums mit der Anzahl der Vergleiche zu tun haben?</p>
<p>Aber nein, ich habe mich vertan; Der Standard redet in [associative.reqmts] tatsächlich nicht von konkreten oberen Schranken, nur in [equal.range]. Daher nehme ich die genaue(re) Aussage zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467488</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 09 Sep 2015 21:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::multimap alle Werte aber nur jeweils einmal den Schlüssel ausgeben on Thu, 10 Sep 2015 07:04:10 GMT]]></title><description><![CDATA[<p>Ah, ok so werde ich das dann machen <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>
<p>Danke euch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467506</guid><dc:creator><![CDATA[Hlymur]]></dc:creator><pubDate>Thu, 10 Sep 2015 07:04:10 GMT</pubDate></item></channel></rss>