<?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[Wie compare korrekt implementieren?]]></title><description><![CDATA[<p>Hoi! <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="😉"
    /></p>
<p>Ich schreibe gerade eine Stringklasse (nicht dynamisch), die das Interface von std::basic_string implementiert und logischerweise auch die char_traits verwendet.</p>
<p>Jetzt gibt es eine Funktion im Interface:</p>
<pre><code class="language-cpp">int compare( size_t pos1, size_t n1, const string&amp; str, size_t pos2, size_t n2 ) const;
</code></pre>
<p>Wie darf ich um ganz korrekt zu sein darauf reagieren, wenn beide Strings unterschiedlich lang sind?</p>
<p>Ist ein</p>
<pre><code class="language-cpp">if(n1 != n2)
    return n1 &gt; n2 ? 1 : -1;
</code></pre>
<p>eine korrekte Implementierung nach dem Standard?</p>
<p>Grüße und Danke,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298158/wie-compare-korrekt-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 23:33:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298158.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jan 2012 17:38:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 17:38:50 GMT]]></title><description><![CDATA[<p>Hoi! <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="😉"
    /></p>
<p>Ich schreibe gerade eine Stringklasse (nicht dynamisch), die das Interface von std::basic_string implementiert und logischerweise auch die char_traits verwendet.</p>
<p>Jetzt gibt es eine Funktion im Interface:</p>
<pre><code class="language-cpp">int compare( size_t pos1, size_t n1, const string&amp; str, size_t pos2, size_t n2 ) const;
</code></pre>
<p>Wie darf ich um ganz korrekt zu sein darauf reagieren, wenn beide Strings unterschiedlich lang sind?</p>
<p>Ist ein</p>
<pre><code class="language-cpp">if(n1 != n2)
    return n1 &gt; n2 ? 1 : -1;
</code></pre>
<p>eine korrekte Implementierung nach dem Standard?</p>
<p>Grüße und Danke,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168068</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 14 Jan 2012 17:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 18:27:47 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Wie darf ich um ganz korrekt zu sein darauf reagieren, wenn beide Strings unterschiedlich lang sind?</p>
</blockquote>
<p>Ein Stringvergleich der zuerst nach länge vergleicht will doch keiner.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168082</guid><dc:creator><![CDATA[wwwwwwwww]]></dc:creator><pubDate>Sat, 14 Jan 2012 18:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 21:53:14 GMT]]></title><description><![CDATA[<p>wwwwwwwww schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Wie darf ich um ganz korrekt zu sein darauf reagieren, wenn beide Strings unterschiedlich lang sind?</p>
</blockquote>
<p>Ein Stringvergleich der zuerst nach länge vergleicht will doch keiner.</p>
</blockquote>
<p>Wie bitte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168161</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 14 Jan 2012 21:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 22:26:00 GMT]]></title><description><![CDATA[<p>Wieso willst du auf unterschiedliche Laengen reagieren? Bei einem lexikographischen Vergleich spielt die Laenge keine Rolle (ausser der eine String ist Praefix des anderen).<br />
Oder was fuer einen Vergleich moechtest du implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168168</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 14 Jan 2012 22:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 23:09:31 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/string/string/compare/" rel="nofollow">http://www.cplusplus.com/reference/string/string/compare/</a></p>
<p>Es gibt eine Compare-Funktion die von beiden Strings die Länge nimmt.</p>
<p><a href="http://www.cplusplus.com/reference/string/char_traits/" rel="nofollow">http://www.cplusplus.com/reference/string/char_traits/</a></p>
<p>Die compare()-Funktion der char_traits hingegen nimmt nur 1 Länge an.</p>
<p>Was ist für eine korrekte Implementierung zu tun? Die kürze Länge der Beiden zu nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168181</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 14 Jan 2012 23:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sat, 14 Jan 2012 23:54:14 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Was ist für eine korrekte Implementierung zu tun? Die kürze Länge der Beiden zu nehmen?</p>
</blockquote>
<p>Du kannst nicht einfach die kuerzere nehmen. Dann wird z.B. &quot;xx&quot; vor &quot;abc&quot; aufgefuehrt - ich nehme nicht an, dass du das moechtest:</p>
<p>Ich nehme an du moechtest einen lexikographischen Vergleich - also so wie die Woerter in einem Lexikon aufgefuehrt werden. Dann gilt zum Beispiel:<br />
- &quot;abc&quot; &lt; &quot;xx&quot;<br />
- &quot;Deadlock&quot; &lt; &quot;DeadlockStarvation&quot;<br />
- &quot;D&quot; &gt; &quot;C&quot;<br />
(Wie man Woerter bzw. Strings halt normalerweise vergleicht zum sortieren).</p>
<p>Ich habe kurz in C++ etwas Code geschrieben, der zwei Strings s1 und s2 vergleicht. Ich habe ihn nicht ausfuehrlich getestet und wahrscheinlich kann man das noch etwas schoener machen. Wenn s1 &gt; s2, dann wird -1 zurueckgegeben. Wenn s1 = s2, dann wird 0 zurueckgegeben. 1 sonst.</p>
<pre><code class="language-cpp">int compare(string &amp; s1, string &amp; s2)
{
	size_t smaller_max_index = std::min( s1.size(), s2.size() );

	for ( size_t i = 0; i &lt; smaller_max_index; i++ )
	{
		if ( s1[i] &lt; s2[i] )
			return 1;
		if ( s1[i] &gt; s2[i] )
			return -1;
	}

	if ( s1.size() == s2.size() )
		return 0;
	else if ( s1.size() &lt; s2.size() )
		return 1;
	else
		return -1;
}
</code></pre>
<p>Der Algorithmus speichert zuerst die Laenge des kuerzeren Strings.<br />
Dann werden die Strings zeichenweise verglichen an den Positionen i, fuer 0 &lt;= i &lt;= smaller_max_index. Falls s1[i] &gt; s2[i] oder s1[i] &lt; s2[i] wird entsprechend 1 oder -1 zurueckgegeben.</p>
<p>Wenn die einzelnen Zeichen fuer die Positionen 0 &lt;= i &lt;= smaller_max_index alle gleich sind, dann wird die Laenge verglichen. Ist die Laenge gleich, muessen auch die Strings gleich sein. Ansonsten wird entsprechend -1 oder 1 zurueckgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168192</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 14 Jan 2012 23:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 00:40:06 GMT]]></title><description><![CDATA[<p>Zur Info:<br />
Man muss nicht 1 und -1 returnen sondern groesser 0 bzw. kleiner 0.</p>
<p>Das bedeutet statt</p>
<pre><code class="language-cpp">if ( s1.size() == s2.size() )
        return 0;
    else if ( s1.size() &lt; s2.size() )
        return 1;
    else
        return -1;
</code></pre>
<p>kann man einfach</p>
<pre><code class="language-cpp">return s1.size()-s2.size();
</code></pre>
<p>Selbes gilt auch fuer die Schleife wo man einfach</p>
<pre><code class="language-cpp">if(s1[i] != s2[i])
   return s1[i]-s2[i];
</code></pre>
<p>schreiben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168195</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 15 Jan 2012 00:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 02:20:57 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>kann man einfach</p>
<pre><code class="language-cpp">return s1.size()-s2.size();
</code></pre>
</blockquote>
<p>Auf unsigned/signed bitte aufpassen. Das hier erzeugt ggf undefiniertes Verhalten.</p>
<p>std::string::compare schreibt eine lexikalische Sortierung vor. Wenn Du (Ethon) hier bei unterschiedlicher Länge die Zeichen gar nicht mehr anfasst, kann das nicht funktionieren, da bei einer lexikalischen Orndung<br />
&quot;abc&quot; &lt; &quot;xx&quot;<br />
&quot;ab&quot; &lt; &quot;xxx&quot;<br />
gilt. Wie man sieht, ist in den 2 Fällen die Länge gar nicht ausschlaggebend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168203</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 15 Jan 2012 02:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 07:02:52 GMT]]></title><description><![CDATA[<p>std::lexicographical_compare</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168212</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 15 Jan 2012 07:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 07:38:32 GMT]]></title><description><![CDATA[<p>Laut dem Standard (siehe hier: <a href="http://www.csci.csusb.edu/dick/c++std/cd2/lib-strings.html" rel="nofollow">http://www.csci.csusb.edu/dick/c++std/cd2/lib-strings.html</a>) muss sich das compare von char_traits wie folgt verhalten:</p>
<blockquote>
<p>X::compare(p,q,n)</p>
<p>yields: 0 if for each i in [0,n) X::eq(p[i],q[i]) is true;<br />
else, a negative value if, for some j in [0,n), X::lt(p[j],q[j]) is true and for each i in [0,j) X::eq(p[i],q[i]) is true;<br />
else a positive value.</p>
</blockquote>
<p>und compare von den Strings:</p>
<pre><code>int compare(
  size_type pos1, size_type n1,
  const basic_string&lt;charT,traits,Allocator&gt;&amp; str,
  size_type pos2, size_type n2
) const;

Returns:
basic_string&lt;charT,traits,Allocator&gt;(*this,pos1,n1).compare(
basic_string&lt;charT,traits,Allocator&gt;(str,pos2,n2)) .
</code></pre>
<p>und alle compare funktionen bilden am Ende auf eine Funktion ab, die sich wie folgt verhält:</p>
<blockquote>
<p>int compare(const basic_string&lt;charT,traits,Allocator&gt;&amp; str)</p>
<p>Effects:<br />
Determines the effective length rlen of the strings to compare as<br />
the smallest of size() and str.size(). The function then compares<br />
the two strings by calling traits::compare(data(), str.data(),rlen).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2168213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168213</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 15 Jan 2012 07:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 07:50:01 GMT]]></title><description><![CDATA[<p>Lernt man nicht schon in der ersten Klasse, wie man etwas alphabetisch sortiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168214</guid><dc:creator><![CDATA[ehrlich]]></dc:creator><pubDate>Sun, 15 Jan 2012 07:50:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 09:32:19 GMT]]></title><description><![CDATA[<p>ehrlich schrieb:</p>
<blockquote>
<p>Lernt man nicht schon in der ersten Klasse, wie man etwas alphabetisch sortiert?</p>
</blockquote>
<p>Lernt man nicht schon in der ersten Klasse, dass man einfach mal die Fresse halten sollte, wenn man nichts zu melden hat? Diese ganzen Dummschwätzer-unreg Kommentare gehen mir tierisch auf den Sack. Ich glaube ich muss mich bald mal registrieren, ansonsten halten die Leute mich noch für genauso dämlich. Und für den nächsten Volldeppen: Ich bin mir durchaus bewusst, dass ich nichts zum Thema beitrage, aber das musste einfach mal gesagt werden. Unglaublich ist das. Keine Ahnung von nichts, aber einfach mal dazwischenbrabbeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168239</guid><dc:creator><![CDATA[noch ehrlicher]]></dc:creator><pubDate>Sun, 15 Jan 2012 09:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 10:42:08 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>std::lexicographical_compare</p>
</blockquote>
<p>Wäre leider nicht korrekt, da man das Verhalten, das die Traits definieren, über den Haufen wirft.</p>
<p>Okay, danke für die Antworten. Dann gehe ich jetzt davon aus, dass</p>
<pre><code class="language-cpp">template&lt;class Allocator&gt;
        int compare(size_type pos1, size_type n1,
            std::basic_string&lt;Char, Traits, Allocator&gt; const&amp; str,
            size_type pos2, size_type n2 ) const
        {
            return Traits::compare(data() + pos1, str.data() + pos2,
                std::min(n1, n2);
        }
</code></pre>
<p>ganz im Sinne des Standards ist. <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 />
Am Besten such ich mir Tests zu std::string, wirds sicher welche bei libstdc++ oder STLport oä. geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168264</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 15 Jan 2012 10:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie compare korrekt implementieren? on Sun, 15 Jan 2012 11:09:27 GMT]]></title><description><![CDATA[<p>noch ehrlicher schrieb:</p>
<blockquote>
<p>ehrlich schrieb:</p>
<blockquote>
<p>Lernt man nicht schon in der ersten Klasse, wie man etwas alphabetisch sortiert?</p>
</blockquote>
<p>Lernt man nicht schon in der ersten Klasse, dass man einfach mal die Fresse halten sollte, wenn man nichts zu melden hat? Diese ganzen Dummschwätzer-unreg Kommentare gehen mir tierisch auf den Sack. Ich glaube ich muss mich bald mal registrieren, ansonsten halten die Leute mich noch für genauso dämlich. Und für den nächsten Volldeppen: Ich bin mir durchaus bewusst, dass ich nichts zum Thema beitrage, aber das musste einfach mal gesagt werden. Unglaublich ist das. Keine Ahnung von nichts, aber einfach mal dazwischenbrabbeln.</p>
</blockquote>
<p>Ich war sogar der erste der hier geantwortet hat, aber das anscheinend immer noch zu kompliziert und hat nochmal eine Seite Erklärungen gebraucht, da fragt man sich doch wie aufwendig man so simple Sachen erklären muss. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168275</guid><dc:creator><![CDATA[ehrlich]]></dc:creator><pubDate>Sun, 15 Jan 2012 11:09:27 GMT</pubDate></item></channel></rss>