<?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[Container und Iterator]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der STL einen Container dessen Iteratoren einfach Pointer sind?</p>
<p>Also sowas wie</p>
<pre><code class="language-cpp">container&lt;double&gt; c;
double* iter = c.begin();
</code></pre>
<p>Bei Vektoren geht so etwas nicht und bei den anderen Standardcontainern selbstverständlich auch nicht, nur bei tr1::arrays&lt;T,N&gt; sind die Iteratoren so definiert.</p>
<p>Vielleicht gibt es auch eine Möglichkeit wie man die iteratoren auf pointer abbilden kann, natürlich nur wenn der Container seine Elemente linear speichert...</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252196/container-und-iterator</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 18:31:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252196.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Oct 2009 07:15:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 07:15:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es in der STL einen Container dessen Iteratoren einfach Pointer sind?</p>
<p>Also sowas wie</p>
<pre><code class="language-cpp">container&lt;double&gt; c;
double* iter = c.begin();
</code></pre>
<p>Bei Vektoren geht so etwas nicht und bei den anderen Standardcontainern selbstverständlich auch nicht, nur bei tr1::arrays&lt;T,N&gt; sind die Iteratoren so definiert.</p>
<p>Vielleicht gibt es auch eine Möglichkeit wie man die iteratoren auf pointer abbilden kann, natürlich nur wenn der Container seine Elemente linear speichert...</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793208</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Fri, 16 Oct 2009 07:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 07:21:02 GMT]]></title><description><![CDATA[<p>Ein Vector-Iterator <strong>kann</strong> als Pointer definiert sein (ist er in vielen Implementierungen auch), aber Du darfst Dich nicht darauf verlassen. Ganz allgemein gesprochen, nein, gibt es nicht. Selbst bei tr1::array muss es nicht so sein.</p>
<p>Aber da das Iterator-Konzept ein &quot;abstrahierter Pointer&quot; ist, wieso willst Du überhaupt den umgekehrten Weg gehen?</p>
<p>Bei std::vector und std:tr1::array kannst Du Dir jedoch einen Pointer auf den zusammenhängenden Bereich holen, mittels &amp;container[0].</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793211</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 16 Oct 2009 07:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 08:00:15 GMT]]></title><description><![CDATA[<p>Was hast du denn genau vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793220</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 16 Oct 2009 08:00:15 GMT</pubDate></item><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 08:06:28 GMT]]></title><description><![CDATA[<p>Einfach mal blind ins blaue:</p>
<pre><code class="language-cpp">double* iter = &amp;(*(c.begin()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1793225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793225</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 16 Oct 2009 08:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 11:06:56 GMT]]></title><description><![CDATA[<p>Ok, es geht um folgendes Problem ( ein Teil von diesem Projekt <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-251042-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html" rel="nofollow">Numerische Bibliothek</a>):</p>
<pre><code class="language-cpp">template&lt;class ContainerType&gt;
class ode_step_euler
{                                                                                  
     ContainerType dxdt;                                                            

 public:

     template&lt;class CallMethod, class Iterator&gt;
     void do_step( CallMethod deriv , double dt , Iterator start , Iterater end )
     {
         ContainerType::iterator dxdtiter = dxdt.begin();
         deriv( start , dxdtiter );
         while( start != end )
             *start++ += dt * (*dxdtiter++);
     }
};
</code></pre>
<p>Um diese Klasse zu benutzen, braucht man eine Funktion oder Klasse deriv. Viele Leute sind es gewohnt diese Funktion in der Form</p>
<pre><code class="language-cpp">void deriv( double *x , double *dxdt )
{
    x[0] = ...;
    x[1] = ...;
}
</code></pre>
<p>zu schreiben, so funktioniert es in den Numerical Recipies, in der gsl... Dann kann die Klasse ode_step_euler zum Beispiel so benutzt werden:</p>
<pre><code class="language-cpp">ode_step_euler&lt;Container&gt; euler;
Container state;
for( size_t i=0 ; i&lt;1000 ; ++i )
{
    euler.do_step( deriv, 0.01 , state.begin() , state.end() );
    // do something with state
}
</code></pre>
<p>Deshalb wäre es gut ein Beispiel zu haben, dass dieser Funktionsaufruf von deriv mit double* immer klappt, d.h. es muss sichergestellt ist, daß die Iteratoren von Containertype in diesem Beispiel pointer sind. Es geht nur um ein Beispiel, um zu zeigen wie man die Klasse ode_step_euler benutzt mit pointern benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793303</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Fri, 16 Oct 2009 11:06:56 GMT</pubDate></item><item><title><![CDATA[Reply to Container und Iterator on Fri, 16 Oct 2009 13:43:34 GMT]]></title><description><![CDATA[<p>Der STL-Container <code>std::vector</code> garantiert dir, dass alle Elemente an einem Stück in einem dynamischen Array stehen. Dadurch gilt <code>&amp;v[n] == &amp;v[0] + n</code> für gültige <code>n</code> . Somit kannst du mit relativ wenig Aufwand entsprechende Umwandlungsfunktionen schreiben. Sogar Const-Correctness kann berücksichtigt werden:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T* ptr_begin(std::vector&lt;T&gt;&amp; vec)
{
	return &amp;vec[0];
}

template &lt;typename T&gt;
const T* ptr_begin(const std::vector&lt;T&gt;&amp; vec)
{
	return &amp;vec[0];
}

template &lt;typename T&gt;
T* ptr_end(std::vector&lt;T&gt;&amp; vec)
{
	return &amp;vec[0] + vec.size();
}

template &lt;typename T&gt;
const T* ptr_end(const std::vector&lt;T&gt;&amp; vec)
{
	return &amp;vec[0] + vec.size();
}
</code></pre>
<p>Die Anwendung ist dann superleicht:</p>
<pre><code class="language-cpp">euler.do_step(deriv, 0.01, ptr_begin(state), ptr_end(state));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1793418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793418</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 16 Oct 2009 13:43:34 GMT</pubDate></item></channel></rss>