<?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[eigenen iterator]]></title><description><![CDATA[<p>hallo, hab eine klasse und möchte ihn um einen eigenen Iterator erweitern.<br />
Im &lt;bits/iterator&gt; Header hab ich auch eine generische Version gefunden.</p>
<p>Leider kann ich ihn nicht verweenden wie ich möchte da er keine funktionen implementiert. Gibt es einen Fertigen oder muss ich selbst einen implementieren?</p>
<p>So dachte ich, würde es funktionieren</p>
<pre><code class="language-cpp">&lt;iterator&gt;

class myclass
{
  class MyClassData{};
  MyClassData Data[N];
public:
  typedef std::iterator&lt;std::random_access_iterator_tag,MyClassData&gt; iterator;
  typedef std::iterator&lt;std::random_access_iterator_tag,MyClassData const&gt; const_iterator;

  iterator begin()
  {
    return iterator( this-&gt;Data[0] );
  };
//...

};
</code></pre>
<p>Danke im vorraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282999/eigenen-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 20:49:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282999.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Mar 2011 19:03:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:03:28 GMT]]></title><description><![CDATA[<p>hallo, hab eine klasse und möchte ihn um einen eigenen Iterator erweitern.<br />
Im &lt;bits/iterator&gt; Header hab ich auch eine generische Version gefunden.</p>
<p>Leider kann ich ihn nicht verweenden wie ich möchte da er keine funktionen implementiert. Gibt es einen Fertigen oder muss ich selbst einen implementieren?</p>
<p>So dachte ich, würde es funktionieren</p>
<pre><code class="language-cpp">&lt;iterator&gt;

class myclass
{
  class MyClassData{};
  MyClassData Data[N];
public:
  typedef std::iterator&lt;std::random_access_iterator_tag,MyClassData&gt; iterator;
  typedef std::iterator&lt;std::random_access_iterator_tag,MyClassData const&gt; const_iterator;

  iterator begin()
  {
    return iterator( this-&gt;Data[0] );
  };
//...

};
</code></pre>
<p>Danke im vorraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028894</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:14:28 GMT]]></title><description><![CDATA[<p>Was ist bits? Das gehört nicht zum Standard, soweit ich weiß. Wenn der Header jedenfalls da ist und keine Implementierung davon, kannst du ihn auch nicht nutzen. Aber vielleicht benötigst Du auch einfach nur eine entsprechende lib dazu. Übrigens implementiert er durchaus die begin-Funktion zumindest. Was fehlt Dir denn?</p>
<p>Edits: Freundlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028898</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:16:23 GMT]]></title><description><![CDATA[<p>&lt;bits/iterator&gt; wird von &lt;iterator&gt; inkludiert, welche zur std gehört.</p>
<p>&quot;ihn&quot; : da hab ich mich verschrieben, meinte da die klasse (also einfach mit &quot;die klasse&quot; ersetzen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028900</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:17:59 GMT]]></title><description><![CDATA[<p>Warum nimmst du für deinen Iterator nicht einfach einen Pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028905</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:18:33 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Übrigens implementiert er durchaus die begin-Funktion zumindest. Was fehlt Dir denn?<br />
Edits:</p>
</blockquote>
<p>dem iterator fehlen alle operatoren ++,*, != , etc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028907</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:20:30 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Warum nimmst du für deinen Iterator nicht einfach einen Pointer?</p>
</blockquote>
<p>Mein Beispiel ist etwas vereinfacht...<br />
Gegenfrage: wieso benutzt der std::vector keinen pointer sondern einen Iterator?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028909</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:35:01 GMT]]></title><description><![CDATA[<p>Ich sag ja nur, dass mein MSVC keinen bits-Ordner kennt und daher auch schlecht inkludieren kann. Wenn ich &lt;bits/iterator&gt; inkludieren will, kriege ich auch einen Fehler. Und da die Implementierung bei dir fehlt, gehe ich außerdem davon aus, dass der iterator nicht dafür gedacht ist, das zu tun, was du möchtest. Was heißt überhaupt generische Version, findest du in dieser Datei eine abstrakte Basisklasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028916</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 19:41:29 GMT]]></title><description><![CDATA[<p>&lt;bits/...&gt; hat in Deinem Code nichts zu suchen. Ob der Header nun von irgendeinem anderen Standardheader eingebunden wird oder nicht. Er ist ein &quot;Implementierungsdetail&quot;, auf das Du Dich nicht verlassen kannst. Das heißt, in der nächsten GCC Version könnte das Ding verschwinden. Und mit dem C++ Compiler von Microsoft wirst Du Dein Programm auch nicht übersetzen können, weil es höchstwahrscheinlich keine &lt;bits/...&gt;-Header dort gibt.</p>
<p>Um zu Vermeiden, dass Du Dich auf weitere Implementierungsdetails versehentlich verlässt, solltest Du Dir entsprechendes Lehrmaterial zu C++ und der Standardbibliothek besorgen. Da steht dann auch drin, was einen Iterator ausmacht.</p>
<p>In Deinem Fall wäre ein &quot;normaler&quot; Zeiger nutzbar.</p>
<p>Ob std::vector auch normale Zeiger oder etwas anderes verwendet, wird nicht festgelegt. Das ist wieder ein Implementierungsdetail, was Dich nicht zu interessieren hat. Du kannst aber davon ausgehen, dass, auch wenn es kein Zeiger sein sollte, der Iterator zumindest genauso performant sein sollte (zumindest bei eingeschalteter Compiler-Optimierung und ohne libstdc++-Debugmodus).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028918</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 02 Mar 2011 19:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 20:01:09 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>In Deinem Fall wäre ein &quot;normaler&quot; Zeiger nutzbar.</p>
</blockquote>
<p>In meinem gezeigten Fall ja. Oder ich könnte den Iterator vom std::vector nutzen:</p>
<pre><code class="language-cpp">std::vector&lt;MyClassData&gt;::iterator
</code></pre>
<p>Ich möchte aber noch weitere anbieten, die eine andere &quot;Sicht&quot; auf die Daten hergeben.<br />
Dazu könnte man annehmen das MyClass eine Baumstruktur darstellst und ich möchte verschiedene Darstellungen Iteratormässig implementieren, damit ich es gut mit den stl-Algorithmen kombinieren kann.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>&lt;bits/...&gt; hat in Deinem Code nichts zu suchen. Ob der Header nun von irgendeinem anderen Standardheader eingebunden wird oder nicht. Er ist ein &quot;Implementierungsdetail&quot;, auf das Du Dich nicht verlassen kannst. Das heißt, in der nächsten GCC Version könnte das Ding verschwinden. Und mit dem C++ Compiler von Microsoft wirst Du Dein Programm auch nicht übersetzen können, weil es höchstwahrscheinlich keine &lt;bits/...&gt;-Header dort gibt.</p>
</blockquote>
<p>Das weis ich, hab nach std::iterator gesuchen und meine suche hat mich dorthin gefürt...Ich wollte damit nur andeuten, dass die exsistenz des iterators mich glauben lässt es gebe irgendwo einen fertigen iterator welcher zb auch von std::vector genutzt wird.</p>
<p>Ich würde gern wissen wie ich eigene Iteratoren implementieren kann?<br />
Muss ich alles selber machen oder gibts da schon vordefinierte die ich nutzen könnte ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028924</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 20:01:09 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 20:50:16 GMT]]></title><description><![CDATA[<p>Es gibt Hilfsmittel (Boost.Iterator), welche das Erzeugen eigener Iteratoren erleichtern. Was für eine Datenstruktor willst Du Dir denn bauen, dass Du eigene Iteratoren brauchst? Vielleicht geht es ja auch ohne...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028956</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 02 Mar 2011 20:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 21:04:15 GMT]]></title><description><![CDATA[<p>Hab einige Datenstrukturen z.B:</p>
<pre><code class="language-cpp">class Baum
{
  Baum* Parent;
  std::vector&lt;Baum*&gt; Nodes;
};
</code></pre>
<p>Da bräuchte ich z.B:<br />
- Parent-Iterator : Iteriert sich durch die Parents<br />
- Node-Iterator : trivial<br />
- Descent-Iterator : iteriert sich durch alle Nodes - Anschliesend die Nodes der Nodes usw...<br />
- etc...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028962</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Wed, 02 Mar 2011 21:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 22:01:58 GMT]]></title><description><![CDATA[<p>ja dann ... Bost.Iterator kann Dir helfen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class node
{
  node* parent;
  vector&lt;node*&gt; children;
  typedef vector&lt;node*&gt;::const_iterator vpbcit;
public:
  typedef boost::indirect_iterator&lt;vpbcit,const node&gt; const_children_iterator;
  typedef boost::indirect_iterator&lt;vpbcit,      node&gt;       children_iterator;

  children_iterator children_begin()
    { return children_iterator(children.begin()); }
  children_iterator children_end()
    { return children_iterator(children.end()); }
  ...
};
</code></pre>
<p>Ob Dein Vorhaben sinnvoll ist, kann ich im Moment nicht beurteilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028987</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 02 Mar 2011 22:01:58 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Wed, 02 Mar 2011 22:33:04 GMT]]></title><description><![CDATA[<p>rion schrieb:</p>
<blockquote>
<p>Hab einige Datenstrukturen z.B:</p>
<pre><code class="language-cpp">class Baum
{
  Baum* Parent;
  std::vector&lt;Baum*&gt; Nodes;
};
</code></pre>
<p>Da bräuchte ich z.B:<br />
- Parent-Iterator : Iteriert sich durch die Parents<br />
- Node-Iterator : trivial<br />
- Descent-Iterator : iteriert sich durch alle Nodes - Anschliesend die Nodes der Nodes usw...<br />
- etc...</p>
</blockquote>
<p>Du suchst also Iteratoren um die verschiedenen Traversierungsarten durch Bäume abbilden zu können? Wieso machst Du das nicht mit rekursiven Funktionen? Und wenn die Performance wirklich eine Rolle spielt, solltest Du den Baum sowieso nicht hierarchisch sondern in einem vector ablegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2028992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2028992</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 02 Mar 2011 22:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Thu, 03 Mar 2011 08:02:52 GMT]]></title><description><![CDATA[<p>Diese Iteratoren-Dinge gehören zu &lt;iterator&gt; und ja, sie sind dazu da, eigene Iteratoren zu bauen. Allerdings musst du von ihnen Ableiten.</p>
<p>Ich habe das bei meiner Implementierung der std::list folgendermaßen gemacht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class List&lt;T&gt;::iterator : public std::iterator&lt;std::bidirectional_iterator_tag, T&gt;
{
    ListNode* pos;
    friend class List&lt;T&gt;;

    explicit iterator(ListNode* p) : pos(p) {}

public:
    iterator&amp; operator ++ ()    { pos = pos-&gt;next; return *this; }
    iterator  operator ++ (int) { iterator iter(pos); pos = pos-&gt;next; return iter; }

    iterator&amp; operator -- ()    { pos = pos-&gt;prev; return *this; }
    iterator  operator -- (int) { iterator iter(pos); pos = pos-&gt;prev; return iter; }

    reference operator *  () { return pos-&gt;value; }
    pointer   operator -&gt; () { return &amp;pos-&gt;value; }

    bool operator == (const iterator&amp; iter) const { return pos == iter.pos; }
    bool operator != (const iterator&amp; iter) const { return pos != iter.pos; }
};
</code></pre>
<p>Für const_iterator ist alles gleich, außer ein paar const's mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2029060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2029060</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 03 Mar 2011 08:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen iterator on Thu, 03 Mar 2011 12:13:44 GMT]]></title><description><![CDATA[<p>Danke PI, genau das was ich wissen wollte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2029175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2029175</guid><dc:creator><![CDATA[rion]]></dc:creator><pubDate>Thu, 03 Mar 2011 12:13:44 GMT</pubDate></item></channel></rss>