<?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[Maps mit Structs]]></title><description><![CDATA[<p>Liebe Alle,</p>
<p>Ich habe ein kleines Problem mit einer map mit eigenem struct.</p>
<p>Das Struct sieht folgendermaßen aus.</p>
<pre><code class="language-cpp">struct State{
	list&lt;EclipseTerm&gt; trueL;
	list&lt;EclipseTerm&gt; notTrueL;		

	bool operator&lt;(const State&amp; A) const
		{ return trueL.size()&lt;A.trueL.size(); }

	bool operator==(const State&amp; A) const
		{ if((trueL == A.trueL) &amp;&amp; (notTrueL == A.notTrueL) )
			{return true; }
		else
			{return false; }

			}		
	};
</code></pre>
<p>nun will ich solche States als Key einer Map haben, erlebe aber immer wieder, dass ein Eintrag, der an sich noch gar nicht existiert angeblich in der Map sei.</p>
<p>Hier ist die Schleife, in der ich Versuche zu mappen.</p>
<pre><code class="language-cpp">list&lt;Terminal&gt;::const_iterator terminal_it;
	list&lt;Goal&gt;::const_iterator goal_it;	

	map&lt;State,int&gt; finals;

	for(terminal_it = terminals.begin(); terminal_it != terminals.end(); terminal_it++)
	{

		for(goal_it = goals.begin(); goal_it != goals.end(); goal_it++)
		{
			Terminal tempTerminal = *terminal_it;
			Goal tempGoal = *goal_it;

			State tempState = State();
			// merge beide true listen
			tempGoal.trueL.merge(tempTerminal.trueL);
			tempState.trueL = tempGoal.trueL;

			// merge beide not true listen
			tempGoal.notTrueL.merge(tempTerminal.notTrueL);
			tempState.notTrueL = tempGoal.notTrueL;		

                        // Hier lasse ich mir den State ausgeben, der angeblich schon in der Map drin sein soll. Es ist definitiv nicht der gleiche  
			if(finals.find(tempState) != finals.end()){
				State nochmehrtemp = (*finals.find(tempState)).first;
				cout &lt;&lt; &quot;In der Map &quot; &lt;&lt; nochmehrtemp.trueL &lt;&lt; &quot; &quot; &lt;&lt; nochmehrtemp.notTrueL  &lt;&lt; endl;
				cout &lt;&lt; &quot;mein Vergleich &quot; &lt;&lt; tempState.trueL &lt;&lt; &quot; &quot; &lt;&lt; tempState.notTrueL  &lt;&lt; endl;				
			}

                        // Einfügen in Map
			finals[tempState] = tempGoal.points;	

			State temp = (*finals.begin()).first;
                        // Hier ein Test, der den == Operator überprüft. Funktioniert einwandfrei
			cout &lt;&lt; &quot;gleichheit &quot; &lt;&lt; (temp == tempState) &lt;&lt; endl;

		}

	}
</code></pre>
<p>Meine Einträge werden ab dem zweiten immer wieder überschrieben. Es scheint, als würde nur mit der zweiten Liste verglichen werden, statt mit beiden, aber ich verstehe nicht warum.</p>
<p>Wer kann helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270014/maps-mit-structs</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 20:02:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270014.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jul 2010 13:01:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Maps mit Structs on Mon, 05 Jul 2010 13:01:03 GMT]]></title><description><![CDATA[<p>Liebe Alle,</p>
<p>Ich habe ein kleines Problem mit einer map mit eigenem struct.</p>
<p>Das Struct sieht folgendermaßen aus.</p>
<pre><code class="language-cpp">struct State{
	list&lt;EclipseTerm&gt; trueL;
	list&lt;EclipseTerm&gt; notTrueL;		

	bool operator&lt;(const State&amp; A) const
		{ return trueL.size()&lt;A.trueL.size(); }

	bool operator==(const State&amp; A) const
		{ if((trueL == A.trueL) &amp;&amp; (notTrueL == A.notTrueL) )
			{return true; }
		else
			{return false; }

			}		
	};
</code></pre>
<p>nun will ich solche States als Key einer Map haben, erlebe aber immer wieder, dass ein Eintrag, der an sich noch gar nicht existiert angeblich in der Map sei.</p>
<p>Hier ist die Schleife, in der ich Versuche zu mappen.</p>
<pre><code class="language-cpp">list&lt;Terminal&gt;::const_iterator terminal_it;
	list&lt;Goal&gt;::const_iterator goal_it;	

	map&lt;State,int&gt; finals;

	for(terminal_it = terminals.begin(); terminal_it != terminals.end(); terminal_it++)
	{

		for(goal_it = goals.begin(); goal_it != goals.end(); goal_it++)
		{
			Terminal tempTerminal = *terminal_it;
			Goal tempGoal = *goal_it;

			State tempState = State();
			// merge beide true listen
			tempGoal.trueL.merge(tempTerminal.trueL);
			tempState.trueL = tempGoal.trueL;

			// merge beide not true listen
			tempGoal.notTrueL.merge(tempTerminal.notTrueL);
			tempState.notTrueL = tempGoal.notTrueL;		

                        // Hier lasse ich mir den State ausgeben, der angeblich schon in der Map drin sein soll. Es ist definitiv nicht der gleiche  
			if(finals.find(tempState) != finals.end()){
				State nochmehrtemp = (*finals.find(tempState)).first;
				cout &lt;&lt; &quot;In der Map &quot; &lt;&lt; nochmehrtemp.trueL &lt;&lt; &quot; &quot; &lt;&lt; nochmehrtemp.notTrueL  &lt;&lt; endl;
				cout &lt;&lt; &quot;mein Vergleich &quot; &lt;&lt; tempState.trueL &lt;&lt; &quot; &quot; &lt;&lt; tempState.notTrueL  &lt;&lt; endl;				
			}

                        // Einfügen in Map
			finals[tempState] = tempGoal.points;	

			State temp = (*finals.begin()).first;
                        // Hier ein Test, der den == Operator überprüft. Funktioniert einwandfrei
			cout &lt;&lt; &quot;gleichheit &quot; &lt;&lt; (temp == tempState) &lt;&lt; endl;

		}

	}
</code></pre>
<p>Meine Einträge werden ab dem zweiten immer wieder überschrieben. Es scheint, als würde nur mit der zweiten Liste verglichen werden, statt mit beiden, aber ich verstehe nicht warum.</p>
<p>Wer kann helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921626</guid><dc:creator><![CDATA[Anna++ 0]]></dc:creator><pubDate>Mon, 05 Jul 2010 13:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to Maps mit Structs on Mon, 05 Jul 2010 13:12:19 GMT]]></title><description><![CDATA[<p><code>std::map</code> verwendet zum Vergleichen lediglich den op&lt;, nicht den op==. 2 Objekte a und b gelten dann als gleich, wenn gilt <code>!(a &lt; b) &amp;&amp; !(b &lt; a)</code> .<br />
In deinem Fall sind deshalb für die map 2 State-Objekte dann gleich, wenn ihre trueL-Listen die gleiche Länge haben.<br />
Die Lösung besteht hier meines Wissens nur in einem verbesserten op&lt;, zum Beispiel mit einer lexiographischen Sortierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921632</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 05 Jul 2010 13:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Maps mit Structs on Mon, 05 Jul 2010 13:10:45 GMT]]></title><description><![CDATA[<p>Danke! Werds veruschen. (Klingt sehr logisch -.-)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921633</guid><dc:creator><![CDATA[Anna++ 0]]></dc:creator><pubDate>Mon, 05 Jul 2010 13:10:45 GMT</pubDate></item><item><title><![CDATA[Reply to Maps mit Structs on Mon, 05 Jul 2010 13:12:24 GMT]]></title><description><![CDATA[<p>Du hast einen op&lt; und einen op== implementiert, dass lässt vermuten dass du von find() erwartest, dass op== benutzt wird. Das ist aber NICHT der Fall.<br />
std::map benutzt nur einen Comparator, im default-Fall std::less, was wiederum den operator&lt; benutzt.<br />
Mit diesem einen Comparator wird sowohl die Ordnung in der map hergestellt als auch sämtliche Key-Vergleiche durchgeführt. Dabei ist im Sinne der map a == b, wenn !(a &lt; b) &amp;&amp; !(b &lt; a).<br />
Für deine map sind also zwei Elemente gleich, wenn die Länge der ersten Liste bei beiden gleich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921636</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Jul 2010 13:12:24 GMT</pubDate></item></channel></rss>