<?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[Iterator einer Multimap lässt sich nicht inkrementieren]]></title><description><![CDATA[<p>Hallo alle zusammen <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>Ich lerne gerade mit Hilfe des Buches C++ - Primer das Programmieren. In diesem Buch befinden sich viele Übungsaufgaben, die ich allesamt immer versuche so gut es geht zu lösen. Momentan versuche ich mich an folgender Aufgabe:</p>
<p>Schreiben Sie ein Programm, das eine Multimap mit Autoren und ihren Werken füllt. Benutzen Sie <em>find</em>, um ein Element zu finden, und löschen Sie es. Vergewissern Sie sich, dass das Programm korrekt arbeitet, wenn sich das Element, nachdem Sie suchen, nicht in der Map befindet.</p>
<p>Ich habe das Programm auch schon fertig geschrieben:</p>
<pre><code class="language-cpp">//main.cpp
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::multimap;
using std::make_pair;

int main()
{
	multimap&lt;string, string&gt; autoren;
	string suchbegriff;
	// Die multimap mit ein paar Werten füllen
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Fairwater&quot;));
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Test&quot;));
	autoren.insert(make_pair(&quot;Gott&quot;, &quot;Die Bibel&quot;));
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Show&quot;));
	cout &lt;&lt; &quot;Inhalt der multimap:&quot; &lt;&lt; endl;
	// typedef um die lange Iterator- und Size_Type-Initialisierung zu verkürzen
	typedef multimap&lt;string, string&gt;::iterator aut_it;
	typedef multimap&lt;string, string&gt;::size_type sz_type;
	// Ausgabe aller Elemente der multimap
	for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
		cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
	cout &lt;&lt; &quot;\nWelches Element soll geloescht werden?&quot; &lt;&lt; endl;
	getline(cin, suchbegriff);
	// Durchsucht multimap nach einem Schlüssel der mit der Eingabe übereinstimmt
	// Gibt Anzahl der Elemente mit diesem Schlüssel zurück
	sz_type anzahl = autoren.count(suchbegriff);
	// Gibt Iterator zurück der auf das erste Element mit diesem Schlüssel zeigt
	aut_it mm_iter = autoren.find(suchbegriff);
	// Löscht alle Elemente mit dem angegebenen Schlüssel
	for (sz_type i = 0; i != anzahl; ++i, ++mm_iter)
		autoren.erase(mm_iter);
	// Ausgabe der noch übrigen Elemente der multimap
	if (autoren.size() != 0) {
		cout &lt;&lt; &quot;\nAusgabe der noch uebrigen Elemente:&quot; &lt;&lt; endl;
		for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
			cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
	} else
		cout &lt;&lt; &quot;\nIn der multimap befinden sich keine Elemente mehr.&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Und es lässt sich auch problemlos kompilieren. Wenn ich allerdings den Namen eines Autors, dessen Elemente in der Multimap gelöscht werden sollen, eingebe, erhalte ich eine Fehlermeldung: &quot;Expression: map/set iterator not incrementable&quot;</p>
<p>Hier mal ein Bild eines Testlaufs des Programms:<br />
<a href="http://img293.imageshack.us/my.php?image=mmapiterinkrementierfehbs6.jpg" rel="nofollow">http://img293.imageshack.us/my.php?image=mmapiterinkrementierfehbs6.jpg</a></p>
<p>Soweit wie ich den Fehler verstanden habe, lässt sich der Multimap-Iterator der folgenden for-Schleife nicht inkrementieren:</p>
<pre><code class="language-cpp">// Löscht alle Elemente mit dem angegebenen Schlüssel
for (sz_type i = 0; i != anzahl; ++i, ++mm_iter)
autoren.erase(mm_iter);
</code></pre>
<p>Was ich aber überhaupt nicht verstehe, da ich in einer vorherigen for-Schleife auch einen Multimap-Iterator inkrementiere und dort das ganze problemlos funktioniert:</p>
<pre><code class="language-cpp">// Ausgabe aller Elemente der multimap
for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
</code></pre>
<p>Meine Frage ist jetzt, ob mir jemand erklären kann, wieso ich in der einen for-Schleife einen Multimap-Iterator problemlos inkrementieren kann, in einer anderen for-Schleife jedoch nicht. Vielleicht habe ich aber auch die Fehlermeldung falsch verstanden... Ich bin also momentan total ratlos <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/225048/iterator-einer-multimap-lässt-sich-nicht-inkrementieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 00:43:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225048.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Oct 2008 16:05:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 16:05:52 GMT]]></title><description><![CDATA[<p>Hallo alle zusammen <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>Ich lerne gerade mit Hilfe des Buches C++ - Primer das Programmieren. In diesem Buch befinden sich viele Übungsaufgaben, die ich allesamt immer versuche so gut es geht zu lösen. Momentan versuche ich mich an folgender Aufgabe:</p>
<p>Schreiben Sie ein Programm, das eine Multimap mit Autoren und ihren Werken füllt. Benutzen Sie <em>find</em>, um ein Element zu finden, und löschen Sie es. Vergewissern Sie sich, dass das Programm korrekt arbeitet, wenn sich das Element, nachdem Sie suchen, nicht in der Map befindet.</p>
<p>Ich habe das Programm auch schon fertig geschrieben:</p>
<pre><code class="language-cpp">//main.cpp
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::multimap;
using std::make_pair;

int main()
{
	multimap&lt;string, string&gt; autoren;
	string suchbegriff;
	// Die multimap mit ein paar Werten füllen
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Fairwater&quot;));
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Test&quot;));
	autoren.insert(make_pair(&quot;Gott&quot;, &quot;Die Bibel&quot;));
	autoren.insert(make_pair(&quot;Oliver&quot;, &quot;Show&quot;));
	cout &lt;&lt; &quot;Inhalt der multimap:&quot; &lt;&lt; endl;
	// typedef um die lange Iterator- und Size_Type-Initialisierung zu verkürzen
	typedef multimap&lt;string, string&gt;::iterator aut_it;
	typedef multimap&lt;string, string&gt;::size_type sz_type;
	// Ausgabe aller Elemente der multimap
	for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
		cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
	cout &lt;&lt; &quot;\nWelches Element soll geloescht werden?&quot; &lt;&lt; endl;
	getline(cin, suchbegriff);
	// Durchsucht multimap nach einem Schlüssel der mit der Eingabe übereinstimmt
	// Gibt Anzahl der Elemente mit diesem Schlüssel zurück
	sz_type anzahl = autoren.count(suchbegriff);
	// Gibt Iterator zurück der auf das erste Element mit diesem Schlüssel zeigt
	aut_it mm_iter = autoren.find(suchbegriff);
	// Löscht alle Elemente mit dem angegebenen Schlüssel
	for (sz_type i = 0; i != anzahl; ++i, ++mm_iter)
		autoren.erase(mm_iter);
	// Ausgabe der noch übrigen Elemente der multimap
	if (autoren.size() != 0) {
		cout &lt;&lt; &quot;\nAusgabe der noch uebrigen Elemente:&quot; &lt;&lt; endl;
		for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
			cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
	} else
		cout &lt;&lt; &quot;\nIn der multimap befinden sich keine Elemente mehr.&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Und es lässt sich auch problemlos kompilieren. Wenn ich allerdings den Namen eines Autors, dessen Elemente in der Multimap gelöscht werden sollen, eingebe, erhalte ich eine Fehlermeldung: &quot;Expression: map/set iterator not incrementable&quot;</p>
<p>Hier mal ein Bild eines Testlaufs des Programms:<br />
<a href="http://img293.imageshack.us/my.php?image=mmapiterinkrementierfehbs6.jpg" rel="nofollow">http://img293.imageshack.us/my.php?image=mmapiterinkrementierfehbs6.jpg</a></p>
<p>Soweit wie ich den Fehler verstanden habe, lässt sich der Multimap-Iterator der folgenden for-Schleife nicht inkrementieren:</p>
<pre><code class="language-cpp">// Löscht alle Elemente mit dem angegebenen Schlüssel
for (sz_type i = 0; i != anzahl; ++i, ++mm_iter)
autoren.erase(mm_iter);
</code></pre>
<p>Was ich aber überhaupt nicht verstehe, da ich in einer vorherigen for-Schleife auch einen Multimap-Iterator inkrementiere und dort das ganze problemlos funktioniert:</p>
<pre><code class="language-cpp">// Ausgabe aller Elemente der multimap
for (aut_it iter = autoren.begin(); iter != autoren.end(); ++iter)
cout &lt;&lt; &quot;Autor: &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; / Titel: &quot; &lt;&lt; iter-&gt;second &lt;&lt; endl;
</code></pre>
<p>Meine Frage ist jetzt, ob mir jemand erklären kann, wieso ich in der einen for-Schleife einen Multimap-Iterator problemlos inkrementieren kann, in einer anderen for-Schleife jedoch nicht. Vielleicht habe ich aber auch die Fehlermeldung falsch verstanden... Ich bin also momentan total ratlos <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600872</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 18 Oct 2008 16:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 16:50:21 GMT]]></title><description><![CDATA[<p>Ich bin mir jetzt nicht sicher, aber es könnte sein, dass der Iterator ungültig wird, wenn du das Element rauslöschst. Dadurch ist er nicht mehr inkrementierbar.<br />
Am besten ersetzt du deinen Code:</p>
<pre><code class="language-cpp">// Gibt Iterator zurück der auf das erste Element mit diesem Schlüssel zeigt 
    aut_it mm_iter = autoren.find(suchbegriff); 
    // Löscht alle Elemente mit dem angegebenen Schlüssel 
    for (sz_type i = 0; i != anzahl; ++i, ++mm_iter) 
        autoren.erase(mm_iter);
</code></pre>
<p>Durch:</p>
<pre><code class="language-cpp">autoren.erase(suchbegriff);
</code></pre>
<p>Kannst du auch hier nachschauen:<br />
<a href="http://www.cplusplus.com/reference/stl/multimap/erase.html" rel="nofollow">http://www.cplusplus.com/reference/stl/multimap/erase.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600886</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Oct 2008 16:50:21 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 16:56:08 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für deine Antwort :). Ich habe auch gleich mal, dank deines Tipps, die entsprechende for-Schleife folgendermaßen umgeschrieben:</p>
<pre><code class="language-cpp">for (sz_type i = 0; i != anzahl; ++i) {
		// Gibt Iterator zurück der auf das erste Element mit diesem Schlüssel zeigt
		aut_it mm_iter = autoren.find(suchbegriff);
		autoren.erase(mm_iter);
	}
</code></pre>
<p>Und siehe da, jetzt funktioniert das Programm einwandfrei. Du hattest also völlig recht. Der Iterator wird durch das Löschen eines Elementes in der Multimap ungültig. Danke nochmal <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1600890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600890</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 18 Oct 2008 16:56:08 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 17:10:13 GMT]]></title><description><![CDATA[<p>Aber dein Code ist immer noch unnötig aufwendig. Du kannst auf die for-Schleife ganz verzichten. Übergib der <code>erase</code> Funktion einfach den Suchbegriff und es werden automatisch alle Einträge mit dem Suchbegriff gelöscht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600893</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Oct 2008 17:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 17:17:01 GMT]]></title><description><![CDATA[<p>Ja, da hast du auch völlig recht und genau so wie du es sagst steht es auch in dem Buch C++ - Primer. Allerdings ging es in der Übungsaufgabe des Buches darum, der erase-Operation nicht direkt einen Schlüssel zu übergeben, sondern die Elemente der Multimap mit der find-Operation und einem Iterator zu löschen. Darum der ganze Aufwand <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1600898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600898</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 18 Oct 2008 17:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator einer Multimap lässt sich nicht inkrementieren on Sat, 18 Oct 2008 17:26:28 GMT]]></title><description><![CDATA[<p>Oh, sorry, ich vergass die Aufgabenstellung. Allerdings finde ich das eine seltsame Aufgabe, dass ist doch extrem bescheuert, so wird man die Elemente sicher nie rauslöschen. Oder womöglich ging es genau darum, dass man erkennt, das ein Iterator ungültig wird. Naja ka ..</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600904</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Oct 2008 17:26:28 GMT</pubDate></item></channel></rss>