<?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[binary_search() mit eigener Vergleichsroutine]]></title><description><![CDATA[<p>Hallo <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 habe einen vector&lt;string&gt; und möchte diesen mittels binary_search() und einer eingenen Vergleichsroutine durchsuchen lassen, also eigentlich sollen bei den Strings jeweils nur die ersten 32 Zeichen verglichen werden.</p>
<p>Ich weiß, dass ich es so aufrufen muss:</p>
<pre><code>binary_search(svec.begin(), svec.end(), str, MeineVergleichsRoutine);
</code></pre>
<p>Nur leider weiß ich nicht, wie &quot;MeineVergleichsRoutine&quot; genau aussehen muss und wie ich diese am besten implementiere könnte.</p>
<p>Ich danke schonmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226470/binary_search-mit-eigener-vergleichsroutine</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 19:22:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226470.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Nov 2008 17:02:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 17:02:42 GMT]]></title><description><![CDATA[<p>Hallo <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 habe einen vector&lt;string&gt; und möchte diesen mittels binary_search() und einer eingenen Vergleichsroutine durchsuchen lassen, also eigentlich sollen bei den Strings jeweils nur die ersten 32 Zeichen verglichen werden.</p>
<p>Ich weiß, dass ich es so aufrufen muss:</p>
<pre><code>binary_search(svec.begin(), svec.end(), str, MeineVergleichsRoutine);
</code></pre>
<p>Nur leider weiß ich nicht, wie &quot;MeineVergleichsRoutine&quot; genau aussehen muss und wie ich diese am besten implementiere könnte.</p>
<p>Ich danke schonmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608644</guid><dc:creator><![CDATA[mettis]]></dc:creator><pubDate>Sat, 01 Nov 2008 17:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 17:17:55 GMT]]></title><description><![CDATA[<p>Du hast dazu zwei Möglichkeiten zur Verfügung:</p>
<p><strong>1. Funktionszeiger</strong><br />
Du definierst eine Funktion mit zwei Parametern, die zwei Elemente vergleicht.</p>
<pre><code class="language-cpp">bool CompareFunction(const std::string&amp; Left, const std::string&amp; Right)
{
    return Left.size() &lt; Right.size(); // halt dein Kriterium
}
</code></pre>
<p>Du rufst <code>binary_search()</code> mit einer der folgenden Zeilen auf:</p>
<pre><code class="language-cpp">std::binary_search(svec.begin(), svec.end(), str, CompareFunction);
std::binary_search(svec.begin(), svec.end(), str, &amp;CompareFunction);
</code></pre>
<p><strong>2. Funktor</strong><br />
Du schreibst eine Klasse, die den <code>operator()</code> überlädt. Damit bist du generell flexibler, da du auch noch Argumente an den Konstruktor übergeben kannst. Man nennt Objekte dieser Klasse Funktoren oder Funktionsobjekte, da sie sich wie Funktionen verhalten.</p>
<pre><code class="language-cpp">struct CompareFunctor
{
    // Überladener ()-Operator; ist gleich wie obige Funktion definiert
    bool operator() (const std::string&amp; Left, const std::string&amp; Right);
};
</code></pre>
<p>Der Aufruf sieht dann so aus:</p>
<pre><code class="language-cpp">std::binary_search(svec.begin(), svec.end(), str, CompareFunctor());
</code></pre>
<p>Wie gesagt kann man in der Klasse noch Membervariablen haben, die für zusätzliche Spezifizierung des Kriteriums vorhanden sind. Beispielsweise kann man einen <code>CompareFunctor</code> -Konstruktor mit einem <code>int</code> als Parameter definieren und diesen <code>int</code> im <code>operator()</code> verwenden. Dann würde der Aufruf folgendermassen aussehen:</p>
<pre><code class="language-cpp">std::binary_search(svec.begin(), svec.end(), str, CompareFunctor(42));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1608653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608653</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Nov 2008 17:17:55 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 17:33:32 GMT]]></title><description><![CDATA[<p>super, Vielen Dank für die Antwort. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Habe jetzt mal so einen Funktionszeiger geschrieben.<br />
Um es testen zu können, müsste ich jetzt wissen, welches Element genau gefunden wurde.<br />
Also nicht den String, sondern den Index des Elements.</p>
<p>Kann man da irgendwie rankommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608664</guid><dc:creator><![CDATA[mettis]]></dc:creator><pubDate>Sat, 01 Nov 2008 17:33:32 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 17:45:29 GMT]]></title><description><![CDATA[<p>mettis schrieb:</p>
<blockquote>
<p>Kann man da irgendwie rankommen?</p>
</blockquote>
<p>Mit <code>std::binary_search()</code> wird das schwierig, da nur ein Wahrheitswert zurückgegeben wird (ob das gesuchte Element vorkommt oder nicht).</p>
<p>Vielleicht kann dir <code>std::find()</code> helfen, das liefert einen Iterator. Dann kannst du mit <code>std::distance()</code> den Abstand vom Anfang des Vektors messen und erhältst dann den Index:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; Vec;
// Vec füllen
std::vector&lt;int&gt;::iterator Iter = std::find(Vec.begin(), Vec.end(), Elem);
int Index = std::distance(Vec.begin(), Iter);
</code></pre>
<p>Statt <code>std::distance()</code> kannst du bei Random-Access-Iteratoren auch <code>operator-</code> verwenden:</p>
<pre><code class="language-cpp">int Index = Iter - Vec.begin();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1608673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608673</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Nov 2008 17:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 17:50:46 GMT]]></title><description><![CDATA[<p>Wenn die Liste sortiert ist, kannst du statt <code>std::binary_search</code> , ein <code>std::lower_bound</code> anwenden:<br />
<a href="http://www.cplusplus.com/reference/algorithm/lower_bound.html" rel="nofollow">http://www.cplusplus.com/reference/algorithm/lower_bound.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608676</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 01 Nov 2008 17:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:01:13 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wenn die Liste sortiert ist, kannst du statt <code>std::binary_search</code> , ein <code>std::lower_bound</code> anwenden:<br />
<a href="http://www.cplusplus.com/reference/algorithm/lower_bound.html" rel="nofollow">http://www.cplusplus.com/reference/algorithm/lower_bound.html</a></p>
<p>Grüssli</p>
</blockquote>
<p>Das wäre klasse, hast du vll. ein kleines Beispiel dafür, verstehe diese Funktion jetzt irgendwie nicht ganz, die liefert bei mir nur komische Werte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608681</guid><dc:creator><![CDATA[metti]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:02:53 GMT]]></title><description><![CDATA[<p>Ich meine ein Beispiel womit ich die ersten 32 Zeichen vergleichen kann und dann den Index des Elements bekomme, das Beispiel auf der Seite hilft mir nicht so weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608682</guid><dc:creator><![CDATA[metti]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:25:51 GMT]]></title><description><![CDATA[<p>Werde ein bisschen genauer. Die ersten 32 Zeichen entsprechen der Iterator-Range <code>[begin(), begin()+32]</code> , geht das nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608691</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:37:56 GMT]]></title><description><![CDATA[<p>Also der (sortierte) Vector enhält Strings, die folgendermaßen aufgebaut sind:<br />
&lt;String mit 32 Zeichen&gt;:&lt;String mit beliebig vielen Zeichen&gt;</p>
<p>Jetzt gibt der Benutzer einen 32 stelligen String ein und der Vector soll danach durchsucht werden (und beim durchsuchen sollen natürlich nur jeweils die ersten 32 Zeichen verglichen werden, da sonst ja niemals etwas gefunden wird) und wenn er etwas gefunden hat, soll entweder der String nach dem Doppelpunkt oder eben beides ausgegeben werden, das ist egal.</p>
<p>Und das ganze soll möglichst schnell gehen, weshalb ich auch gerne auf find() verzichten möchte, da die Liste ja eh sortiert ist.</p>
<p>Ich hoffe, jemand hat das verstanden und kann mir helfen. <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/1608696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608696</guid><dc:creator><![CDATA[metti]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:39:50 GMT]]></title><description><![CDATA[<p>schau dir mal die string-methoden an, man kann sehr wohl vergleiche mit substrings etc. machen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608698</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search() mit eigener Vergleichsroutine on Sat, 01 Nov 2008 18:43:21 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>schau dir mal die string-methoden an, man kann sehr wohl vergleiche mit substrings etc. machen</p>
</blockquote>
<p>Ja, das weiß ich, aber das Problem ist ja, dass ich, wenn ich mit binary_search() den 32 -stelligen String gefunden haben, ja nicht mehr an den Index des Elements bzw. an den String komme, der nach dem Doppelpunkt steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608699</guid><dc:creator><![CDATA[metti]]></dc:creator><pubDate>Sat, 01 Nov 2008 18:43:21 GMT</pubDate></item></channel></rss>