<?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[Eigene Iteratoren schreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte meine eigenen Iteratoren schreiben, die einen anderen Iterator<br />
kapselt. Der Iterator soll ein Filter sein, der nur bestimmte Elemente des<br />
gekapselten Iterator zurückgibt. Gibt es ne Basisklasse für die<br />
Standard-Iteratoren (von vector etc.)? Oder muss ich da für jeden Typ, den<br />
ich werwende einen Iterator schreiben, der so einen Iterator kapselt um<br />
so eine gemeinsame Basis zu schaffen.<br />
Da ich noch relativ neu bin...<br />
Wenn ich #include&lt;vector&gt; schreibe, dann inkludiert er doch in den Include-<br />
Verzeichnissen nach vector.hpp, oder? Aber ich find da nix, obwohl es funkt...<br />
Nur in meinem boost-Verzeichnis. Sonst hätte ich ja selbst nachgekuckt.</p>
<p>Gruß,<br />
Iterator</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170876/eigene-iteratoren-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 08:07:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170876.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Jan 2007 15:01:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sat, 20 Jan 2007 15:01:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte meine eigenen Iteratoren schreiben, die einen anderen Iterator<br />
kapselt. Der Iterator soll ein Filter sein, der nur bestimmte Elemente des<br />
gekapselten Iterator zurückgibt. Gibt es ne Basisklasse für die<br />
Standard-Iteratoren (von vector etc.)? Oder muss ich da für jeden Typ, den<br />
ich werwende einen Iterator schreiben, der so einen Iterator kapselt um<br />
so eine gemeinsame Basis zu schaffen.<br />
Da ich noch relativ neu bin...<br />
Wenn ich #include&lt;vector&gt; schreibe, dann inkludiert er doch in den Include-<br />
Verzeichnissen nach vector.hpp, oder? Aber ich find da nix, obwohl es funkt...<br />
Nur in meinem boost-Verzeichnis. Sonst hätte ich ja selbst nachgekuckt.</p>
<p>Gruß,<br />
Iterator</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213210</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Sat, 20 Jan 2007 15:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sat, 20 Jan 2007 17:19:37 GMT]]></title><description><![CDATA[<p>IteratorBasis schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich möchte meine eigenen Iteratoren schreiben, die einen anderen Iterator<br />
kapselt. Der Iterator soll ein Filter sein, der nur bestimmte Elemente des<br />
gekapselten Iterator zurückgibt. Gibt es ne Basisklasse für die<br />
Standard-Iteratoren (von vector etc.)? Oder muss ich da für jeden Typ, den<br />
ich werwende einen Iterator schreiben, der so einen Iterator kapselt um<br />
so eine gemeinsame Basis zu schaffen.</p>
</blockquote>
<p>Verschiedene Iteratoren haben für gewöhnlich keine gemeinsame Bais - die Standardbibliothek macht ohnehin nur sehr sparsam von Vererbung Gebrauch. Eine Eigene Iteratorklasse, die einen anderen Iterator kapselt, ist nicht besonders schwer. Als Ausganngspunkt kannst du ja das hier nehmen</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class MyIterator;

template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator++(MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator--(MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator++(MyIterator&lt; T &gt;&amp;, int);
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator--(MyIterator&lt; T &gt;&amp;, int);

template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator+=(MyIterator&lt; T &gt;&amp;, typename MyIterator&lt; T &gt;::difference_type);
template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator-=(MyIterator&lt; T &gt;&amp;, typename MyIterator&lt; T &gt;::difference_type);
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator+(const MyIterator&lt; T &gt;&amp;, typename MyIterator&lt; T &gt;::difference_type);
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator-(const MyIterator&lt; T &gt;&amp;, typename MyIterator&lt; T &gt;::difference_type);

template&lt;typename T&gt; bool operator==(const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; bool operator!=(const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; bool operator&lt; (const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; bool operator&lt;=(const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; bool operator&gt; (const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);
template&lt;typename T&gt; bool operator&gt;=(const MyIterator&lt; T &gt;&amp;, const MyIterator&lt; T &gt;&amp;);

template&lt;typename T&gt;
class MyIterator
{
public:
    typedef typename std::iterator_traits&lt; T &gt;::difference_type   difference_type;
    typedef typename std::iterator_traits&lt; T &gt;::value_type        value_type;
    typedef typename std::iterator_traits&lt; T &gt;::pointer           pointer;
    typedef typename std::iterator_traits&lt; T &gt;::reference         reference;
    typedef typename std::iterator_traits&lt; T &gt;::iterator_category iterator_category;

private:
    T current_;
public:
    MyIterator() : current_() {}
    explicit MyIterator(T x) : current_( x ) {}

    reference operator*() const { return *current_; }
    const T&amp; operator-&gt;() const { return current_; }

    reference operator[](difference_type n) const { return current_[ n ]; }

    friend MyIterator&amp; operator++&lt; T &gt;(MyIterator&amp;);
    friend MyIterator&amp; operator--&lt; T &gt;(MyIterator&amp;);
    friend MyIterator  operator++&lt; T &gt;(MyIterator&amp;, int);
    friend MyIterator  operator--&lt; T &gt;(MyIterator&amp;, int);

    friend MyIterator&amp; operator+=&lt; T &gt;(MyIterator&amp;, difference_type);
    friend MyIterator&amp; operator-=&lt; T &gt;(MyIterator&amp;, difference_type);
    friend MyIterator  operator+ &lt; T &gt;(const MyIterator&amp;, difference_type);
    friend MyIterator  operator- &lt; T &gt;(const MyIterator&amp;, difference_type);

    friend bool operator==&lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
    friend bool operator!=&lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
    friend bool operator&lt; &lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
    friend bool operator&lt;=&lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
    friend bool operator&gt; &lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
    friend bool operator&gt;=&lt; T &gt;(const MyIterator&amp;, const MyIterator&amp;);
};

template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator++(MyIterator&lt; T &gt;&amp; i)      { return ++i.current_, i; }
template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator--(MyIterator&lt; T &gt;&amp; i)      { return --i.current_, i; }
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator++(MyIterator&lt; T &gt;&amp; i, int) { return MyIterator&lt; T &gt;( i.current_++ ); }
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator--(MyIterator&lt; T &gt;&amp; i, int) { return MyIterator&lt; T &gt;( i.current_-- ); }

template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator+=(MyIterator&lt; T &gt;&amp; i, typename MyIterator&lt; T &gt;::difference_type n)
{
    i.current_ += n;
    return i;
}
template&lt;typename T&gt; MyIterator&lt; T &gt;&amp; operator-=(MyIterator&lt; T &gt;&amp; i, typename MyIterator&lt; T &gt;::difference_type n)
{
    i.current_ += n;
    return i;
}
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator+(const MyIterator&lt; T &gt;&amp; i, typename MyIterator&lt; T &gt;::difference_type n)
{
    return MyIterator&lt; T &gt;( i.current_ + n );
}
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator+(typename MyIterator&lt; T &gt;::difference_type n, const MyIterator&lt; T &gt;&amp; i)
{
    return i + n;
}
template&lt;typename T&gt; MyIterator&lt; T &gt;  operator-(const MyIterator&lt; T &gt;&amp; i, typename MyIterator&lt; T &gt;::difference_type n)
{
    return MyIterator&lt; T &gt;( i.current_ - n );
}

template&lt;typename T&gt; bool operator==(const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ == rhs.current_; }
template&lt;typename T&gt; bool operator!=(const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ != rhs.current_; }
template&lt;typename T&gt; bool operator&lt; (const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ &lt;  rhs.current_; }
template&lt;typename T&gt; bool operator&lt;=(const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ &lt;= rhs.current_; }
template&lt;typename T&gt; bool operator&gt; (const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ &gt;  rhs.current_; }
template&lt;typename T&gt; bool operator&gt;=(const MyIterator&lt; T &gt;&amp; lhs, const MyIterator&lt; T &gt;&amp; rhs) { return lhs.current_ &gt;= rhs.current_; }
</code></pre>
<blockquote>
<p>Wenn ich #include&lt;vector&gt; schreibe, dann inkludiert er doch in den Include-<br />
Verzeichnissen nach vector.hpp, oder? Aber ich find da nix, obwohl es funkt...<br />
Nur in meinem boost-Verzeichnis. Sonst hätte ich ja selbst nachgekuckt.</p>
<p>Gruß,<br />
Iterator</p>
</blockquote>
<p>Es ist dem Compiler überlassen, was bei #include &lt;vector&gt; passiert. Ein Header vector.hpp ist nicht Teil der Standardbibliothek - könnte aber als Erweiterung deines Compilers oder als Teil einer anderen Bibliothek existieren. iirc existiert für boosts mpl ein Header vector.hpp. Für boost is es allerdings empfohlene Praxis, Header mit explizitem relativen Pfad zu inkludieren (beginnend mit boost/ ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213300</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sat, 20 Jan 2007 17:28:39 GMT]]></title><description><![CDATA[<p>camper: Wieso verwendest Du nicht 'std::iterator&lt;&gt;' als Basisklasse? Das erspart einem zumindest die ganzen Typedefs.</p>
<p>/EDIT: Ah, Groschen gefallen. Vergisses.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213305</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sat, 20 Jan 2007 17:43:34 GMT]]></title><description><![CDATA[<p>Im Grunde ist es witzig, dass in den wenigen Fällen, in denen die Standardbibliothek etwas mehr als das Notwendige &quot;der Bequemlichkeit wegen&quot; anbietet, dieses Mehr meistens überhaupt nichts bequmer macht. Jedenfalls spart man mit std::iterator nur eine handvoll Zeichen ein. Bei sowenig Ersparnis ist mir dann sogar die damit nötige Vererbung zuviel. <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>Wenn es um weniger Schreiben geht, könnte man hier leicht sparen, indem man die Operatoren von vornherein nicht als Templates anlegt. Darauf habe ich hier der Systematik wegen verzichtet. Und falls sich jemand wegen den außerhalb der Klasse angelegten Operatoren wie ++ und += wundert: das dient der Imitation von Pointern, bei denen diese Operatoren auf rvalues nicht angewendet werden können (für Iteratoren im allgemeinen ist es undefiniertes Verhalten); man denke an das berüchtigte --container.end(). Für den Zuweisungsoperator geht das leider nicht und ich bin bekanntermaßen kein Fan von const T als Rückgabetyp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213312</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 20 Jan 2007 17:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sat, 20 Jan 2007 19:06:58 GMT]]></title><description><![CDATA[<p>Wenn du eh Boost hast (und auch sonst), solltest du <a href="http://www.boost.org/libs/iterator" rel="nofollow">Boost.Iterator</a> verwenden. Da ist sogar bereits ein Iterator-Adapter namens <a href="http://www.boost.org/libs/iterator/doc/filter_iterator.html" rel="nofollow">filter_iterator</a> drin, der so ungefähr das tun sollte, was du haben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213362</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 20 Jan 2007 19:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sun, 21 Jan 2007 14:45:40 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Antworten!</p>
<p>Haben mir wirklich weitergeholfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213777</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Sun, 21 Jan 2007 14:45:40 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sun, 21 Jan 2007 22:24:15 GMT]]></title><description><![CDATA[<p>Wie erkenn ich denn, ob ich am Ende des Iterators angekommen bin,<br />
wenn ich meinen ursprünglichen vector (oder ähnliches) nicht mehr zur Verfügung<br />
hab, sondern nur den std::iterator?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214086</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Sun, 21 Jan 2007 22:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sun, 21 Jan 2007 22:47:49 GMT]]></title><description><![CDATA[<p>IteratorBasis schrieb:</p>
<blockquote>
<p>Wie erkenn ich denn, ob ich am Ende des Iterators angekommen bin,<br />
wenn ich meinen ursprünglichen vector (oder ähnliches) nicht mehr zur Verfügung<br />
hab, sondern nur den std::iterator?</p>
</blockquote>
<p>indem Du Dir innerhalb des neuen (Filter-)Iterators auch den ursprünglichen Ende-Iterator merkst. Folge dem Link von .filmor</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Da ist sogar bereits ein Iterator-Adapter namens <a href="http://www.boost.org/libs/iterator/doc/filter_iterator.html" rel="nofollow">filter_iterator</a> drin, der so ungefähr das tun sollte, was du haben willst.</p>
</blockquote>
<p>und schau Dir <a href="http://www.boost.org/libs/iterator/doc/filter_iterator.html#example" rel="nofollow">das Beispiel</a> an.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214101</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 21 Jan 2007 22:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Sun, 21 Jan 2007 23:02:05 GMT]]></title><description><![CDATA[<p>Danke Werner,</p>
<p>ich dachte es geht etvl. ohne (zusätzliches) cachen des letzten Elementes...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214116</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Sun, 21 Jan 2007 23:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 00:46:02 GMT]]></title><description><![CDATA[<p>Warum geht das so nicht?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

template&lt;typename T&gt;
class Test {
    Test();
    virtual ~Test();

private:
    std::vector&lt;T&gt;::iterator it;
};
</code></pre>
<p>Der Kompiler meldet:<br />
9 Test.h expected `;' before &quot;it&quot;</p>
<p>Mit nem normalen std::vector&lt;T&gt; geht es, warum nicht mit std::vector&lt;T&gt;::iterator?<br />
Vielen Dank im voraus,<br />
Iterator</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214150</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Mon, 22 Jan 2007 00:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 05:43:34 GMT]]></title><description><![CDATA[<p>fehlt eine typename:</p>
<pre><code class="language-cpp">private:
    typename std::vector&lt;T&gt;::iterator it;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1214166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214166</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 22 Jan 2007 05:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 10:38:22 GMT]]></title><description><![CDATA[<p>Wie easy...</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214325</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Mon, 22 Jan 2007 10:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 13:49:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>jetzt hab ich das Problem, dass ich nicht weiß wie ich über einen<br />
const std::vector&lt;T&gt; iteriere...<br />
Solange ich das const weglasse funktioniert es, sonst nicht...</p>
<pre><code class="language-cpp">const std::vector&lt;T&gt;&amp; listb = myMethod(); // liefert const std::vector&lt;T&gt;&amp; zurück
    typename std::vector&lt;T&gt;::iterator it2 = listb.begin();
</code></pre>
<p>Kann ich nicht über einen const Vector iterieren?</p>
<p>Gruß,<br />
Iterator</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214471</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Mon, 22 Jan 2007 13:49:26 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 13:50:20 GMT]]></title><description><![CDATA[<p>Fehlermehldung:<br />
invalid conversion from `const MyObj* const* const' to `const MyObj**'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214473</guid><dc:creator><![CDATA[IteratorBasis]]></dc:creator><pubDate>Mon, 22 Jan 2007 13:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Iteratoren schreiben on Mon, 22 Jan 2007 14:04:21 GMT]]></title><description><![CDATA[<pre><code>typename std::vector&lt;T&gt;::const_iterator it2
</code></pre>
<p>vielleicht solltest du dir mal mehr über die std container und iteratoren durchlesen.</p>
<p><a href="http://www.sgi.com/tech/stl/Container.html" rel="nofollow">http://www.sgi.com/tech/stl/Container.html</a><br />
<a href="http://www.sgi.com/tech/stl/Iterators.html" rel="nofollow">http://www.sgi.com/tech/stl/Iterators.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214482</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 22 Jan 2007 14:04:21 GMT</pubDate></item></channel></rss>