<?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[Problem mit algo]]></title><description><![CDATA[<p>Hi</p>
<p>Häng hier fest, der algo rennt ewig durch die Schlaufe, find aber nicht raus wieso</p>
<pre><code class="language-cpp">struct EqualSymbol
:   public std::binary_function&lt;Fraction, std::string, bool&gt;
{
    bool operator()( const Fraction&amp; lhs, const std::string&amp; rhs ) const
    {
        return lhs.m_symbol == rhs;
    }
};

//
        bool do_it = true;
        for( FractionTableT::iterator it = ret.begin();
        it != ret.end(); it++ )
        {
            if( it-&gt;m_symbol == &quot;NNN&quot; )
            {
                do_it = false;
            }
            while( do_it )
            {
                FractionTableT::iterator findit 
                    = find_if( ret.begin(), ret.end(), 
                        bind2nd( EqualSymbol(), it-&gt;m_symbol ) );
                if( findit == ret.end() )
                {
                    do_it = false;
                }
                it-&gt;m_coeff *= findit-&gt;m_coeff;
                findit-&gt;m_symbol = &quot;NNN&quot;;
            }
        }
</code></pre>
<p>Kann mir jemand helfen?</p>
<p>Danke <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/174647/problem-mit-algo</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 21:52:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174647.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Mar 2007 14:42:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit algo on Thu, 01 Mar 2007 14:42:01 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Häng hier fest, der algo rennt ewig durch die Schlaufe, find aber nicht raus wieso</p>
<pre><code class="language-cpp">struct EqualSymbol
:   public std::binary_function&lt;Fraction, std::string, bool&gt;
{
    bool operator()( const Fraction&amp; lhs, const std::string&amp; rhs ) const
    {
        return lhs.m_symbol == rhs;
    }
};

//
        bool do_it = true;
        for( FractionTableT::iterator it = ret.begin();
        it != ret.end(); it++ )
        {
            if( it-&gt;m_symbol == &quot;NNN&quot; )
            {
                do_it = false;
            }
            while( do_it )
            {
                FractionTableT::iterator findit 
                    = find_if( ret.begin(), ret.end(), 
                        bind2nd( EqualSymbol(), it-&gt;m_symbol ) );
                if( findit == ret.end() )
                {
                    do_it = false;
                }
                it-&gt;m_coeff *= findit-&gt;m_coeff;
                findit-&gt;m_symbol = &quot;NNN&quot;;
            }
        }
</code></pre>
<p>Kann mir jemand helfen?</p>
<p>Danke <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/1237532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237532</guid><dc:creator><![CDATA[Evil Knevil]]></dc:creator><pubDate>Thu, 01 Mar 2007 14:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit algo on Thu, 01 Mar 2007 15:47:17 GMT]]></title><description><![CDATA[<p>Schon beim ersten Durchlauf wird ein Eintrag mit 'it-&gt;m_symbol' gefunden, nämlich wenn it und findit gleich sind, dieser wird selbst (!) auf &quot;NNN&quot; gesetzt. Bei jedem nächsten Durchlauf in der while-Schleife wird der gleiche Eintrag von &quot;NNN&quot; gefunden und jetzt bleibt die while-Schleife kleben, da hier immer wieder der gleiche &quot;NNN&quot;-Eintrag gefunden wird.</p>
<p>Ich glaube, das was Du willst ist das (an Stelle der Zeilen 15-30)</p>
<pre><code class="language-cpp">if( it-&gt;m_symbol == &quot;NNN&quot; )
            {
                continue;
            }
            for( FractionTableT::iterator findit = it + 1 // hinter it beginnen
                ; (findit = std::find_if( 
                        findit, ret.end(),  // erst ab 'findit' weitersuchen
                        bind2nd( EqualSymbol(), it-&gt;m_symbol ) )
                  ) != ret.end(); ++findit )
            {
                it-&gt;m_coeff *= findit-&gt;m_coeff;
                findit-&gt;m_symbol = &quot;NNN&quot;;
            }
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237581</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 01 Mar 2007 15:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit algo on Thu, 01 Mar 2007 16:05:56 GMT]]></title><description><![CDATA[<p>Danke. <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>Hab nun mein Code entsprechend umgebaut</p>
<pre><code class="language-cpp">struct EqualSymbol
:   public std::binary_function&lt;Fraction, std::string, bool&gt;
{
    bool operator()( const Fraction&amp; lhs, const std::string&amp; rhs ) const
    {
        return ( 0 == lhs.m_symbol.compare( rhs ) );
    }
};

struct IsDummy
:   public std::unary_function&lt;Fraction, bool&gt;
{
    bool operator()( const Fraction&amp; elem ) const
    {
        return ( 0 == elem.m_symbol.compare( &quot;NNN&quot; ) );
    }
};

//...

for( FractionTableT::iterator it = ret.begin();
     it != ret.end(); it++ )
{
    if( 0 == it-&gt;m_symbol.compare( &quot;NNN&quot; ) )
        break;
    for( FractionTableT::iterator it2 = it + 1;
         it2 != ret.end(); it2++ )
    {
        FractionTableT::iterator findit 
            = find_if( ret.begin(), ret.end(),
                       bind2nd( EqualSymbol(), it-&gt;m_symbol ) );
        if( findit == ret.end() || findit == it )
            break;
        it-&gt;m_coeff += findit-&gt;m_coeff;
        findit-&gt;m_symbol = &quot;NNN&quot;;
        }
}
ret.erase( std::remove_if( ret.begin(), ret.end(), IsDummy() ),
            ret.end() );        // alle mit &quot;NNN&quot; entfernen
</code></pre>
<p>Tut nun auch was er soll, aber kann man das noch optimieren oder 'verschönern'?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237598</guid><dc:creator><![CDATA[Evil Knevil]]></dc:creator><pubDate>Thu, 01 Mar 2007 16:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit algo on Thu, 01 Mar 2007 16:23:17 GMT]]></title><description><![CDATA[<p>Jetzt ist er zumindest mal vernünftig lesbar:</p>
<pre><code class="language-cpp">struct EqualSymbol : public std::binary_function&lt;Fraction, std::string, bool&gt; 
{ 
    bool operator() (const Fraction&amp; lhs, const std::string&amp; rhs) const 
    { 
        return (0 == lhs.m_symbol.compare(rhs)); 
    } 
}; 

struct IsDummy : public std::unary_function&lt;Fraction, bool&gt; 
{ 
    bool operator() (const Fraction&amp; elem) const 
    { 
        return (0 == elem.m_symbol.compare(&quot;NNN&quot;)); 
    } 
}; 

for(FractionTableT::iterator it = ret.begin(); it != ret.end(); it++) 
{ 
    if(0 == it-&gt;m_symbol.compare(&quot;NNN&quot;))
		break; 

    for(FractionTableT::iterator it2 = it + 1; it2 != ret.end(); it2++) 
    { 
        FractionTableT::iterator findit = find_if(ret.begin(), ret.end(), bind2nd(EqualSymbol(), it-&gt;m_symbol));

        if(findit == ret.end() || findit == it) 
            break; 

        it-&gt;m_coeff += findit-&gt;m_coeff; 
        findit-&gt;m_symbol = &quot;NNN&quot;; 
    } 
} 

ret.erase(std::remove_if(ret.begin(), ret.end(), IsDummy()), ret.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1237604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237604</guid><dc:creator><![CDATA[ceplusplus]]></dc:creator><pubDate>Thu, 01 Mar 2007 16:23:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit algo on Thu, 01 Mar 2007 16:41:14 GMT]]></title><description><![CDATA[<p>Evil Knevil schrieb:</p>
<blockquote>
<p>Tut nun auch was er soll, aber kann man das noch optimieren oder 'verschönern'?</p>
</blockquote>
<p>Ja. Dein Algo hat die Komplexität O(n^2). Das kann bei einem n - also der Anzahl der Elemente in dem Container - von ein paar 100 aufwärts irgendwann zum Problem werden. Wenn es ok ist, die Elemente in einer anderen Reihenfolge zu erzeugen, so sollte man sie vorher nach 'm_symbol' sortieren. Das hat bei den üblichen Algorithmen die Komplexität O(n*log(n)); das wäre noch ok.<br />
Weiter braucht man die Elemente nicht erst markieren und danach wegwerfen, sondern kann das gleich in einem Aufwasch tun. In Kombination mit einer Output-Iterator-Schnittstelle für die Ausgabe wird es auch recht flexibel.</p>
<p>Alles zusammen könnte das so aussehen:</p>
<pre><code class="language-cpp">struct LessFraction
{
    bool operator()( const Fraction&amp; a, const Fraction&amp; b ) const
    {
        return a.m_symbol &lt; b.m_symbol;
    }
};

template&lt; typename OutItr &gt;
void mach( const FractionTableT&amp; table, OutItr out )
{
    FractionTableT ret = table; // lokale Kopy - nur wenn notwendig
    FractionTableT::iterator first = ret.begin();
    FractionTableT::iterator last = ret.end();

    if( first == last )
        return;
    sort( first, last, LessFraction() ); // erst sortieren, sonst funkt die Schleife nicht
    FractionTableT::iterator it = first;
    for( ; ++first != last; )
        if( it-&gt;m_symbol == first-&gt;m_symbol )
            it-&gt;m_coeff *= first-&gt;m_coeff;
        else
        {
            *out++ = *it;
            it = first;
        }
    *out++ = *it;   // letzten auch wegschreiben
    return;
}
</code></pre>
<p>aufrufen kann man das dann mit</p>
<pre><code class="language-cpp">mach( table, ostream_iterator&lt; Fraction &gt;( cout &lt;&lt; &quot;&gt; &quot;, &quot; &quot; ) );
</code></pre>
<p>wenn man nur eine Ausgabe haben will oder mit back_inserter, um sie in den Zielcontainer zu stecken.</p>
<p>Gruß<br />
Werner</p>
<p>PS.: warum denn das einfache &amp; klare 'it-&gt;m_symbol == &quot;NNN&quot;' gegen das hässliche '0 == it-&gt;m_symbol.compare(&quot;NNN&quot;)' austauschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237615</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 01 Mar 2007 16:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit algo on Fri, 02 Mar 2007 12:00:57 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Danke Werner, für die Erklärung und den Code.</p>
<blockquote>
<p>PS.: warum denn das einfache &amp; klare 'it-&gt;m_symbol == &quot;NNN&quot;' gegen das hässliche '0 == it-&gt;m_symbol.compare(&quot;NNN&quot;)' austauschen?</p>
</blockquote>
<p>Hatte immer wieder Fehler und darum verschiedenes ausprobiert. Kommt wieder weg.</p>
<p>Ich versteh eine Zeile nicht, in dem Code:</p>
<pre><code class="language-cpp">*out++ = *it;
</code></pre>
<p><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="😕"
    /> Was tut die genau?</p>
<p>Und auf was zeigt out am Ende?<br />
Und wie krieg ich nun nur die zusammengerechneten Fractionen raus? Also nur eine je Symbol?</p>
<p>Danke nochmal <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/1238022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238022</guid><dc:creator><![CDATA[Evil Knevil]]></dc:creator><pubDate>Fri, 02 Mar 2007 12:00:57 GMT</pubDate></item></channel></rss>