<?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 std::vector&amp;lt;std::string&amp;gt;]]></title><description><![CDATA[<p>Hallo, ich habe folgendes Problem. Ich habe eine whitelist mit mehreren tausend Einträgen, die ich schnell durchsuchen muss.<br />
Da die Suchfunktion (compare()) jedoch in manchen Situationen anders agieren soll, habe ich mich nicht für ein std::set entschieden, sondern einen std::vector, der, nachdem er sortiert wurde, mit dieser speziellen compare-Funktion durchsucht wird:</p>
<pre><code class="language-cpp">bool __cdecl whitelist_compare(const std::string&amp; str1, const std::string&amp; str2)
{
	std::string cpy1(str1);
	std::string cpy2(str2);
	std::transform(cpy1.begin(), cpy1.end(), cpy1.begin(), ::toupper);
	std::transform(cpy2.begin(), cpy2.end(), cpy2.begin(), ::toupper);

	size_t s = cpy1.length() - 1;
	if (cpy1.at(s) == '.')
	{
		int result = cpy1.compare(0, s, cpy2, 0, s);
		if (result == 0) 
		{
			LOG(Logging::nDebug, L&quot;cpy1.compare: SCHEMA FOUND IN WHITELIST&quot;);
		}
		return result &gt; 0;
	}
	return (cpy1 &gt; cpy2);
}
</code></pre>
<p>Die Suche soll case-insensitive einen Namen, sagen wir mal &quot;SCOTT.EMP&quot;, in der Whitelist suchen.<br />
In der Whitelist finden sich folgende Einträge:</p>
<blockquote>
<p>system.<br />
sys.<br />
scott.<br />
bla.blub<br />
BLUB1</p>
</blockquote>
<p>Einträge in der Whitelist, die auf einen Punkt enden, sind Schemata, wenn also nach &quot;SCOTT.EMP&quot; gesucht wird und &quot;SCOTT.&quot; in der Whitelist enthalten ist, dann soll die binäre Suche matchen.</p>
<p>Aber leider funktioniert der obige Code nicht, zumindest nicht immer. Anscheinend kommt es darauf an, wie viele Einträge in der Whitelist sind.</p>
<p>Was muss ich denn zurück liefern, wenn die Zeile</p>
<pre><code class="language-cpp">int result = cpy1.compare(0, s, cpy2, 0, s);
</code></pre>
<p>gematched hat? True oder false? So wie ich es verstanden hatte, muss die compare()-Funktion true zurückliefern, wenn str1 größer str2 ist, ansonsten false.<br />
Jedoch scheint dies nicht zu klappen.</p>
<p>Ich hatte so eine Funktion schon einmal mit der C-Funktion bsearch() erstellt, jedoch ging es da ohne Probleme. bsearch() erwartet von der compare() Funktion aber auch einen Wert kleiner, gleich oder größer null. binary_search() will jedoch nur true oder false.</p>
<p>Hat jemand eine Idee, was hier falsch läuft?</p>
<p>Achja, bevor die Frage aufkommt: Der Vektor ist sortiert</p>
<pre><code class="language-cpp">sort(wlist.begin(), wlist.end())
</code></pre>
<p>Hier nochmal die binary_search()-Funktion im Code, falls es was bringt:</p>
<pre><code class="language-cpp">bool result = false;
std::string searchStr(TestString);
ListEntries&amp; whitelist = d-&gt;configReader-&gt;whitelist();

result = std::binary_search(whitelist.begin(), whitelist.end(), searchStr, helperutils::whitelist_compare);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/264831/binary_search-mit-std-vector-lt-std-string-gt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 13:20:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264831.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Apr 2010 15:05:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to binary_search mit std::vector&amp;lt;std::string&amp;gt; on Tue, 13 Apr 2010 15:05:04 GMT]]></title><description><![CDATA[<p>Hallo, ich habe folgendes Problem. Ich habe eine whitelist mit mehreren tausend Einträgen, die ich schnell durchsuchen muss.<br />
Da die Suchfunktion (compare()) jedoch in manchen Situationen anders agieren soll, habe ich mich nicht für ein std::set entschieden, sondern einen std::vector, der, nachdem er sortiert wurde, mit dieser speziellen compare-Funktion durchsucht wird:</p>
<pre><code class="language-cpp">bool __cdecl whitelist_compare(const std::string&amp; str1, const std::string&amp; str2)
{
	std::string cpy1(str1);
	std::string cpy2(str2);
	std::transform(cpy1.begin(), cpy1.end(), cpy1.begin(), ::toupper);
	std::transform(cpy2.begin(), cpy2.end(), cpy2.begin(), ::toupper);

	size_t s = cpy1.length() - 1;
	if (cpy1.at(s) == '.')
	{
		int result = cpy1.compare(0, s, cpy2, 0, s);
		if (result == 0) 
		{
			LOG(Logging::nDebug, L&quot;cpy1.compare: SCHEMA FOUND IN WHITELIST&quot;);
		}
		return result &gt; 0;
	}
	return (cpy1 &gt; cpy2);
}
</code></pre>
<p>Die Suche soll case-insensitive einen Namen, sagen wir mal &quot;SCOTT.EMP&quot;, in der Whitelist suchen.<br />
In der Whitelist finden sich folgende Einträge:</p>
<blockquote>
<p>system.<br />
sys.<br />
scott.<br />
bla.blub<br />
BLUB1</p>
</blockquote>
<p>Einträge in der Whitelist, die auf einen Punkt enden, sind Schemata, wenn also nach &quot;SCOTT.EMP&quot; gesucht wird und &quot;SCOTT.&quot; in der Whitelist enthalten ist, dann soll die binäre Suche matchen.</p>
<p>Aber leider funktioniert der obige Code nicht, zumindest nicht immer. Anscheinend kommt es darauf an, wie viele Einträge in der Whitelist sind.</p>
<p>Was muss ich denn zurück liefern, wenn die Zeile</p>
<pre><code class="language-cpp">int result = cpy1.compare(0, s, cpy2, 0, s);
</code></pre>
<p>gematched hat? True oder false? So wie ich es verstanden hatte, muss die compare()-Funktion true zurückliefern, wenn str1 größer str2 ist, ansonsten false.<br />
Jedoch scheint dies nicht zu klappen.</p>
<p>Ich hatte so eine Funktion schon einmal mit der C-Funktion bsearch() erstellt, jedoch ging es da ohne Probleme. bsearch() erwartet von der compare() Funktion aber auch einen Wert kleiner, gleich oder größer null. binary_search() will jedoch nur true oder false.</p>
<p>Hat jemand eine Idee, was hier falsch läuft?</p>
<p>Achja, bevor die Frage aufkommt: Der Vektor ist sortiert</p>
<pre><code class="language-cpp">sort(wlist.begin(), wlist.end())
</code></pre>
<p>Hier nochmal die binary_search()-Funktion im Code, falls es was bringt:</p>
<pre><code class="language-cpp">bool result = false;
std::string searchStr(TestString);
ListEntries&amp; whitelist = d-&gt;configReader-&gt;whitelist();

result = std::binary_search(whitelist.begin(), whitelist.end(), searchStr, helperutils::whitelist_compare);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1882218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882218</guid><dc:creator><![CDATA[TheGrudge]]></dc:creator><pubDate>Tue, 13 Apr 2010 15:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to binary_search mit std::vector&amp;lt;std::string&amp;gt; on Wed, 14 Apr 2010 09:36:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Da die Suchfunktion (compare()) jedoch in manchen Situationen anders agieren soll</p>
</blockquote>
<p>Deine Sortierpraedikat muss mit deinem Suchpraedikat kompatibel sein. Das ist sie ganz und gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882587</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 14 Apr 2010 09:36:55 GMT</pubDate></item></channel></rss>