<?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[Sortieren mit eigener Vergleichsfunktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen vector&lt;char*&gt; table mit Zeigern auf diverse c-strings. Ich möchte nun diesen vector sortieren entsprechend der lexikografischen Sortierung der c-strings.</p>
<pre><code class="language-cpp">stable_sort(table.begin(),table.end(), myCompare);
</code></pre>
<p>Meine Vergleichsfunktion sieht so aus:</p>
<pre><code class="language-cpp">bool myCompare(char* a, char* b)
{
    return strcmp(a,b) &lt; 0;
}
</code></pre>
<p>Anstatt strcmp würde ich jetzt aber lieber strncmp verwenden, da ich immer nur eine bestimmte mir bekannte Anzahl an chars vergleichen muss. Dafür müsste myCompare noch ein drittes Argument bekommen, aber stable_sort will nur eine Vergleichsfunktion mit 2 Argumenten annehmen.<br />
Eine globale Variable wäre natürlich eine Lösung, um die Anzahl für myCompare bekannt zu machen, aber so will ich das eigentlich nicht lösen... gibt es noch andere Wege??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294962/sortieren-mit-eigener-vergleichsfunktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 15:48:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294962.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Nov 2011 15:44:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sortieren mit eigener Vergleichsfunktion on Fri, 04 Nov 2011 15:45:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen vector&lt;char*&gt; table mit Zeigern auf diverse c-strings. Ich möchte nun diesen vector sortieren entsprechend der lexikografischen Sortierung der c-strings.</p>
<pre><code class="language-cpp">stable_sort(table.begin(),table.end(), myCompare);
</code></pre>
<p>Meine Vergleichsfunktion sieht so aus:</p>
<pre><code class="language-cpp">bool myCompare(char* a, char* b)
{
    return strcmp(a,b) &lt; 0;
}
</code></pre>
<p>Anstatt strcmp würde ich jetzt aber lieber strncmp verwenden, da ich immer nur eine bestimmte mir bekannte Anzahl an chars vergleichen muss. Dafür müsste myCompare noch ein drittes Argument bekommen, aber stable_sort will nur eine Vergleichsfunktion mit 2 Argumenten annehmen.<br />
Eine globale Variable wäre natürlich eine Lösung, um die Anzahl für myCompare bekannt zu machen, aber so will ich das eigentlich nicht lösen... gibt es noch andere Wege??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140281</guid><dc:creator><![CDATA[*Cassiopeia*]]></dc:creator><pubDate>Fri, 04 Nov 2011 15:45:41 GMT</pubDate></item><item><title><![CDATA[Reply to Sortieren mit eigener Vergleichsfunktion on Fri, 04 Nov 2011 15:52:39 GMT]]></title><description><![CDATA[<p>Bau ein Funktionsobjekt. Etwa</p>
<pre><code class="language-cpp">class prefix_compare {
public:
  prefix_compare(std::size_t n) : n_(n) { }

  bool operator()(char const *lhs, char const *rhs) const {
    return strncmp(lhs, rhs, n_) &lt; 0;
  }

private:
  std::size_t n_;
};
</code></pre>
<p>Es gibt in TR1, C++11 oder wahlweise Boost (abhängig davon, wie neu dein Compiler ist) eine Funktionsvorlage bind, die das inline kann:</p>
<pre><code class="language-cpp">stable_sort(table.begin(),table.end(), bind(myCompare, _1, _2, n));
</code></pre>
<p>Wobei bind in den Namensräumen std::tr1, std oder boost liegt, abhängig davon, welche Variante du benutzt. _1 und _2 sind ggf. in std::tr1::placeholders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140286</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 04 Nov 2011 15:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Sortieren mit eigener Vergleichsfunktion on Fri, 04 Nov 2011 15:54:42 GMT]]></title><description><![CDATA[<p>Entschuldigung, jetzt hab ich glatt die Verwendung des Funktionsobjektes vergessen:</p>
<pre><code class="language-cpp">stable_sort(table.begin(),table.end(), prefix_compare(n));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2140288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140288</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 04 Nov 2011 15:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Sortieren mit eigener Vergleichsfunktion on Fri, 04 Nov 2011 16:04:31 GMT]]></title><description><![CDATA[<p>Vielen Dank! Problem gelöst <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/2140290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140290</guid><dc:creator><![CDATA[*Cassiopeia*]]></dc:creator><pubDate>Fri, 04 Nov 2011 16:04:31 GMT</pubDate></item><item><title><![CDATA[Reply to Sortieren mit eigener Vergleichsfunktion on Fri, 04 Nov 2011 17:34:17 GMT]]></title><description><![CDATA[<p>In C++11 geht das übrigens auch richtig hübsch mit Lambda-Closures:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cstddef&gt;
#include &lt;cstring&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;

template&lt;typename T, std::size_t N&gt;
std::size_t array_size(T(&amp;)[N]) { return N; }

int main() {
  char const * data[] = { &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;qux&quot;, &quot;quux&quot;, &quot;xyzzy&quot; };

  std::size_t n = 2;

  std::stable_sort(data,
                   data + array_size(data),
                   [n](char const *lhs, char const *rhs) { // &lt;-- hier
                     return std::strncmp(lhs, rhs, n) &lt; 0;
                   });

  std::copy(data,
            data + array_size(data),
            std::ostream_iterator&lt;char const *&gt;(std::cout, &quot;\n&quot;));
}
</code></pre>
<p>Verfügbar in gcc seit 4.5 (wenn ich das richtig im Kopf habe) mit -std=c++0x und ab MSVC 2010. Welche anderen Compiler das ab welcher Version unterstützen ist mir nicht bekannt; es ist aber davon auszugehen, dass eventuelle Lücken da in absehbarer Zeit geschlossen werden - der neue Standard ist ja jetzt fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140344</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 04 Nov 2011 17:34:17 GMT</pubDate></item></channel></rss>