<?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[Neue for-schleife mit C++11 - Iterator immer synchron?]]></title><description><![CDATA[<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

int main()
{
	std::vector&lt;int&gt; v = { 1,2,3,4,5,6,7,8,9,10 };
	auto it = v.begin();
	for ( int i : v )
	{
		std::cout &lt;&lt; &quot;Element: &quot; &lt;&lt; i &lt;&lt; std::endl;		
		if ( it != v.end() ){
			std::cout &lt;&lt; &quot;Iterator: &quot; &lt;&lt; *it &lt;&lt; std::endl;
			it++;
		}
	} 
}
</code></pre>
<p>Output:</p>
<p>Shell schrieb:</p>
<blockquote>
<p>Element: 1<br />
Iterator: 1<br />
Element: 2<br />
Iterator: 2<br />
Element: 3<br />
Iterator: 3<br />
Element: 4<br />
Iterator: 4<br />
Element: 5<br />
Iterator: 5<br />
Element: 6<br />
Iterator: 6<br />
Element: 7<br />
Iterator: 7<br />
Element: 8<br />
Iterator: 8<br />
Element: 9<br />
Iterator: 9<br />
Element: 10<br />
Iterator: 10</p>
</blockquote>
<p>Ist das garantiert, dass der iterator immer synchron mit der for-loop ist in diesem Szenario? Oder ist diese Art der Schleife nur nützlich wenn ich keinen iterator brauche?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332533/neue-for-schleife-mit-c-11-iterator-immer-synchron</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 00:55:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332533.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 May 2015 07:34:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Neue for-schleife mit C++11 - Iterator immer synchron? on Thu, 07 May 2015 07:34:32 GMT]]></title><description><![CDATA[<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

int main()
{
	std::vector&lt;int&gt; v = { 1,2,3,4,5,6,7,8,9,10 };
	auto it = v.begin();
	for ( int i : v )
	{
		std::cout &lt;&lt; &quot;Element: &quot; &lt;&lt; i &lt;&lt; std::endl;		
		if ( it != v.end() ){
			std::cout &lt;&lt; &quot;Iterator: &quot; &lt;&lt; *it &lt;&lt; std::endl;
			it++;
		}
	} 
}
</code></pre>
<p>Output:</p>
<p>Shell schrieb:</p>
<blockquote>
<p>Element: 1<br />
Iterator: 1<br />
Element: 2<br />
Iterator: 2<br />
Element: 3<br />
Iterator: 3<br />
Element: 4<br />
Iterator: 4<br />
Element: 5<br />
Iterator: 5<br />
Element: 6<br />
Iterator: 6<br />
Element: 7<br />
Iterator: 7<br />
Element: 8<br />
Iterator: 8<br />
Element: 9<br />
Iterator: 9<br />
Element: 10<br />
Iterator: 10</p>
</blockquote>
<p>Ist das garantiert, dass der iterator immer synchron mit der for-loop ist in diesem Szenario? Oder ist diese Art der Schleife nur nützlich wenn ich keinen iterator brauche?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452807</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 07 May 2015 07:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Neue for-schleife mit C++11 - Iterator immer synchron? on Thu, 07 May 2015 07:43:18 GMT]]></title><description><![CDATA[<p>Ich denke man kann davon ausgehen. Ich kenn mich nicht wirklich im Standard aus, aber <a href="http://en.cppreference.com/w/cpp/language/range-for" rel="nofollow">http://en.cppreference.com/w/cpp/language/range-for</a> sagt, dass die Range based for in das hier umgewandelt wird:</p>
<pre><code>{

    auto &amp;&amp; __range = range_expression ;
    for (auto __begin = begin_expr,

                __end = end_expr;

            __begin != __end; ++__begin) {

        range_declaration = *__begin;
        loop_statement

    }

}
</code></pre>
<p>wobei begin_expr __range.begin() entspricht, wenn vorhanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452810</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Thu, 07 May 2015 07:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to Neue for-schleife mit C++11 - Iterator immer synchron? on Thu, 07 May 2015 09:45:55 GMT]]></title><description><![CDATA[<p>Ok, danke.<br />
Hab noch die Frage hier gefunden:<br />
<a href="http://stackoverflow.com/questions/6953128/need-iterator-when-using-ranged-based-for-loops" rel="nofollow">http://stackoverflow.com/questions/6953128/need-iterator-when-using-ranged-based-for-loops</a><br />
Dort wird das auch gesagt. Daher gehe ich mal davon aus, dass der iterator immer in sync ist. Es ist einfach schöner zu schreiben und flexibler als die &quot;normale&quot; for-loop. Nur löschen mitten in der loop wird so wohl nicht gehen, nehme ich mal an, da man den internen iterator nicht umbiegen kann. Wenn man nur 1 Element löschen will, dann kann man aber ja mit break; abbrechen. Und ansonsten muss halt die &quot;normale&quot; for loop herhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452832</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 07 May 2015 09:45:55 GMT</pubDate></item><item><title><![CDATA[Reply to Neue for-schleife mit C++11 - Iterator immer synchron? on Thu, 07 May 2015 10:00:31 GMT]]></title><description><![CDATA[<p>Wenn du eine Iteror benötigst, ist doch</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

int main()
{
    std::vector&lt;int&gt; v = { 1,2,3,4,5,6,7,8,9,10 };
    auto it = v.begin();
    for ( auto it = begin(v); it != end(v); ++it )
    {
        std::cout &lt;&lt; &quot;Iterator: &quot; &lt;&lt; *it &lt;&lt; std::endl;
    }
}
</code></pre>
<p>viel übersichtlicher und bestimmt auch weniger Fehleranfällig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452835</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 07 May 2015 10:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Neue for-schleife mit C++11 - Iterator immer synchron? on Thu, 07 May 2015 16:20:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist das garantiert, dass der iterator immer synchron mit der for-loop ist in diesem Szenario?</p>
</blockquote>
<p>Jo, der von patrick zitierte Code ist in 6.5.4/1 so auch zu finden. Allerdings ist range-based for nicht dafuer konzipiert durch Iteratoren einer Range zu laufen.</p>
<p>Man kann sich aber natuerlich einen Helfer schreiben. Runtergetippt (i.e. nicht ausfuehrlich getestet):</p>
<pre><code>template &lt;typename Iter&gt;
class Wrapper {
    Iter _cur;

    using _traits_type = std::iterator_traits&lt;Iter&gt;;

public:

    using iterator_type = Iter;
    using iterator_category = typename _traits_type::iterator_category;
    using value_type        = iterator_type;
    using difference_type   = typename _traits_type::difference_type;
    using pointer           = iterator_type*;
    using reference         = iterator_type&amp;;

    iterator_type base() const { return _cur; }

    Wrapper() : _cur() {}

    explicit Wrapper(iterator_type i) : _cur(i) {}

    template &lt;typename OtherIter&gt;
    explicit Wrapper(Wrapper&lt;OtherIter&gt; const&amp; i) : _cur(i.base()) {}

    iterator_type operator*() const {return _cur;}
    value_type const* operator-&gt;() const {return &amp;_cur;}

    Wrapper&amp; operator++() {++_cur; return *this;}
    Wrapper  operator++(int) {auto tmp = *this; ++*this; return tmp;}
    Wrapper&amp; operator--() {--_cur; return *this;}
    Wrapper  operator--(int) {auto tmp = *this; --*this; return tmp;}

    Wrapper operator+(difference_type n) const {return {_cur + n};}
    Wrapper operator-(difference_type n) const {return {_cur - n};}

    Wrapper operator+=(difference_type n) const {return *this = *this + n;}
    Wrapper operator-=(difference_type n) const {return *this = *this - n;}

    iterator_type operator[](difference_type n) const { return _cur + n; }
};

template &lt;typename I1, typename I2&gt;
bool operator==( Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return lhs.base() == rhs.base(); }
template &lt;typename I1, typename I2&gt;
bool operator!=( Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return !(lhs == rhs); }
template &lt;typename I1, typename I2&gt;
bool operator&lt;(Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return lhs.base() &lt; rhs.base(); }
template &lt;typename I1, typename I2&gt;
bool operator&lt;=(Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return !(rhs &lt; lhs); }
template &lt;typename I1, typename I2&gt;
bool operator&gt;(Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return rhs &lt; lhs; }
template &lt;typename I1, typename I2&gt;
bool operator&gt;=(Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs)
{ return !(lhs &lt; rhs); }

//! LWG #685
template &lt;typename I1, typename I2&gt;
auto operator-(Wrapper&lt;I1&gt; const&amp; lhs, Wrapper&lt;I2&gt; const&amp; rhs) -&gt; decltype(lhs.base() - rhs.base())
{ return lhs.base() - rhs.base(); }
template &lt;typename I&gt;
Wrapper&lt;I&gt; operator+(typename Wrapper&lt;I&gt;::difference_type n, Wrapper&lt;I&gt; const&amp; lhs)
{ return lhs + n; }
template &lt;typename I&gt;
Wrapper&lt;I&gt; makeWrapper(I i)
{ return {i}; }

template &lt;typename Iter&gt;
struct IteratorPair {Iter first, last;};

template &lt;typename Iter&gt;
Iter begin(IteratorPair&lt;Iter&gt; const&amp; pair) {return pair.first;}
template &lt;typename Iter&gt;
Iter   end(IteratorPair&lt;Iter&gt; const&amp; pair) {return pair.last;}

template &lt;typename Iter&gt;
IteratorPair&lt;Wrapper&lt;Iter&gt;&gt; iters(Iter first, Iter last) {
    return {Wrapper&lt;Iter&gt;(first), Wrapper&lt;Iter&gt;(last)};
}

// ADL darf jemand anders einbauen. detail-namespace errichten, using-declarationen dort reinpasten, usw.
template &lt;typename Range&gt;
auto iters(Range&amp; r) -&gt; decltype(iters(std::begin(r), std::end(r))) {
    return iters(std::begin(r), std::end(r));
}
</code></pre>
<p>Kann man bspw. so verwenden:</p>
<pre><code>std::vector&lt;int&gt; v = { 1,2,3,4,5,6,7,8,9,10 };
    for ( auto it : iters(v) )
        std::cout &lt;&lt; &quot;Element: &quot; &lt;&lt; *it &lt;&lt; std::endl;
</code></pre>
<p><a href="http://coliru.stacked-crooked.com/a/c25105d9c4bb9362" rel="nofollow"><strong>Demo</strong></a>.</p>
<p>Edit: Macht natuerlich keinen Sinn <code>base()</code> modifizierbar zu lassen.<br />
Edit²: Ups. Hätte wohl mit -std=c++11 kompilieren sollen, dann wäre mir der Flüchtigkeitsfehler gleich aufgefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452848</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 07 May 2015 16:20:27 GMT</pubDate></item></channel></rss>