<?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[slicing iterator]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eine fertigen Iterator der nicht um 1 sondern um N weiter geht?</p>
<p>Danke + Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281861/slicing-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 13:36:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281861.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Feb 2011 10:39:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 10:39:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eine fertigen Iterator der nicht um 1 sondern um N weiter geht?</p>
<p>Danke + Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018620</guid><dc:creator><![CDATA[Drehleiter]]></dc:creator><pubDate>Wed, 09 Feb 2011 10:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 10:46:44 GMT]]></title><description><![CDATA[<p>Drehleiter schrieb:</p>
<blockquote>
<p>gibt es eine fertigen Iterator der nicht um 1 sondern um N weiter geht?</p>
</blockquote>
<p>Was hindert dich, statt &quot;++it&quot; einfach &quot;std::advance(it,N)&quot; zu schreiben? Für sowas brauchts keine extra Wrapper-Iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018626</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Feb 2011 10:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 10:55:47 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Drehleiter schrieb:</p>
<blockquote>
<p>gibt es eine fertigen Iterator der nicht um 1 sondern um N weiter geht?</p>
</blockquote>
<p>Was hindert dich, statt &quot;++it&quot; einfach &quot;std::advance(it,N)&quot; zu schreiben? Für sowas brauchts keine extra Wrapper-Iteratoren.</p>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/std/iterator/advance/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/advance/</a></p>
<blockquote>
<p>If i is a Random Access Iterator, the function uses once operator+ or operator-, otherwise, the function uses repeatedly the increase or decrease operator (operator++ or operator--) until n elements have been advanced.</p>
</blockquote>
<p>Wie wird denn differenziert, ob der Parameter ein Random Access Iterator ist oder nicht?<br />
Also wie kann ich es Umsetzen, dass er wenn die Funktion x existiert, diese<br />
aufgerufen wird und ansonsten Funktion y?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018631</guid><dc:creator><![CDATA[Nachgefragt...]]></dc:creator><pubDate>Wed, 09 Feb 2011 10:55:47 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 11:01:13 GMT]]></title><description><![CDATA[<p>Unterschieden wird mit Hilfe von <a href="http://www.sgi.com/tech/stl/iterator_tags.html" rel="nofollow">Iterator Tags</a> Ein anderes Suchwort wäre TypeTraits.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018633</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Wed, 09 Feb 2011 11:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 11:04:58 GMT]]></title><description><![CDATA[<p>Tobias Gerg schrieb:</p>
<blockquote>
<p>Unterschieden wird mit Hilfe von <a href="http://www.sgi.com/tech/stl/iterator_tags.html" rel="nofollow">Iterator Tags</a> Ein anderes Suchwort wäre TypeTraits.</p>
</blockquote>
<p>thx <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2018636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018636</guid><dc:creator><![CDATA[Nachgefragt...]]></dc:creator><pubDate>Wed, 09 Feb 2011 11:04:58 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 11:55:11 GMT]]></title><description><![CDATA[<p>Drehleiter schrieb:</p>
<blockquote>
<p>gibt es eine fertigen Iterator der nicht um 1 sondern um N weiter geht?</p>
</blockquote>
<p>nicht ganz, aber fast!</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Was hindert dich, statt &quot;++it&quot; einfach &quot;std::advance(it,N)&quot; zu schreiben?</p>
</blockquote>
<p>Vielleicht die Tatsache, dass man mit Iteratoren i.A. Algorithmen aufruft, in denen stets nur einmal inkrementiert wird.</p>
<p>.. mit boost:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt; // copy
#include &lt;vector&gt;
#include &lt;iterator&gt; // ostream_iterator, advance
#include &lt;boost/iterator/iterator_adaptor.hpp&gt;

template&lt; typename T, int N &gt;
class Slicer : public boost::iterator_adaptor&lt; Slicer&lt; T, N &gt;, T &gt;
{
public:
    Slicer( T i = T() ) : iterator_adaptor_( i ) {}
    void increment()
    {
        std::advance( base_reference(), N ); // hier passiert das N x ++i
    }
};
template&lt; int N, typename T &gt;  // Factory-Funktion (reduziert die Schreibarbeit bei der Anwendung)
Slicer&lt; T, N &gt; slice( T i ) { return Slicer&lt; T, N &gt;( i ); }

int main()
{
    using namespace std;
    const int arr[] = { 1, -2, 3, 4, -5, 6, -7, 8, 9, 10, -11, 12 };
    vector&lt; int &gt; v( arr, arr+sizeof(arr)/sizeof(*arr) );
    copy( slice&lt;3&gt;( v.begin() ), slice&lt;3&gt;( v.end() ), ostream_iterator&lt; int &gt;( cout &lt;&lt; &quot;&gt; &quot;, &quot; &quot; ) );
    cout &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Die Ausgabe bei dieser Demo wäre:</p>
<pre><code>&gt; 1 4 -7 10
</code></pre>
<p><strong>WARNUNG</strong>: bei dieser Konstruktion muss der Anwender garantieren, dass der Ende-Iterator auch erreicht wird. Also in diesem Fall ist die Größe des Vektors (=12) ein Vielfaches des Slice-Sprungs (=3).</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018661</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 09 Feb 2011 11:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 12:38:43 GMT]]></title><description><![CDATA[<p>Die Sache hat leider einen kleinen Haken, nämlich, dass man bei einer naiven Implementierung typischerweise über das Ende der ursprünglichen Sequenz hinausspringt. Ich hatte mir auch einen solchen Iterator gebaut, mit dem ich über Elemente einer Matrixspalte iterieren kann, wobei die Elemente Zeilenweise in einem std::vector abgelegt waren. Der slice-Iterator speicherte nur einen Iterator und hat bei op++ eben +=N durchgeführt. Aber dabei kann es vorkommen, dass der Iterator nicht mehr gültig ist, weil er zuweit hinter das Ende der Sequenz zeigt</p>
<p>Beispiel bei einer 3x3-Matrix:</p>
<pre><code>+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+
|end|
+---+
</code></pre>
<p>Wenn ich hier ein Iterator-Paar für die 3. Spalte haben will, was soll dann der zweite speichern? end()+2 gibt es nicht. In diese Falle bin ich selbst getreten. Ich habe es erst gemerkt als ich den Debug-Modus der Standardbibliothek aktiviert hatte und ich dementsprechend Fehlermeldungen bzgl ungültiger Iteratoren gesehen habe.</p>
<p>Daher sollte man sich vielleicht auf Random-Access-Iteratoren beschränken, und die Elemente über gespeicherte Indizes adressieren...</p>
<pre><code class="language-cpp">...
  reference_type operator*() const
  {
    return m_base_iter[m_index];
  }
  slice_iterator&amp; operator++()
  {
    m_index += m_stride;
    return *this;
  }
...
</code></pre>
<p>etc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018669</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 09 Feb 2011 12:38:43 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Wed, 09 Feb 2011 12:45:07 GMT]]></title><description><![CDATA[<p>In boost,range gibt es Adaptoren für sowas:</p>
<pre><code class="language-cpp">#include &lt;boost/range/adaptor/strided.hpp&gt;
#include &lt;boost/range/algorithm/copy.hpp&gt;
#include &lt;vector&gt;

std::vector&lt;int&gt; v;

//v fuellen

boost::copy
   ( v | boost::adaptors::strided(2) // 2er Schrittweite
   , target );
</code></pre>
<p>Es gibt auch noch alle möglichen anderen Adaptoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018692</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 09 Feb 2011 12:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to slicing iterator on Thu, 10 Feb 2011 10:50:47 GMT]]></title><description><![CDATA[<p>vieln Dank für alle Antworten und insbesondere für das Aufmerksam-Machen auf die Klippen. Ich werde es mal boost::range ausprobieren.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019069</guid><dc:creator><![CDATA[Drehleiter]]></dc:creator><pubDate>Thu, 10 Feb 2011 10:50:47 GMT</pubDate></item></channel></rss>