<?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[Vector iterieren Verständnisproblem]]></title><description><![CDATA[<p>Hallo,</p>
<p>sorry für die sicher simple Anfängerfrage.</p>
<p>Problem: Einem Array sollen fortlaufend die Werte eines Vectors zugewiesen werden (sehr verkürztes Minimalbeispiel):</p>
<pre><code>std::vector&lt;int&gt;TestVector{85,3,24,98,72};
int array[5];
int i=0;

for (auto&amp; v : TestVector)
{
   array[i] = v;
   i++;
}
</code></pre>
<p>Läßt sich diese Aufgabe noch irgendwie eleganter (ohne den &quot;i&quot; Iterator?) lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330580/vector-iterieren-verständnisproblem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 02:32:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330580.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Jan 2015 07:04:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 07:05:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>sorry für die sicher simple Anfängerfrage.</p>
<p>Problem: Einem Array sollen fortlaufend die Werte eines Vectors zugewiesen werden (sehr verkürztes Minimalbeispiel):</p>
<pre><code>std::vector&lt;int&gt;TestVector{85,3,24,98,72};
int array[5];
int i=0;

for (auto&amp; v : TestVector)
{
   array[i] = v;
   i++;
}
</code></pre>
<p>Läßt sich diese Aufgabe noch irgendwie eleganter (ohne den &quot;i&quot; Iterator?) lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437977</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Sat, 17 Jan 2015 07:05:28 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 07:16:00 GMT]]></title><description><![CDATA[<p>Wie wäre es mit std::copy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437978</guid><dc:creator><![CDATA[algorithm]]></dc:creator><pubDate>Sat, 17 Jan 2015 07:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 08:38:40 GMT]]></title><description><![CDATA[<p>std::copy kannte ich noch nicht.</p>
<p>In Wirklichkeit ist der Code komplexer und besteht aus einem &quot;set&quot; und einem &quot;vector&quot; (wieder verkürzt dargestellt):</p>
<pre><code>using namespace std;

set&lt;int&gt;IDSet{9,2,5};

struct Teil {
   int    ID;
   double Breite;
};
std::vector&lt;Teil&gt;TestVector;
TestVector.resize(3);
</code></pre>
<p>Läßt sich mit std:copy nun der Inhalt von &quot;IDSet&quot; in die 3 bereits bestehenden &quot;<a href="http://TestVector.ID" rel="nofollow">TestVector.ID</a>&quot; Felder kopieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437979</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Sat, 17 Jan 2015 08:38:40 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 08:51:21 GMT]]></title><description><![CDATA[<p>Um beim Eingangsbeispiel zu bleiben:</p>
<pre><code>std::vector&lt;int&gt;TestVector{85,3,24,98,72};
int array[5];
int i=0;

for (auto&amp; v : TestVector)
{
   array[i] = v;
   i++;
}
</code></pre>
<p>Ich hatte gehofft, dass es vielleicht möglich ist, über den Vector Iterator &quot;v&quot; einerseits den Wert der TestVector Felder und andererseits die fortlaufende Anzahl des Aufrufs von &quot;v&quot; in der Schleife (0,1,2,3 etc.) auszulesen.</p>
<p>Ist das möglich? Oder ist der &quot;i&quot; Iterator schon der optimale Weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437984</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Sat, 17 Jan 2015 08:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 09:07:30 GMT]]></title><description><![CDATA[<p>Wenn ich das recht verstehe (ich bin mir in dieser Hinsicht nicht sicher, ob ich das genau verstanden habe) suchst du etwas in dieser Richtung?</p>
<pre><code>#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;

using namespace std;

struct Kombinierte_Werte {
   int  fortlaufende_nummer;
   int nummer_aus_set;
};

struct Kombinator
{
	int fortlaufende_nummer;
	Kombinierte_Werte operator()(int nummer_aus_set)
	{
		return Kombinierte_Werte{fortlaufende_nummer++, nummer_aus_set};
	}
};

int main()
{
  set&lt;int&gt; my_set{14, 18, 16, 27};

  vector&lt;Kombinierte_Werte&gt; ergebnis;
  Kombinator kombinator = {0};
  // Dies ist die interessante Zeile:
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis), kombinator);

  for(auto element: ergebnis)
  	cout &lt;&lt; element.fortlaufende_nummer &lt;&lt; '\t' &lt;&lt; element.nummer_aus_set &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/bCjiVH" rel="nofollow">http://ideone.com/bCjiVH</a><br />
Wobei man den Funktor Kombinator auch sehr knapp als Lambda innerhalb des transform-Aufrufs definieren könnte. Aber wenn du von copy noch nichts gehört hast, nehme ich auch mal an, das du noch nicht viel von lambdas gehört hast.</p>
<p>Es gibt auch noch 1000 andere Möglichkeiten dieses oder ähnliches zu erreichen. Um zu entscheiden, was davon nun das beste ist, muss man den konkreten Fall betrachten. Deine bisherige Problembeschreibung ist ja eher abstrakt (was gut ist, aber man kann halt dadurch nicht sagen, welche Methode die &quot;beste&quot; ist). Allgemein bietet die Standardbibliothek sehr viele kleine Helferfunktionen an, mit denen man oft vorkommende Schleifenkonstrukte kompakt aufschreiben kann, was dann auch von vielen Leuten als &quot;elegant&quot; angesehen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437989</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 Jan 2015 09:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 10:09:40 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>vielen Dank für das ausführliche Beispiel, das ich ausprobieren werde.</p>
<p>Den Begriff &quot;Funktor Kombinator&quot; werde ich auffrischen müssen - habe ihn aber schon einmal im Zusammenhang mit dem &quot;Lambda&quot; Begriff und Sortierfunktionen in Klassen Vectoren benutzt.</p>
<p>Danke und Grüße,<br />
Bernd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438002</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Sat, 17 Jan 2015 10:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 10:47:52 GMT]]></title><description><![CDATA[<p>Ein Funktor ist ein funktionsartiges Objekt. Etwas, das man aufrufen kann, wie eine Funktion, aber sich über mehrere Aufrufe hinweg Informationen merken kann. Ungefähr so wie statische Variablen in Funktionen (falls dir das was sagt), aber im objektorientierten Stil.</p>
<p>Das habe ich hier gemacht, weil du mehrere Quellen für deine Daten hast: Einerseits die Daten aus dem Set und andererseits die fortlaufende Nummer, die du anscheinend wünscht. Mein Funktor ist bloß eine Funktion, die ein Element des Sets entgegen nimmt und dieses zusammen mit der fortlaufenden Nummer zusammen in ein struct des gewünschten Ergebnistyps packt. Dabei zählt mein Funktor eigenständig mit.</p>
<p>Ein funktionsartiges Objekt muss das deswegen sein, weil transform (und viele andere Funktionen aus dem algorithms-Header) von der Art sind, dass man ihnen einen Bereich gibt und dann sagt, dass sie eine bestimmte Funktion auf eine bestimmte Art und Weise auf diesen Bereich anwenden sollen. Oder eben ein funktionsartiges Objekt, die sind da ganz flexibel. Hauptsache irgendwas, dass sich mittels runder Klammern aufrufen lässt.</p>
<p>Ein Lambdaausdruck ist eine Möglichkeit, um kleine (oder theoretisch auch große) Funktionen, die man nur einmal benötigt, direkt vor Ort zu definieren. So könnte das in diesem Fall aussehen:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;set&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;

using namespace std;

struct Kombinierte_Werte {
   int  fortlaufende_nummer;
   int nummer_aus_set;
};

int main()
{
  set&lt;int&gt; my_set{14, 18, 16, 27};

  vector&lt;Kombinierte_Werte&gt; ergebnis;
  int counter = 0;
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis), 
            [&amp;counter](int nummer_aus_set){return Kombinierte_Werte{counter++, nummer_aus_set};});

  for(auto element: ergebnis)
  	cout &lt;&lt; element.fortlaufende_nummer &lt;&lt; '\t' &lt;&lt; element.nummer_aus_set &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/ngibe6" rel="nofollow">http://ideone.com/ngibe6</a><br />
Und das ist dann doch schon eine recht elegante Art, das auszudrücken, wonach du gefragt hast. Das ganze spannende Zeug spielt sich in dem einem großen Ausdruck in den Zeilen 21-22 ab<br />
(Wobei es, wie gesagt, noch viele andere Methoden geben könnte, je nachdem, was du genau willst)</p>
<p>Mit klassischen for-Schleifen geschrieben sähe das so aus:</p>
<pre><code>int counter = 0;
  for(auto nummer_aus_set : my_set)
  {
  	ergebnis.push_back(Kombinierte_Werte{counter++, nummer_aus_set});
  }
</code></pre>
<p>Was, wie du siehst, auch nicht gerade schlechter ist, vielleicht sogar besser lesbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> . Man kann argumentieren, dass transform aus einer Zeit kommt, in der es noch keine range-based for und ähnliches gab und die Schleife damals so ausgesehen hätte:</p>
<pre><code>int counter = 0;
  for(set&lt;int&gt;::const_iterator it = my_set.begin(); it != my_set.end(); ++it)
  {
  	Kombinierte_Werte kombinierter_wert = {counter++, *it};
  	ergebnis.push_back(kombinierter_wert);
  }
</code></pre>
<p>Und das ist dann auch schon eine ganze Spur unschöner als die anderen hier gezeigten Methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438006</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 Jan 2015 10:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sat, 17 Jan 2015 13:07:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Mit klassischen for-Schleifen geschrieben sähe das so aus:</p>
<pre><code>int counter = 0;
  for(auto nummer_aus_set : my_set)
  {
    ergebnis.push_back(Kombinierte_Werte{counter++, nummer_aus_set});
  }
</code></pre>
<p>Was, wie du siehst, auch nicht gerade schlechter ist, vielleicht sogar besser lesbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Ja, mit Schleife finde ich es auch besser lesbar! Danke auch für die Erklärung zu Funktor und Lambda. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438030</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Sat, 17 Jan 2015 13:07:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 01:29:05 GMT]]></title><description><![CDATA[<p>Ich fürchte, die in der Frage gezeigte Art von for-Schleife ist für die Aufgabe nicht geeignet.</p>
<p>Alternative:</p>
<pre><code>std::vector&lt;int&gt;TestVector{85,3,24,98,72};
int array[5];

for (int i=0; i &lt; 5; ++i)
{
   array[i] = TestVector[i];
}
</code></pre>
<p>Wobei man die &quot;5&quot; natürlich noch durch eine geeignete Konstante (constexpr) ersetzen muss. Das der Vector und das array genügend Elemente haben müssen, ist auch noch zu prüfen.</p>
<p>Die in der Frage gezeigte Variante der for-Schleife ist nach meinem Verständnis nur dafür da, um über alle Elemente des Vektors zu iterieren und damit etwas zu machen. Sobald man wieder eine Laufvariable einfügen muss (für die Zuweisung wie in dem Beispiel), ist m. E. der Witz dieser neuen Variante von for weg. Ich würde deswegen bei der klassischen Variante bleiben.</p>
<p>Bekanntlich führen viele Wege nach Rom, aber Funktor und Lambda ist wohl etwas übertrieben.</p>
<p>Im übrigen gibt es jetzt eine Klasse std::array. Vielleicht hat die einen Konstruktor, dem man Iteratoren übergeben kann? Konnte das auf die schnelle jetzt nicht feststellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438164</guid><dc:creator><![CDATA[TDDler]]></dc:creator><pubDate>Sun, 18 Jan 2015 01:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 09:32:20 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<pre><code>int counter = 0;
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis), 
            [&amp;counter](int nummer_aus_set){return Kombinierte_Werte{counter++, nummer_aus_set};});
  
  for(auto element: ergebnis)
  	cout &lt;&lt; element.fortlaufende_nummer &lt;&lt; '\t' &lt;&lt; element.nummer_aus_set &lt;&lt; '\n';
</code></pre>
</blockquote>
<p>Streng genommen ist <code>[&amp;count]</code> nicht nötig, da könnte auch eine Kopie genommen werden, aber in <code>auto element</code> wäre besser eine Referenz ( <code>auto&amp; element</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438176</guid><dc:creator><![CDATA[captured!]]></dc:creator><pubDate>Sun, 18 Jan 2015 09:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 10:30:51 GMT]]></title><description><![CDATA[<p>captured! schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<pre><code>int counter = 0;
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis), 
            [&amp;counter](int nummer_aus_set){return Kombinierte_Werte{counter++, nummer_aus_set};});
  
  for(auto element: ergebnis)
  	cout &lt;&lt; element.fortlaufende_nummer &lt;&lt; '\t' &lt;&lt; element.nummer_aus_set &lt;&lt; '\n';
</code></pre>
</blockquote>
<p>Streng genommen ist <code>[&amp;count]</code> nicht nötig, da könnte auch eine Kopie genommen werden, aber in <code>auto element</code> wäre besser eine Referenz ( <code>auto&amp; element</code> ).</p>
</blockquote>
<p>Beides falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438183</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 18 Jan 2015 10:30:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 10:36:47 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>captured! schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<pre><code>int counter = 0;
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis), 
            [&amp;counter](int nummer_aus_set){return Kombinierte_Werte{counter++, nummer_aus_set};});
  
  for(auto element: ergebnis)
  	cout &lt;&lt; element.fortlaufende_nummer &lt;&lt; '\t' &lt;&lt; element.nummer_aus_set &lt;&lt; '\n';
</code></pre>
</blockquote>
<p>Streng genommen ist <code>[&amp;count]</code> nicht nötig, da könnte auch eine Kopie genommen werden, aber in <code>auto element</code> wäre besser eine Referenz ( <code>auto&amp; element</code> ).</p>
</blockquote>
<p>Beides falsch.</p>
</blockquote>
<p>Was meinst du mit <a href="http://ideone.com/l6JrFz" rel="nofollow">falsch</a>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438185</guid><dc:creator><![CDATA[captured!]]></dc:creator><pubDate>Sun, 18 Jan 2015 10:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 10:48:06 GMT]]></title><description><![CDATA[<p>captured! schrieb:</p>
<blockquote>
<p>Was meinst du mit <a href="http://ideone.com/l6JrFz" rel="nofollow">falsch</a>?</p>
</blockquote>
<p>Mit &quot;falsch&quot; meine ich &quot;schlechter als mein Code&quot;. Damit ist deine Klugscheißerei also voll am Ziel vorbei, daher &quot;falsch&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2438186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438186</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 18 Jan 2015 10:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vector iterieren Verständnisproblem on Sun, 18 Jan 2015 10:53:05 GMT]]></title><description><![CDATA[<p>Was ist daran besser, von Kombinierte_Werte eine Kopie zu erstellen? Der Herr Meyers wäre voll dagegen.</p>
<p>Btw, in C++14, benötigt man die counter-Variable nicht:</p>
<pre><code class="language-cpp">vector&lt;Kombinierte_Werte&gt; ergebnis;
  transform(my_set.begin(), my_set.end(), back_inserter(ergebnis),
            [counter=0](int nummer_aus_set)mutable{return Kombinierte_Werte{counter++, nummer_aus_set};});
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2438187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2438187</guid><dc:creator><![CDATA[captured!]]></dc:creator><pubDate>Sun, 18 Jan 2015 10:53:05 GMT</pubDate></item></channel></rss>