<?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[find_any_of_and_tell_me_which_one]]></title><description><![CDATA[<p>Ich bin extrem unzufrieden mit einem &quot;finde den ersten substring aus einer Auswahl und gib mir an wo und welcher&quot; Algorithmus.<br />
Mir geht es hier um Geschwindigkeit.</p>
<p>Das muss doch schöner gehen als das hier:<br />
(Suchstring = zu suchender String)<br />
(String = String in dem gesucht wird)</p>
<pre><code>template &lt;typename FindIteratorT, typename ListIteratorT&gt;
class FindPair
{
public:
    explicit operator bool() const
    {
        return found_;
    }
    FindIteratorT where() const
    {
        return where_;
    }
    ListIteratorT which() const
    {
        return which_;
    }
    FindPair(FindIteratorT where, ListIteratorT which, bool found = false)
        : where_(std::move(where)), which_(std::move(which)), found_(found)
    {}
private:
    FindIteratorT where_;
    ListIteratorT which_;
    bool found_;
};

// Die convenience function unten zeigt die Benutzung dieser Funktion, das macht es vermutlich einfacher zu verstehen
template &lt;typename FindIteratorT, typename ListIteratorT&gt;
FindPair &lt;FindIteratorT, ListIteratorT&gt; get_first_occurence_of (FindIteratorT Fbegin, FindIteratorT Fend, ListIteratorT Lbegin, ListIteratorT Lend)
{
    for (auto i = Fbegin; i != Fend; ++i) // Schleife über den String
    {
        for (auto j = Lbegin; j != Lend; ++j) // Schleife über alle Suchstrings
        {
            auto before = i;
            bool found = true;
            for (auto k = std::begin(*j); k != std::end(*j); ++k) // Schleife über den aktuellen Suchstrings
            {
                if (*k != *i)
                {
                    found = false; // bei mismatch abbrechen und nächsten Suchstring ausprobiere
                    break;
                }
                if (i != Fend)
                    ++i;
                else
                {
                    found = false; // Suchstring ist länger als verbleibender String
                    break;
                }
            }
            if (found)
            {
                return {--i, j, true};
            }
            else
            {
                i = before;
            }
        }
    }
    return { Fend, Lend, false };
}

template &lt;template &lt;typename ElemT, typename = std::allocator&lt;ElemT&gt;&gt; class ContainerT = std::vector&gt;
inline FindPair &lt;std::string::const_iterator, std::vector&lt;std::string&gt;::const_iterator&gt; get_first_occurence_of (std::string const&amp; str, ContainerT &lt;std::string&gt; const&amp; alts)
{
    return get_first_occurence_of (str.cbegin(), str.cend(), alts.cbegin(), alts.cend());
}

int main()
{
    std::vector &lt;std::string&gt; alts = {
        &quot;//&quot;,
        &quot;/*&quot;,
        &quot;\&quot;&quot;,
        &quot;'&quot;
    };
    auto results = get_first_occurence_of(&quot;abcd//'//troll/*\&quot;&quot;, alts);
    if (results)
    {
        std::cout &lt;&lt; *results.where() &lt;&lt; &quot;\n&quot;;
        std::cout &lt;&lt; *results.which();
    }
    return 0;
}
</code></pre>
<p>Hat boost string algo was nettes?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324653/find_any_of_and_tell_me_which_one</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 08:20:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324653.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Mar 2014 20:54:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 20:55:58 GMT]]></title><description><![CDATA[<p>Ich bin extrem unzufrieden mit einem &quot;finde den ersten substring aus einer Auswahl und gib mir an wo und welcher&quot; Algorithmus.<br />
Mir geht es hier um Geschwindigkeit.</p>
<p>Das muss doch schöner gehen als das hier:<br />
(Suchstring = zu suchender String)<br />
(String = String in dem gesucht wird)</p>
<pre><code>template &lt;typename FindIteratorT, typename ListIteratorT&gt;
class FindPair
{
public:
    explicit operator bool() const
    {
        return found_;
    }
    FindIteratorT where() const
    {
        return where_;
    }
    ListIteratorT which() const
    {
        return which_;
    }
    FindPair(FindIteratorT where, ListIteratorT which, bool found = false)
        : where_(std::move(where)), which_(std::move(which)), found_(found)
    {}
private:
    FindIteratorT where_;
    ListIteratorT which_;
    bool found_;
};

// Die convenience function unten zeigt die Benutzung dieser Funktion, das macht es vermutlich einfacher zu verstehen
template &lt;typename FindIteratorT, typename ListIteratorT&gt;
FindPair &lt;FindIteratorT, ListIteratorT&gt; get_first_occurence_of (FindIteratorT Fbegin, FindIteratorT Fend, ListIteratorT Lbegin, ListIteratorT Lend)
{
    for (auto i = Fbegin; i != Fend; ++i) // Schleife über den String
    {
        for (auto j = Lbegin; j != Lend; ++j) // Schleife über alle Suchstrings
        {
            auto before = i;
            bool found = true;
            for (auto k = std::begin(*j); k != std::end(*j); ++k) // Schleife über den aktuellen Suchstrings
            {
                if (*k != *i)
                {
                    found = false; // bei mismatch abbrechen und nächsten Suchstring ausprobiere
                    break;
                }
                if (i != Fend)
                    ++i;
                else
                {
                    found = false; // Suchstring ist länger als verbleibender String
                    break;
                }
            }
            if (found)
            {
                return {--i, j, true};
            }
            else
            {
                i = before;
            }
        }
    }
    return { Fend, Lend, false };
}

template &lt;template &lt;typename ElemT, typename = std::allocator&lt;ElemT&gt;&gt; class ContainerT = std::vector&gt;
inline FindPair &lt;std::string::const_iterator, std::vector&lt;std::string&gt;::const_iterator&gt; get_first_occurence_of (std::string const&amp; str, ContainerT &lt;std::string&gt; const&amp; alts)
{
    return get_first_occurence_of (str.cbegin(), str.cend(), alts.cbegin(), alts.cend());
}

int main()
{
    std::vector &lt;std::string&gt; alts = {
        &quot;//&quot;,
        &quot;/*&quot;,
        &quot;\&quot;&quot;,
        &quot;'&quot;
    };
    auto results = get_first_occurence_of(&quot;abcd//'//troll/*\&quot;&quot;, alts);
    if (results)
    {
        std::cout &lt;&lt; *results.where() &lt;&lt; &quot;\n&quot;;
        std::cout &lt;&lt; *results.which();
    }
    return 0;
}
</code></pre>
<p>Hat boost string algo was nettes?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391137</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 25 Mar 2014 20:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 21:28:07 GMT]]></title><description><![CDATA[<p>Da es dir offensichtlich nicht um Geschwindigkeit geht, wieso loopst du nicht einfach über alle Pattern, rufst für jedes Pattern std::search/strstr auf und merkst dir dann den ersten Treffer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391147</guid><dc:creator><![CDATA[not_going_to_tell_ya]]></dc:creator><pubDate>Tue, 25 Mar 2014 21:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 22:08:32 GMT]]></title><description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/String_searching_algorithm#Algorithms_using_a_finite_set_of_patterns" rel="nofollow">http://en.wikipedia.org/wiki/String_searching_algorithm#Algorithms_using_a_finite_set_of_patterns</a><br />
?</p>
<p>ps:</p>
<p>Tim06TR schrieb:</p>
<blockquote>
<p>Mir geht es hier um Geschwindigkeit.</p>
<p>Das muss doch schöner gehen</p>
</blockquote>
<p>Such dir eins aus. Schön oder schnell. Beides wird wohl nix. (Ausser natürlich du nimmst ne fertige Library, die du nur noch aufrufen musst :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391157</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Mar 2014 22:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 22:13:17 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Such dir eins aus. Schön oder schnell. Beides wird wohl nix.</p>
</blockquote>
<p>Den Rabin–Karp kann man in weit weniger als 84 Zeilen implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391159</guid><dc:creator><![CDATA[schönundschnell]]></dc:creator><pubDate>Tue, 25 Mar 2014 22:13:17 GMT</pubDate></item><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 22:15:03 GMT]]></title><description><![CDATA[<p>Schön == &quot;in weit weniger als 84 Zeilen implementierbar&quot;?<br />
Uff. Wusste ich gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391160</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Mar 2014 22:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to find_any_of_and_tell_me_which_one on Tue, 25 Mar 2014 23:00:47 GMT]]></title><description><![CDATA[<p>not_going_to_tell_ya schrieb:</p>
<blockquote>
<p>Da es dir offensichtlich nicht um Geschwindigkeit geht, wieso loopst du nicht einfach über alle Pattern, rufst für jedes Pattern std::search/strstr auf und merkst dir dann den ersten Treffer?</p>
</blockquote>
<p>Das habe ich vorher gemacht, aber das ist noch viel schlimmer als das da oben.<br />
Das sind hübsche 5 Zeilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391168</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 25 Mar 2014 23:00:47 GMT</pubDate></item></channel></rss>