<?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[Verständnisfrage std::vector]]></title><description><![CDATA[<p>Hallo:</p>
<p>Ich habe folgende Klasse (gekürzt):</p>
<pre><code class="language-cpp">class foo{
  public:
    vector&lt;int&gt; getVector(){return myvector};
    void printVector(){
      for(vector&lt;int&gt;::iterator i = myvector.begin(); i != myvector.end(); i++)
        cout &lt;&lt; *i &lt;&lt; endl;
    }
  private:
    vector&lt;int&gt; myvector;
};
</code></pre>
<p>Folgendes rufe ich nun in meiner main auf (nehmen wir an, myvector wurde mit 3 und 2 initialisiert):</p>
<pre><code class="language-cpp">int main()
{
  foo myfoo;
  myfoo.printVector();
  vector&lt;int&gt; test = myfoo.getVector();
  for(vector&lt;int&gt;::iterator i = test.begin(); i != test.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  vector&lt;int&gt; test2(myfoo.getVector());
  for(vector&lt;int&gt;::iterator i = test2.begin(); i != test2.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  for(vector&lt;int&gt;::iterator i = myfoo.getVector().begin(); i != myfoo.getVector.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  return 0;
}
</code></pre>
<p>Auf meiner Maschine ergibt sich folgendes Bild:<br />
3<br />
2<br />
3<br />
2<br />
3<br />
2<br />
40731442 (&lt;= diese Zahl ist konstant!)<br />
2</p>
<p>Wenn ich mehr Zahlen in den Vector stecke, stimmen diese überein - nur bei der vierten Version bleibt die erste Zahl konstant falsch, je nach Anzahl der im Vector enthaltenen Zahlen ändert sie sich jedoch. Was mache ich falsch? Warum kann ich den Vector anscheinend nicht so ausgeben wie in Schritt 4?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292015/verständnisfrage-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 08:17:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292015.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Sep 2011 08:28:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage std::vector on Thu, 01 Sep 2011 08:28:05 GMT]]></title><description><![CDATA[<p>Hallo:</p>
<p>Ich habe folgende Klasse (gekürzt):</p>
<pre><code class="language-cpp">class foo{
  public:
    vector&lt;int&gt; getVector(){return myvector};
    void printVector(){
      for(vector&lt;int&gt;::iterator i = myvector.begin(); i != myvector.end(); i++)
        cout &lt;&lt; *i &lt;&lt; endl;
    }
  private:
    vector&lt;int&gt; myvector;
};
</code></pre>
<p>Folgendes rufe ich nun in meiner main auf (nehmen wir an, myvector wurde mit 3 und 2 initialisiert):</p>
<pre><code class="language-cpp">int main()
{
  foo myfoo;
  myfoo.printVector();
  vector&lt;int&gt; test = myfoo.getVector();
  for(vector&lt;int&gt;::iterator i = test.begin(); i != test.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  vector&lt;int&gt; test2(myfoo.getVector());
  for(vector&lt;int&gt;::iterator i = test2.begin(); i != test2.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  for(vector&lt;int&gt;::iterator i = myfoo.getVector().begin(); i != myfoo.getVector.end(); i++)
    cout &lt;&lt; *i &lt;&lt; endl;
  return 0;
}
</code></pre>
<p>Auf meiner Maschine ergibt sich folgendes Bild:<br />
3<br />
2<br />
3<br />
2<br />
3<br />
2<br />
40731442 (&lt;= diese Zahl ist konstant!)<br />
2</p>
<p>Wenn ich mehr Zahlen in den Vector stecke, stimmen diese überein - nur bei der vierten Version bleibt die erste Zahl konstant falsch, je nach Anzahl der im Vector enthaltenen Zahlen ändert sie sich jedoch. Was mache ich falsch? Warum kann ich den Vector anscheinend nicht so ausgeben wie in Schritt 4?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113297</guid><dc:creator><![CDATA[Mitmischer 1703]]></dc:creator><pubDate>Thu, 01 Sep 2011 08:28:05 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage std::vector on Thu, 01 Sep 2011 08:36:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">myfoo.getVector().begin();
</code></pre>
<p>Das ist ein Iterator auf eine temporäre Kopie. Die lebt nicht mehr, sobald der Initialisierungsaudruck in der for-Schleife verlassen wird. Alles danach ist undefiniertes Verhalten.</p>
<p>Das liegt nicht direkt an vector, sondern an der Art und Weise, wie du dein getVector() geschrieben hast. Es wäre vielleicht besser, eine Referenz zurückzugeben. Das hat auch den Vorteil dir jede Menge unnötige Kopierkosten zu sparen.</p>
<p>viele edits: Irgendwie hab ich es heute nicht so mit Rechtschreibung und ganzen Sätzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113300</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 01 Sep 2011 08:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage std::vector on Thu, 01 Sep 2011 09:34:36 GMT]]></title><description><![CDATA[<p>Schade, dass ich den Code noch korrigieren und vervollständigen muss, um ihn testen zu können.</p>
<p>Ich möchte nochmal darauf hinweisen, dass ein entsprechender Debug-Modus sehr hilfreich sein kann:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
  public:
    foo() {
      myvector.push_back(2);
      myvector.push_back(3);
    }
    vector&lt;int&gt; getVector() {
      return myvector;
    }
    void printVector(){
      for(vector&lt;int&gt;::iterator i = myvector.begin(); i != myvector.end(); ++i)
        cout &lt;&lt; *i &lt;&lt; endl;
    }
  private:
    vector&lt;int&gt; myvector;
};	

int main(){
  foo myfoo;
  myfoo.printVector();
  vector&lt;int&gt; test = myfoo.getVector();
  for(vector&lt;int&gt;::iterator i = test.begin(); i != test.end(); ++i)
    cout &lt;&lt; *i &lt;&lt; endl;
  vector&lt;int&gt; test2(myfoo.getVector());
  for(vector&lt;int&gt;::iterator i = test2.begin(); i != test2.end(); ++i)
    cout &lt;&lt; *i &lt;&lt; endl;
  for(vector&lt;int&gt;::iterator i = myfoo.getVector().begin(); i != myfoo.getVector().end(); ++i)
    cout &lt;&lt; *i &lt;&lt; endl;
  return 0;
}
</code></pre>
<pre><code>&gt; g++ -D_GLIBCXX_DEBUG ohoh.cpp
&gt; a.exe
</code></pre>
<pre><code>2
3
2
3
2
3

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
c:\mingw32\bin\../lib/gcc/mingw32/4.5.1/include/c++/debug/safe_iterator.h:464:
    error: attempt to compare a singular iterator to a past-the-end iterator    
    .

Objects involved in the operation:
iterator &quot;lhs&quot; @ 0x0028fdfc {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPiNSt6__norm6vectorIiSaIiEEEEENSt7__debug6vectorIiS6_EEEE (mutable iterator);
  state = singular;
}
iterator &quot;rhs&quot; @ 0x0028fed0 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPiNSt6__norm6vectorIiSaIiEEEEENSt7__debug6vectorIiS6_EEEE (mutable iterator);
  state = past-the-end;
  references sequence with type `NSt7__debug6vectorIiSaIiEEE' @ 0x0028fed0
}
</code></pre>
<p>In Zeile 32 kracht es. i ist ein ungültiger Iterator und der wird mit einem anderen verglichen.</p>
<p>Leute, <em>nutzt</em> sämtliche Debugmodi, die ihr kriegen könnt. Schaut in Eure Compiler-Doku rein.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113316</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 09:34:36 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage std::vector on Thu, 01 Sep 2011 11:21:14 GMT]]></title><description><![CDATA[<p>Hallo und vielen Dank für eure Antworten; Mein Fehler leuchtet mir ein. Ich gebe jetzt eine Referenz auf const zurück und nutze cbegin/cend statt begin/end und es läuft!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8090">@KK</a>: Den Debugger hab ich drüberlaufen lassen (gdb), der konnte mir nichts weiter sagen als <em>dass</em> eine Exception aufgetreten ist (cxa_throw())</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113358</guid><dc:creator><![CDATA[Mitmischer 1703]]></dc:creator><pubDate>Thu, 01 Sep 2011 11:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage std::vector on Thu, 01 Sep 2011 12:22:16 GMT]]></title><description><![CDATA[<p>begin/end ist überladen. Du kannst auch ruhig weiter begin/end verwenden. cbegin/cend gibt es nur ab C++2011. Und dort ist es praktisch, wenn du einen nicht-const-container hast, aber trotzdem const_iteratoren haben möchtest.</p>
<p>Bzgl Debug-Modi hast Du mich vielleicht missverstanden. -D_GLIBCXX_DEBUG aktiviert den Debugmodus der Standardbibliothek. Das hat mit dem GDB wenig zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113412</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 12:22:16 GMT</pubDate></item></channel></rss>