<?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[das geht doch viel schöner ;) -&amp;gt; Codeschnippsel]]></title><description><![CDATA[<p>Holla,</p>
<p>der methode wird ein vector übergeben an dessen ende neue elemente hinzugefügt werden sollen. p ist ein vector der der nur aus 0en und 1en besteht.<br />
v ist ein vektor der einträge hat (eigentlich genau soviele wie p 1en hat).<br />
BeispieL.<br />
p = 1 0 1 0 1<br />
v = 5 2 9<br />
M zu beginn:<br />
M = 9 8 7 6 2<br />
M zu ende:<br />
M = 9 8 7 6 2 5 0 2 0 9<br />
also im grunde wird p an M gehängt und für jede 1 wird der nächste wert von v genommen. also angehängt wird: 5 0 2 0 9 weil ja p = 1 0 1 0 1 ist.</p>
<p>Hier meine idee...</p>
<pre><code class="language-cpp">void 
Class::Insert(std::vector&lt;double&gt;&amp; M, 
                     std::vector&lt;double&gt;&amp; p,
                     std::vector&lt;double&gt;&amp; v)
{
    int el = 0;
    for(int i = 0; i &lt; p.size(); i++)
    {
        if( p[i] != 0.0 )
            M.push_back(v[el++]);
        else
            M.push_back(0.0);   
    }
}
</code></pre>
<p>ich weiß ihr hab verbesserungsvorschläge <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/157934/das-geht-doch-viel-schöner-gt-codeschnippsel</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 11:28:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157934.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Aug 2006 18:58:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Wed, 30 Aug 2006 18:58:52 GMT]]></title><description><![CDATA[<p>Holla,</p>
<p>der methode wird ein vector übergeben an dessen ende neue elemente hinzugefügt werden sollen. p ist ein vector der der nur aus 0en und 1en besteht.<br />
v ist ein vektor der einträge hat (eigentlich genau soviele wie p 1en hat).<br />
BeispieL.<br />
p = 1 0 1 0 1<br />
v = 5 2 9<br />
M zu beginn:<br />
M = 9 8 7 6 2<br />
M zu ende:<br />
M = 9 8 7 6 2 5 0 2 0 9<br />
also im grunde wird p an M gehängt und für jede 1 wird der nächste wert von v genommen. also angehängt wird: 5 0 2 0 9 weil ja p = 1 0 1 0 1 ist.</p>
<p>Hier meine idee...</p>
<pre><code class="language-cpp">void 
Class::Insert(std::vector&lt;double&gt;&amp; M, 
                     std::vector&lt;double&gt;&amp; p,
                     std::vector&lt;double&gt;&amp; v)
{
    int el = 0;
    for(int i = 0; i &lt; p.size(); i++)
    {
        if( p[i] != 0.0 )
            M.push_back(v[el++]);
        else
            M.push_back(0.0);   
    }
}
</code></pre>
<p>ich weiß ihr hab verbesserungsvorschläge <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1127901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127901</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Wed, 30 Aug 2006 18:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Wed, 30 Aug 2006 19:01:25 GMT]]></title><description><![CDATA[<p>Jain, eher eine Anmekrung:</p>
<p>Ein vergleich auf 0.0 wird in den seltensten Fällen klappen. Wird wohl eher meist 0.000000001 oder ähnlich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127905</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Wed, 30 Aug 2006 19:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Wed, 30 Aug 2006 20:20:27 GMT]]></title><description><![CDATA[<p>Hallo Mati,</p>
<p>die Frage ist doch: was ist schön?<br />
zunächst mal so &quot;handwerkliche&quot; Sachen.<br />
- Insert ist keine Methode, sondern eine Funktion, da auf keinerlei interne Member von Class zugegriffen wird<br />
- Parameter die innerhalb der Funktion/Methode nicht verändert werden. sollten per const Referenz (oder Value) übergeben werden. (s. Scott Meyers)<br />
- es gibt einen 'signed/unsigned mismatch' da Du einen int (i) mit einem size_t (p.size()) vergleichst. Also für i besser std::size_t wählen<br />
- besser prefix-Inkrement (++i) statt postfix-Inkrement (i++); ist bei 'int' zwar egal, aber bei Iteratoren nicht immer (s. Scott Meyers)<br />
- Iteratoren sollten vor der Indizierung bevorzugt werden (ist wahrscheinlich auch schneller)</p>
<p>Alles zusammen macht das:</p>
<pre><code class="language-cpp">void Insert(std::vector&lt;double&gt;&amp; M,
                     const std::vector&lt;double&gt;&amp; p,
                     const std::vector&lt;double&gt;&amp; v)
{
    std::vector&lt;double&gt;::const_iterator el = v.begin();
    for( std::vector&lt;double&gt;::const_iterator i = p.begin(); i != p.end(); ++i )
    {
        if( *i != 0.0 )
            M.push_back(*el++);
        else
            M.push_back(0.0);  
    }
}
</code></pre>
<p>Man kann das ganze noch abstrahieren, wenn man auf die Typen - hier 'std::vector&lt; double &gt;' - verzichtet. Es muss ja auch nicht notwendigerweise ein vector weiter gefüllt werden. Mit Template-Technik geht das dann so:</p>
<pre><code class="language-cpp">template&lt; typename I1, typename I2, typename O &gt;
O Insert( I1 first, I1 last, I2 first2, O out )
{
    for( ; first != last; ++first, ++out )
    {
        if( *first )
            *out = *first2++;
        else
            *out = std::iterator_traits&lt; I2 &gt;::value_type();
    }
    return out;
}
</code></pre>
<p>.. ist auch weniger Schreibarbeit. Der dazu gehörige Aufruf wäre dann:</p>
<pre><code class="language-cpp">Insert( p.begin(), p.end(), v.begin(), back_inserter( M ) );
</code></pre>
<p>.. und es ist auch keine Änderung des Codes notwendig, wenn aus p ein vector&lt; bool &gt; werden würde.</p>
<p>kommen wir zurück zur Anfangsfrage: ist das schön?</p>
<p>Ach und noch was: passt der Name 'Insert' ?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127953</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 30 Aug 2006 20:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Wed, 30 Aug 2006 20:43:21 GMT]]></title><description><![CDATA[<p>.. bleibt noch die Variante für den Freak <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<pre><code class="language-cpp">template&lt; typename I2 &gt;
struct GetIfNotZero
{
    typedef typename std::iterator_traits&lt; I2 &gt;::value_type result_type;
    explicit GetIfNotZero( I2 first2 ) : m_cur( first2 ) {}
    template&lt; typename T1 &gt;
    result_type operator()( const T1&amp; x )
    {
        return x? *m_cur++: result_type();
    }

private:
    I2 m_cur;
};
template&lt; typename I2 &gt;
GetIfNotZero&lt; I2 &gt; getIfNotZero( I2 first2 )
{
    return GetIfNotZero&lt; I2 &gt;( first2 );
}
</code></pre>
<p>Aufruf:</p>
<pre><code class="language-cpp">std::transform( p.begin(), p.end(), std::back_inserter( M ), getIfNotZero( v.begin() ) );
</code></pre>
<p>leider nicht ganz Standard-konform, da der Funktor Seiteneffekte hat (++m_cur).</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127974</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 30 Aug 2006 20:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Wed, 30 Aug 2006 21:43:58 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>leider nicht ganz Standard-konform, da der Funktor Seiteneffekte hat (++m_cur).</p>
</blockquote>
<p>Mach doch einfach einen InputIterator draus...<br />
(Aber das IfNotZero gefällt mir gar nicht, hätte da lieber ein schlichtes get_if&lt;Pred&gt;. Oder besser noch einen input_switch_iterator&lt;ControlIter, Pred, PassInputIter, FailInputIter&gt; <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1128003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128003</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 30 Aug 2006 21:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to das geht doch viel schöner ;) -&amp;gt; Codeschnippsel on Thu, 31 Aug 2006 17:37:27 GMT]]></title><description><![CDATA[<p>SUPER! Vielen dank.<br />
Ich weiß nicht wie es den anderen anfängern geht aber ich lerne durch solche Hilfe wirklich am meisten!<br />
Danke an euch und die Vorschläge die ihr gebracht finde ich super und werde sie mir genau zu Gemüte führen! _DANKE_</p>
<p>Noch ne kleine Frage: Wie kann ich den dann einen Vergleich mit != 0.0 ansetzten der auf alle fälle korrekt läuft?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128626</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 31 Aug 2006 17:37:27 GMT</pubDate></item></channel></rss>