<?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[Grosse if-Abfrage ersezten durch schoenen design]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine laengere if-Abfrage die so aussieht:</p>
<pre><code>if(str!=&quot;X&quot; &amp;&amp; str!=&quot;Z&quot; &amp;&amp; str!=&quot;ZX&quot; &amp;&amp; str!=&quot;BX&quot; &amp;&amp; str!=&quot;VX&quot; &amp;&amp; str!=&quot;QX&quot;)
{
.
.
.
}
</code></pre>
<p>In Zukunft wird die if-Abfrage erweiterst d.h. es koennen z.B noch mehr &amp;&amp; str!=&quot;BN&quot; hinzukommen. Wie kann ich die if Abfrage nun durch einen Algorithmus aus der STL ersetzen. Ich habe mir gedacht ich speichere all die strings in einem vector:</p>
<pre><code>std::vector&lt;std::string&gt;check_strs;
check_strs.push_back(&quot;X&quot;);
check_strs.push_back(&quot;Z&quot;);
check_strs.push_back(&quot;ZX&quot;);
check_strs.push_back(&quot;BX&quot;);
check_strs.push_back(&quot;VX&quot;);
check_strs.push_back(&quot;QX&quot;);

std::vector&lt;std::string&gt;::const_iterator i = std::...(check_strs.begin(),check_strs.end(),funktor(str));

if(i==check_strs.end())
{
.
.
.
}
</code></pre>
<p>Welchen Algorithmus muss ich verweden? Oder gibt es noch einen anderen Weg das elegant zu loesen?</p>
<p>Besten Dank<br />
<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/topic/315606/grosse-if-abfrage-ersezten-durch-schoenen-design</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 18:04:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315606.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Apr 2013 04:45:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 04:45:06 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine laengere if-Abfrage die so aussieht:</p>
<pre><code>if(str!=&quot;X&quot; &amp;&amp; str!=&quot;Z&quot; &amp;&amp; str!=&quot;ZX&quot; &amp;&amp; str!=&quot;BX&quot; &amp;&amp; str!=&quot;VX&quot; &amp;&amp; str!=&quot;QX&quot;)
{
.
.
.
}
</code></pre>
<p>In Zukunft wird die if-Abfrage erweiterst d.h. es koennen z.B noch mehr &amp;&amp; str!=&quot;BN&quot; hinzukommen. Wie kann ich die if Abfrage nun durch einen Algorithmus aus der STL ersetzen. Ich habe mir gedacht ich speichere all die strings in einem vector:</p>
<pre><code>std::vector&lt;std::string&gt;check_strs;
check_strs.push_back(&quot;X&quot;);
check_strs.push_back(&quot;Z&quot;);
check_strs.push_back(&quot;ZX&quot;);
check_strs.push_back(&quot;BX&quot;);
check_strs.push_back(&quot;VX&quot;);
check_strs.push_back(&quot;QX&quot;);

std::vector&lt;std::string&gt;::const_iterator i = std::...(check_strs.begin(),check_strs.end(),funktor(str));

if(i==check_strs.end())
{
.
.
.
}
</code></pre>
<p>Welchen Algorithmus muss ich verweden? Oder gibt es noch einen anderen Weg das elegant zu loesen?</p>
<p>Besten Dank<br />
<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/2313323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313323</guid><dc:creator><![CDATA[LeeVanCleef]]></dc:creator><pubDate>Sun, 07 Apr 2013 04:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 10:30:03 GMT]]></title><description><![CDATA[<p>Mit C++11 wirds einfach:</p>
<pre><code>std::vector&lt;std::string&gt; check_strs
{ &quot;X&quot;, &quot;Z&quot;, &quot;ZX&quot;, &quot;BX&quot;, &quot;VX&quot;, &quot;QX&quot; };

std::string str; // Dein Test-String!
if( std::find( check_strs.begin(), check_strs.end(), str ) == check_strs.end() )
{
    //...
}
</code></pre>
<p>Mit C++98 musst du statt std::vector ein C-Array nehmen (für die Listen-Initialisierung) und entsprechend umbauen.</p>
<p><strong>(Ungetestet!)</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313325</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 07 Apr 2013 10:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 07:59:24 GMT]]></title><description><![CDATA[<p>Wenn STL dann wohl eher unorderd_set oder set und die Funktion count.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313331</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 07 Apr 2013 07:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 08:16:47 GMT]]></title><description><![CDATA[<p>Gut, das geht natürlich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313333</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 07 Apr 2013 08:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 13:32:15 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Wenn STL dann wohl eher unorderd_set oder set und die Funktion count.</p>
</blockquote>
<p>Noch viel besser wäre ein sortiertes Array mit <code>std::binary_search</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313395</guid><dc:creator><![CDATA[wohl_eher]]></dc:creator><pubDate>Sun, 07 Apr 2013 13:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 14:02:27 GMT]]></title><description><![CDATA[<p>Vielen Dank fuer die vielen Hinweise!<br />
Ich werde find verwenden.<br />
Ist binary_search mit dem sortierten Array schneller?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313404</guid><dc:creator><![CDATA[LeeVanCleef]]></dc:creator><pubDate>Sun, 07 Apr 2013 14:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 14:10:29 GMT]]></title><description><![CDATA[<p>LeeVanCleef schrieb:</p>
<blockquote>
<p>Ist binary_search mit dem sortierten Array schneller?</p>
</blockquote>
<p>Es muss nur maximal log<sub>2</sub>(n) Vergleiche machen. In deinem Fall maximal 3 statt maximal 6 Vergleiche. Wenn die Anzahl Elemente grösser wird, zahlt sich das immer mehr aus.</p>
<p><code>std::set</code> muss zwar auch nur maximal 3 Vergleiche machen, aber der restliche Overhead ist immens grösser, so dass ich vermute, dass hier <code>std::find</code> sogar schneller ist.</p>
<p>Und du kannst auch normale Arrays nehme, weshalb Sone hier <code>std::vector</code> verwenden will, verstehe ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313409</guid><dc:creator><![CDATA[wohl_eher]]></dc:creator><pubDate>Sun, 07 Apr 2013 14:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 15:55:37 GMT]]></title><description><![CDATA[<p>Bei so kurzen Containern ist der Overhead der linearen Suche aber nicht besonders groß verglichen zum Aufwand, die Liste erst noch zu sortieren. Ja, man kann sie gleich sortiert schreiben, aber da schleciht sich viel zu schnell ein Fehler sein, außerdem möchte man sie aus semantischen Gründen vielleicht lieber in einer anderen Reihenfolge pflegen.</p>
<p>Die bisherigen Codes haben nämlich eine Schwachstelle: der vector (oder was auch immer für einen Container man wählt) wird jedesmal neu angelegt, müsste also auch jedesmal neu sortiert werden. Meine Lösung sähe im ersten Wurf vermutlich so aus:</p>
<pre><code>template &lt;class T, class SortedContainer&gt;
bool isInSortedList(T&amp;&amp; val, SortedContainer const&amp; container)
{
  return std::binary_search(std::begin(container), std::end(container), val) != std::end(container);
}
// ...

const static auto sorted_check_strs = []() {
  std::vector&lt;std::string&gt; vec 
    {&quot;X&quot;, &quot;Z&quot;, &quot;ZX&quot;, &quot;BX&quot;, &quot;VX&quot;, &quot;QX&quot;};
  std::sort(begin(vec), end(vec));
  return vec;
}();

std::string str = /* ... */;
if( isInSortedList(str, sorted_check_strs) )
{
    //...
}
</code></pre>
<p>ggf. kann man aus dem Lambda auch noch eine eigene Funktion machen, um die Funktion nicht mit der Erzeugung der sortierten Liste zu überladen:</p>
<pre><code>const static auto sorted_check_strs = makeSortedList&lt;std::vector&gt;
  ({&quot;X&quot;, &quot;Z&quot;, &quot;ZX&quot;, &quot;BX&quot;, &quot;VX&quot;, &quot;QX&quot;});

std::string str = /* ... */;
if( isInSortedList(str, sorted_check_strs) )
{
    //...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2313444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313444</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 07 Apr 2013 15:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Grosse if-Abfrage ersezten durch schoenen design on Sun, 07 Apr 2013 16:42:31 GMT]]></title><description><![CDATA[<p>Es besteht auch die Möglichkeit, die Liste mit Template Metaprogramming zu sortieren und dann sortiert ins Datensegment des Programmes zu speichern. Leider ist es in pre C++14 etwas mühsam, Strings als Templateparameter zu übergeben.</p>
<p>Kellerautomat hat hier mal einen TMP-Sortieralgorithmus für Strings gepostet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2313465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2313465</guid><dc:creator><![CDATA[wohl_eher]]></dc:creator><pubDate>Sun, 07 Apr 2013 16:42:31 GMT</pubDate></item></channel></rss>