<?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[2 schichtige Multimap]]></title><description><![CDATA[<p>Ich habe einige Fragen zu Multimaps.</p>
<p>Folgendes:</p>
<pre><code class="language-cpp">typedef std::multimap&lt;std::string, std::multimap&lt;std::string, std::string&gt; &gt; phoneEntry;
typedef std::pair&lt;std::string, std::multimap &lt;std::string, std::string&gt; &gt;	mainPair;
typedef std::pair&lt;std::string, std::string&gt;	secPair;

phoneEntry book;
</code></pre>
<p>Nun möchte ich in dieses Konglomerat Werte einfügen:</p>
<pre><code class="language-cpp">book.insert (mainPair (name, secPair (ident, value) ));
</code></pre>
<p>dabei haben ich dann folgende Fehlermeldung:</p>
<blockquote>
<p>error: no matching function for call to 'std::pair&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;,<br />
std::allocator&lt;char&gt; &gt;, std::multimap&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::<br />
allocator&lt;char&gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, std::<br />
less&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::<br />
allocator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;</p>
<blockquote>
<p>, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt; &gt; &gt;::pair(std::<br />
basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;, secPair)'</p>
</blockquote>
</blockquote>
<p>Stehe da ein wenig im Wald.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183080/2-schichtige-multimap</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 06:23:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183080.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Jun 2007 11:08:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2 schichtige Multimap on Fri, 01 Jun 2007 11:08:44 GMT]]></title><description><![CDATA[<p>Ich habe einige Fragen zu Multimaps.</p>
<p>Folgendes:</p>
<pre><code class="language-cpp">typedef std::multimap&lt;std::string, std::multimap&lt;std::string, std::string&gt; &gt; phoneEntry;
typedef std::pair&lt;std::string, std::multimap &lt;std::string, std::string&gt; &gt;	mainPair;
typedef std::pair&lt;std::string, std::string&gt;	secPair;

phoneEntry book;
</code></pre>
<p>Nun möchte ich in dieses Konglomerat Werte einfügen:</p>
<pre><code class="language-cpp">book.insert (mainPair (name, secPair (ident, value) ));
</code></pre>
<p>dabei haben ich dann folgende Fehlermeldung:</p>
<blockquote>
<p>error: no matching function for call to 'std::pair&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;,<br />
std::allocator&lt;char&gt; &gt;, std::multimap&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::<br />
allocator&lt;char&gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, std::<br />
less&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::<br />
allocator&lt;std::pair&lt;const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;</p>
<blockquote>
<p>, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt; &gt; &gt;::pair(std::<br />
basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;, secPair)'</p>
</blockquote>
</blockquote>
<p>Stehe da ein wenig im Wald.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1296505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1296505</guid><dc:creator><![CDATA[Dravian]]></dc:creator><pubDate>Fri, 01 Jun 2007 11:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Fri, 01 Jun 2007 12:16:34 GMT]]></title><description><![CDATA[<p>Suchst du das?</p>
<pre><code class="language-cpp">typedef std::multimap&lt;std::string, std::multimap&lt;std::string, std::string&gt; &gt; PhoneEntryMM;
typedef std::multimap&lt;std::string, std::string&gt; IdentValueMM;

PhoneEntryMM book;

IdentValueMM *temp = new IdentValueMM;
temp-&gt;insert(IdentValueMM::value_type(&quot;Ident&quot;,&quot;Value&quot;));
book.insert(PhoneEntryMM::value_type(&quot;Name&quot;, *temp));
delete temp;
</code></pre>
<p>Achtung dein 2. Argument ist wieder eine Multimap, nicht einfach 2 Strings;<br />
wolltest du evtl. das machen?:<br />
typedef std::multimap&lt;std::string, std::pair&lt;std::string, std::string&gt; &gt; PhoneEntryMM;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1296565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1296565</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Fri, 01 Jun 2007 12:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Fri, 01 Jun 2007 12:41:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef std::pair&lt;std::string, std::multimap &lt;std::string, std::string&gt; &gt;    mainPair;
</code></pre>
<p>OK, mainpair besteht also aus einem String und einer weiteren Map.</p>
<p>Dann</p>
<pre><code class="language-cpp">mainPair (name, secPair (ident, value) )
</code></pre>
<p>Verlangt wird ein Paar aus string und map und gegeben wird ein paar aus String und secPair. Ist secPair denn eine Map?<br />
Mal nachsehen</p>
<pre><code class="language-cpp">typedef std::pair&lt;std::string, std::string&gt;    secPair;
</code></pre>
<p>Nö, ist es nicht.</p>
<p>Also müssen wir secPair anpassen:</p>
<pre><code class="language-cpp">[cpp]typedef std::pair&lt;std::string, std::multimap &lt;std::string, std::string&gt; &gt;    secPair;
</code></pre>
<p>[/cpp]</p>
<p>So. Jetzt passts. Nur brauchen wir aber auch noch eine map, mit der wir das Pair erzeugen können.</p>
<pre><code class="language-cpp">std::map&lt;std::string, std::string&gt; dummyMap;

book.insert (mainPair (name, secPair (ident, dummyMap) ));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1296598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1296598</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Fri, 01 Jun 2007 12:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Sat, 02 Jun 2007 18:28:24 GMT]]></title><description><![CDATA[<p>Meine nächste Frage wäre, wie ich auf die interne Multimap zugreifen kann.<br />
Checker&amp;Murckser 's Lösung funktioniert.</p>
<pre><code class="language-cpp">void phoneBook::insert (std::string* Array) {
	bookIterand pos = book.find(Array[0]);

	if (pos == book.end()) {
		subEntry* temp = new subEntry();

		temp-&gt;insert(subValue(Array[1], Array[2]));

		this-&gt;book.insert(bookValue(Array[0], *temp));
	} else if (pos.find(Array[1]) == this-&gt;book.end()) {//Hier ist ein Fehler
		//pos ist ein Iterator
	}
}
</code></pre>
<p>Die Frage ist, wenn pos ein Iterator auf das gefundene Element ist, und ein Iterator Ähnlichkeit mit einem Pointer hat, wie kann man dann über diesen auf den Inhalt zugreifen ?</p>
<p>Danke für die Hilfe.</p>
<p>MfG<br />
Dravian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297306</guid><dc:creator><![CDATA[Dravian]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Sat, 02 Jun 2007 18:38:07 GMT]]></title><description><![CDATA[<p>Wo ist das delete passend zum new subEntry. Und wieso erzeugst du das Ding überhaupt dynamisch, wenn du es danach eh nur kopierst und wegwirfst?</p>
<p>Ich bin zwar gerade ncht sicher, wie jetzt dein book aussieht, vermute aber mal, du meinst soetwas, wie:</p>
<pre><code class="language-cpp">void phoneBook::insert (std::string* Array) { 
    bookIterand pos = book.find(Array[0]); 

    if (pos == book.end()) { 
        subEntry temp; 

        temp.insert(subValue(Array[1], Array[2])); 

        book.insert(bookValue(Array[0], temp)); 

    } else if (pos-&gt;second.find(Array[1]) == this-&gt;book.end()) {
    } 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1297314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297314</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Sat, 02 Jun 2007 19:32:38 GMT]]></title><description><![CDATA[<p>Dravian schrieb:</p>
<blockquote>
<p>Meine nächste Frage wäre, wie ich auf die interne Multimap zugreifen kann.<br />
Checker&amp;Murckser 's Lösung funktioniert.</p>
<pre><code class="language-cpp">void phoneBook::insert (std::string* Array) {
	bookIterand pos = book.find(Array[0]);
	
	if (pos == book.end()) {
		subEntry* temp = new subEntry();
		
		temp-&gt;insert(subValue(Array[1], Array[2]));
		
		this-&gt;book.insert(bookValue(Array[0], *temp));
	} else if (pos.find(Array[1]) == this-&gt;book.end()) {//Hier ist ein Fehler
		//pos ist ein Iterator
	}
}
</code></pre>
<p>Die Frage ist, wenn pos ein Iterator auf das gefundene Element ist, und ein Iterator Ähnlichkeit mit einem Pointer hat, wie kann man dann über diesen auf den Inhalt zugreifen ?</p>
<p>Danke für die Hilfe.</p>
<p>MfG<br />
Dravian</p>
</blockquote>
<p>ganz normal über</p>
<p>if( *pos == /*Inhalt*/ )</p>
<p>BTW:<br />
Willst du wissen ob &quot;pos&quot; an der Stelle book.end() steht, oder ob pos auf den gleichen Inhalt, wie book.end() verweist?</p>
<p>Helium schrieb:</p>
<blockquote>
<p>Wo ist das delete passend zum new subEntry. Und wieso erzeugst du das Ding überhaupt dynamisch, wenn du es danach eh nur kopierst und wegwirfst?</p>
</blockquote>
<p>das mit dem new (und delete übrigens^^) hatte ich oben in meiner Lösung gemacht ...<br />
weiß gar nicht mehr wieso, aber mit ner Stackvariable gehts natürlich n bissel einfacher -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297361</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sat, 02 Jun 2007 19:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Sun, 03 Jun 2007 09:03:47 GMT]]></title><description><![CDATA[<p>Nur zum Verständnis.<br />
pos ist nacher ein Zeiger auf den Inhalt, aber ist es nun der Zeiger auf das Haupt Multimap oder auf das innere Multimap ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297362</guid><dc:creator><![CDATA[Dravian]]></dc:creator><pubDate>Sun, 03 Jun 2007 09:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Sun, 03 Jun 2007 13:31:22 GMT]]></title><description><![CDATA[<p>Auch in den Hilfen die ich gefunden habe, finde ich keine Lösung für das problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297740</guid><dc:creator><![CDATA[Dravian]]></dc:creator><pubDate>Sun, 03 Jun 2007 13:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Mon, 04 Jun 2007 17:41:58 GMT]]></title><description><![CDATA[<p>Solange wir nciht wissen, wie deine Struktur jetzt letztendlich aussieht können wir auch nicht helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298771</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Mon, 04 Jun 2007 17:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Mon, 04 Jun 2007 19:06:42 GMT]]></title><description><![CDATA[<p>Dravian schrieb:</p>
<blockquote>
<p>Nur zum Verständnis.<br />
pos ist nacher ein Zeiger auf den Inhalt, aber ist es nun der Zeiger auf das Haupt Multimap oder auf das innere Multimap ?</p>
</blockquote>
<p>Wenn es vom Typ bookIterand ist, was wird es dann wohl sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /><br />
Eine Stelle innerhalb der Hauptmultimap würde ich doch schwer vermuten-.-</p>
<p>/EDIT:<br />
Ich empfehle an dieser Stelle einfach mal Scott Meyers &quot;Effective STL&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298830</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Mon, 04 Jun 2007 19:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Mon, 04 Jun 2007 20:40:00 GMT]]></title><description><![CDATA[<p>nun bis jetzt siehts so aus:</p>
<pre><code class="language-cpp">typedef std::multimap&lt;std::string,
			std::multimap&lt;std::string, std::string&gt; &gt;	bookType;
typedef std::multimap&lt;std::string, std::string&gt;			subEntry;
typedef bookType::iterator								bookIterand;
typedef subEntry::iterator								subIterand;
typedef bookType::value_type							bookValue;
typedef subEntry::value_type							subValue;

class phoneBook {
	protected:
		bookType book;

	public:
		// Konstruktor &amp; Destruktor
						phoneBook		();
		virtual			~phoneBook		();

		void 			insert			(std::string* Array);

		std::string		getNumber		(std::string searchValue);
		std::string		getName			(std::string searchValue);
		std::string		get				(std::string searchValue, std::string resultType);

		void 			deleteEntry		(std::string* searchValue);
};

// Implementierung

phoneBook::phoneBook () {
}

phoneBook::~phoneBook() {
}

std::string phoneBook::getNumber (std::string searchvalue) {
	std::ostringstream os;

	bookIterand pos = this-&gt;book.find(searchvalue);

	if (pos == this-&gt;book.end())
		os &lt;&lt; &quot;Kein Eintrag zu &quot; &lt;&lt; searchvalue &lt;&lt; &quot; gefunden.\n&quot;;
	else {

		//for (subIterand i = *pos; i &lt;= ; i++) {
		//}
		// Hier hab ich halt das gleiche Problem mit den Iteratoren,
		// da ich hier die interne Multimap durchlaufen will und zum
		// Beispiel alle Nummern ausgeben.
	}
	return os.str();
}

void phoneBook::insert (std::string name, std::string valueIdent, std::string value) {
	bookIterand pos = this-&gt;book.find(name);

	if (pos == this-&gt;book.end()) {
		subEntry temp ;

		temp.insert(subValue(valueIdent, value));
		this-&gt;book.insert(bookValue(name, temp));
	} else if (pos.operator -&gt;().find(valueIdent) == this-&gt;book.end()) {
		// oder
		// pos-&gt;second.find(valueIdent) == this-&gt;book.second.end()) {
		// beim oberen sucht er ja an der Position nach dem Key der
		// durch valueIdent angegeben ist, da der Key doch der von der
		// Hauptmap ist, kann das nicht funktionieren. Oder denk ich
		// mal wieder zu kompliziert ?
	}
}
</code></pre>
<p>das Problem ist halt, das ich die Meldung das es kein second oder first gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298907</guid><dc:creator><![CDATA[Dravian]]></dc:creator><pubDate>Mon, 04 Jun 2007 20:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Mon, 04 Jun 2007 21:02:18 GMT]]></title><description><![CDATA[<p>Dravian schrieb:</p>
<blockquote>
<p>das Problem ist halt, das ich die Meldung das es kein second oder first gibt.</p>
</blockquote>
<p>Echt? also meine Compiler sagen da was anders:</p>
<p>VC schrieb:</p>
<blockquote>
<p>error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::_Tree&lt;_Traits&gt;::iterator' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
</blockquote>
<p>gcc schrieb:</p>
<blockquote>
<p>no match for 'operator==' in '(((std::multimap&lt;std::string, std::string, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;const std::string, std::string&gt; &gt; &gt;<em>)(&amp;pos)-&gt;std::_Rb_tree_iterator&lt;_Tp&gt;::operator-&gt; [with _Tp = std::pair&lt;const std::string, std::multimap&lt;std::string, std::string, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;const std::string, std::string&gt; &gt; &gt; &gt;]()) + 4u)-&gt;std::multimap&lt;_Key, _Tp, _Compare, _Alloc&gt;::find [with _Key = std::string, _Tp = std::string, _Compare = std::less<a href="std::string" rel="nofollow">std::string</a>, _Alloc = std::allocator&lt;std::pair&lt;const std::string, std::string&gt; &gt;](((const std::string&amp;)((const std::string</em>)(&amp;valueIdent)))) == (((bookType*)((phoneBook*)this)) + 4u)-&gt;std::multimap&lt;_Key, _Tp, _Compare, _Alloc&gt;::end [with _Key = std::string, _Tp = std::multimap&lt;std::string, std::string, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;const std::string, std::string&gt; &gt; &gt;, _Compare = std::less<a href="std::string" rel="nofollow">std::string</a>, _Alloc = std::allocator&lt;std::pair&lt;const std::string, std::multimap&lt;std::string, std::string, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;const std::string, std::string&gt; &gt; &gt; &gt; &gt;]()'</p>
</blockquote>
<p>Also beide sagen, dass kein passender operator == gefunden wurde, was mir im Moment noch nicht so ganz einleuchtet.</p>
<p>Interessanterweise passiert Beim Comeau-Online-Compiler folgendes:</p>
<blockquote>
<p>In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).<br />
Compiled with C++0x extensions enabled.</p>
</blockquote>
<p>Im Moment habe ich aber auch keine Lust darüber nachzudenken. Du kannst ja trotzdem mal die Meldung deines Compilers posten (der ja angeblich second nicht finden kann, was üverhaupt keinen sinn macht).</p>
<p>BTW. irgendwie musste ich erstmal eine passende &quot;insert&quot;-Deklaration in deine Klasse einfügen, da &quot;void insert (std::string* Array); &quot; nicht wirlich zu &quot;void phoneBook::insert (std::string name, std::string valueIdent, std::string value)&quot; passt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1298924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1298924</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Mon, 04 Jun 2007 21:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to 2 schichtige Multimap on Tue, 05 Jun 2007 12:17:13 GMT]]></title><description><![CDATA[<p>Ok, habs gerade nochmal angeguckt und direkt geschnallt. ISt auch logisch:</p>
<p>Bei deinem</p>
<pre><code class="language-cpp">pos-&gt;second.find(valueIdent) == this-&gt;book.end()
</code></pre>
<p>Passen die Iteratoren tatsächlich nicht zusammen. Was du willst ist:</p>
<pre><code class="language-cpp">pos-&gt;second.find(valueIdent) == pos-&gt;second.end()
</code></pre>
<p>Dann sollte es gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299244</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Tue, 05 Jun 2007 12:17:13 GMT</pubDate></item></channel></rss>