<?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[STL Algo für jeden zweiten Iterator?]]></title><description><![CDATA[<p>Ich gewöhne mir gerade mal an, die STL Methoden zu benutzen und nicht immer alles selber zu schreiben.<br />
Ich hab ein double x und double y und einen vector&lt;double&gt; den ich loopen muss und abwechselnd mal x mal y addieren muss.<br />
Nun hab ich mir std::transform mal angeguckt, sehe jedoch nicht, wie ich diese alterierende verhalten damit erzeugen kann.</p>
<p>Gibt es da was schnelles, um dies zu bewerkstelligen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262721/stl-algo-für-jeden-zweiten-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 13:03:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262721.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Mar 2010 13:48:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 13:48:54 GMT]]></title><description><![CDATA[<p>Ich gewöhne mir gerade mal an, die STL Methoden zu benutzen und nicht immer alles selber zu schreiben.<br />
Ich hab ein double x und double y und einen vector&lt;double&gt; den ich loopen muss und abwechselnd mal x mal y addieren muss.<br />
Nun hab ich mir std::transform mal angeguckt, sehe jedoch nicht, wie ich diese alterierende verhalten damit erzeugen kann.</p>
<p>Gibt es da was schnelles, um dies zu bewerkstelligen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866997</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Mar 2010 13:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:09:31 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Ich hab ein double x und double y und einen vector&lt;double&gt; den ich loopen muss und abwechselnd mal x mal y addieren muss.</p>
</blockquote>
<p>Meinst du sowas?</p>
<pre><code class="language-cpp">std::vector&lt;double&gt; vec = /* ... */;

double x = vec[0] + vec[2] + vec[4] + /* ... */;
double y = vec[1] + vec[3] + vec[5] + /* ... */;
</code></pre>
<p>Falls ja, könntest du das folgendermassen machen. Den <code>operator()</code> kannst du natürlich auch übersichtlicher implementieren... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<pre><code class="language-cpp">struct xy_adder
{
	xy_adder(double&amp; x, double&amp; y) : x(x), y(y), is_x(false) {}

	void operator() (double elem)
	{
		((is_x ^= 1) ? x : y) += elem;
	}

	double&amp; x;
	double&amp; y;
	bool is_x;
};

int main()
{
	std::vector&lt;double&gt; v;
	// ...
	double x = 0;
	double y = 0;

	std::for_each(v.begin(), v.end(), xy_adder(x,y));
}
</code></pre>
<p>Aber nicht immer ist ein separater Funktor die bessere Lösung. Manchmal reicht auch eine gewöhnliche Schleife.</p>
<p><em>Edit: Werner Salomon hat eigentlich Recht, beherzige seinen Vorschlag. Vielleicht hilft dir mein Code ja sonst mal... <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="😉"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867004</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:07:46 GMT]]></title><description><![CDATA[<p>.. klarer Fall von Designfehler. Du braucht eine Klasse Vektor(mathematisch) bzw. Position:</p>
<pre><code class="language-cpp">struct Pos {
    double m_x;
    double m_y;
};
std::vector&lt; Pos &gt; ...;
</code></pre>
<p>Ich bin sicher, dass das Dein Programm auch an anderen Stellen vereinfacht <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="😉"
    /><br />
Fertige <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-154875.html" rel="nofollow">Positions-Klassen dieser Art findest Du u.a. hier</a> - musst halt immer den Z-Wert weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867006</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:07:56 GMT]]></title><description><![CDATA[<p>Willst du den vector&lt;double&gt; verändern oder die geänderten Werte in einen neuen vector packen? Falls ersteres müsste doch eigentlich for_each ausreichen.</p>
<p>Davon unabhängig kannst du dir ja einen Funktor schreiben, der double x und double y übergeben bekommt und der intern eine Zählvariable hochzählt bei jedem Aufruf von op(). Dann kannst du bei gerader Zählvariable x addieren und bei ungerader Zählvariable y addieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867008</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:19:11 GMT]]></title><description><![CDATA[<p>Öh, ja, nein, ja <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>
<p>Scherz. Also nochmal: Dieser Vektor ist linearisiert, wie ihr richtig erkannt habt. Das hat seinen Grund. Er wird so exakt als ein großer Speicherblock an die Grafikkarte geschickt.<br />
Wir verwenden osg::Vec2d und da wir nicht sicher sein können, ob x und y dort als einzige Zustände des Structs existieren (oder mal n byte alignment oder so), können wir auch nicht ohne umkopieren riskieren, diese blind zu linearisieren.</p>
<p>Der code ist mit ner for loop simpel:</p>
<pre><code class="language-cpp">for(unsigned i = 0; i &lt; vertices.size()-1; i+=2)
   {
      vertices[i] = vertices[i]+_offset.x();
      vertices[i+1] = vertices[i+1]+_offset.y();

   }
</code></pre>
<p>Ich dachte nur, es geht auch eleganter mit stl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867013</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:23:54 GMT]]></title><description><![CDATA[<p>Also ich hatte jetzt gerade mal einen eigenen Iterator implementiert:</p>
<pre><code class="language-cpp">// transform algorithm example
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

int op_increase (int i) { return ++i; }

template&lt;class T&gt; class double_iterator
{
private:
  typename vector&lt;T&gt;::iterator it;
public:
  double_iterator(typename vector&lt;T&gt;::iterator i):it(i){}
  double_iterator operator++()
  {
    ++it;
    ++it;
    return it;
  }
  double_iterator operator++(int)
  {
    typename vector&lt;T&gt;::iterator temp(it);
    ++it;
    ++it;
    return temp;
  }
  bool operator!=(const double_iterator&lt;T&gt;&amp; rhs)
  {
    return it!=rhs.it;
  }
  bool operator==(const double_iterator&lt;T&gt;&amp; rhs)
  {
    return it==rhs.it;
  }
  T&amp; operator*()
  {
    return *it;
  }
};

int main () {
  vector&lt;int&gt; foo,bar;
  vector&lt;int&gt;::iterator it;

  // set some values:
  for (int i=1; i&lt;7; i++) foo.push_back (i*10); //  foo: 10 20 30 40 50 60

  bar.resize(foo.size());     // allocate space
  transform (double_iterator&lt;int&gt;(foo.begin()),double_iterator&lt;int&gt;(foo.end()), double_iterator&lt;int&gt;(bar.begin()), op_increase);
                                                  // bar: 11 0 31 0 51 0

  cout &lt;&lt; &quot;bar contains:&quot;;
  for (it=bar.begin(); it!=bar.end(); ++it)
    cout &lt;&lt; &quot; &quot; &lt;&lt; *it;

  cout &lt;&lt; endl;
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1867017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867017</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:23:54 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:24:02 GMT]]></title><description><![CDATA[<p>Eleganter vielleicht, schneller nicht wirklich. Aber im Endeffekt furzegal. Die STL-Algorithmen zu verwenden, nur damit man sie verwendet hat, ist nicht besonders sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867018</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to STL Algo für jeden zweiten Iterator? on Wed, 10 Mar 2010 14:41:53 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Ich dachte nur, es geht auch eleganter mit stl.</p>
</blockquote>
<p>Stichwort elegant <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="🕶"
    /> - na ja es gibt Möglichkeiten:</p>
<pre><code class="language-cpp">#include &lt;boost/iterator/iterator_adaptor.hpp&gt;

#include &lt;algorithm&gt; // transform
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt; // ostream_iterator
#include &lt;functional&gt; // plus

struct CycleIter : public boost::iterator_adaptor&lt; CycleIter, std::vector&lt; double &gt;::const_iterator
    , boost::use_default, boost::forward_traversal_tag &gt;
{
    CycleIter( std::vector&lt; double &gt;::const_iterator first, std::vector&lt; double &gt;::const_iterator last )
        : iterator_adaptor_( first )
        , m_begin( first )
        , m_end( last )
    {}
    void increment()
    {
        if( ++base_reference() == m_end )
            base_reference() = m_begin;
    }
private:
    std::vector&lt; double &gt;::const_iterator m_begin;
    std::vector&lt; double &gt;::const_iterator m_end;
};

int main()
{
    using namespace std;

    vector&lt; double &gt; vertices( 8, 10.0 );
    vector&lt; double &gt; offset(2);
    offset[0] = 1.0; // offset.x()
    offset[1] = 2.0; // offset.y()
    transform( vertices.begin(), vertices.end(), CycleIter( offset.begin(), offset.end() ), 
        ostream_iterator&lt; double &gt;( cout &lt;&lt; &quot;Ergebnis: &quot;, &quot; &quot;), plus&lt; double &gt;() );
    // Bem.: statt ostream_iterator&lt; double &gt;(..) ginge natürlich auch vertices.begin()
    cout &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Die Ausgabe ist:</p>
<pre><code>Ergebnis: 11 12 11 12 11 12 11 12
</code></pre>
<p>.. ob's brauchbar ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867031</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Wed, 10 Mar 2010 14:41:53 GMT</pubDate></item></channel></rss>