<?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[Minimales Element einer Reihe]]></title><description><![CDATA[<p>Hi,<br />
ich muss in einer endlichen Reihe (N = 16 )von reelen Zahlen nach dem minimalen Element suchen. Ich habe folgendes gemacht:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

int main(int argc, char *argv[])
{
    const int size = 3;
    if(argc - 1 != size)
            return 1;
    std::vector&lt;double&gt; a;
    a.reserve(16);
    std::transform(argv + 1, argv + argc, std::inserter(a, a.end()), /*...*/);
    /*...*/
    return 0;
}
</code></pre>
<p>Bei der Funktion transform versuche ich die Argumente von der Kommandozeile nach &quot;double&quot; umwandeln, und dann in die Reihe verschieben. Aber wie genau soll diese Umwandlung aussehen? Ich glaube, dass es mit sstream zu machen ist, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/148895/minimales-element-einer-reihe</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 04:33:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/148895.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 May 2006 14:06:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Minimales Element einer Reihe on Wed, 31 May 2006 14:06:42 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich muss in einer endlichen Reihe (N = 16 )von reelen Zahlen nach dem minimalen Element suchen. Ich habe folgendes gemacht:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

int main(int argc, char *argv[])
{
    const int size = 3;
    if(argc - 1 != size)
            return 1;
    std::vector&lt;double&gt; a;
    a.reserve(16);
    std::transform(argv + 1, argv + argc, std::inserter(a, a.end()), /*...*/);
    /*...*/
    return 0;
}
</code></pre>
<p>Bei der Funktion transform versuche ich die Argumente von der Kommandozeile nach &quot;double&quot; umwandeln, und dann in die Reihe verschieben. Aber wie genau soll diese Umwandlung aussehen? Ich glaube, dass es mit sstream zu machen ist, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1068840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1068840</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Wed, 31 May 2006 14:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Wed, 31 May 2006 21:39:09 GMT]]></title><description><![CDATA[<p>Schreib' Dir eine kleine Funktiion die eine char* in einen double umwandelt - etwa so</p>
<pre><code class="language-cpp">double text2dbl( const char* txt )
{
    std::istringstream buf( txt );
    double x;
    buf &gt;&gt; x;
    assert( !buf.fail() ); // evt. andere Fehlerbehandlung
    return x;
}
</code></pre>
<p>Es benötigt die Includes &lt;sstream&gt; und &lt;cassert&gt;. Der Aufruf ist dann</p>
<pre><code class="language-cpp">std::transform( argv + 1, argv + argc, std::inserter(a, a.end()), &amp;text2dbl);
</code></pre>
<p>Den kleinsten Wert liefert Dir übrigens der Algorithmus std::min_element.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069184</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 31 May 2006 21:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Thu, 01 Jun 2006 07:35:23 GMT]]></title><description><![CDATA[<p>Übrigens solltest du statt des inserter(...) lieber einen back_inserter() verwenden - spätestens wenn mehr als 16 Eingabewerte kommen, hast du ein Problem mit ungültigen Iteratoren.</p>
<p>(oder du gibst gleich die korrekte Größe bei reserve() an)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069275</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 01 Jun 2006 07:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Fri, 02 Jun 2006 10:14:08 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(oder du gibst gleich die korrekte Größe bei reserve() an)</p>
</blockquote>
<p>reserve ist für dieses Problem irrelevant, da es nur die Kapazität des Vektors ändert. Die Gültigkeit des Inserter-Iterators hängt hingegen einzig von der Größe des Vektors ab. Insofern muss der Rat heißen:</p>
<p>&quot;Übrigens solltest du statt des inserter(...) lieber einen back_inserter() verwenden - oder du gibst gleich die endgültige Größe bei &lt;b&gt;resize()&lt;/b&gt; an&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069982</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 02 Jun 2006 10:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Fri, 02 Jun 2006 10:17:45 GMT]]></title><description><![CDATA[<p>Falsch - der Inserter vergrößert den Vektor schon passend, wenn es sein muß. Allerdings kann die Einfügeposition, die er sich gemerkt hat, ungültig werden, wenn er seine Kapazität überschritten hat und die Daten umkopiert - deshalb muß die Kapazität so groß gewählt werden, daß er zwischendurch nichts umkopieren muß.<br />
(und das machst du mit reserve())</p>
<p>Wenn du unbedingt resize() verwenden willst, brauchst du überhaupt keinen Inserter mehr - da hast du schon genug Elemente und kannst sie mit transform() füllen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069985</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 02 Jun 2006 10:17:45 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Fri, 02 Jun 2006 10:29:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
Hast natürlich grundsätzlich recht, war ein Denkfehler meinerseits. In einem Punkt irrst du hingegen: der inserter ist unabhängig von reserve und resize immer gültig (unter der Annahme, dass er bei seiner Konstruktion gültig war). Das liegt daran, dass der inserter den Iterator beim Einfügen aktualisiert - er verwendet den Rückgabewert von Container::insert. Siehe dazu: 24.4.2.6.2</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1069994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1069994</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 02 Jun 2006 10:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Fri, 02 Jun 2006 19:43:46 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>der Inserter vergrößert den Vektor schon passend, wenn es sein muß. Allerdings kann die Einfügeposition, die er sich gemerkt hat, ungültig werden, wenn er seine Kapazität überschritten hat und die Daten umkopiert ..</p>
</blockquote>
<p>werden.</p>
<p>es wäre doch ein Armutszeugnis für die Iterator-Libary des C++-Standards, wenn CStoll recht hätte. Laut Standard (Kapitel 24.4.2.6.2) ist der Effekt einer Zuweisung an den insert_iterator:</p>
<pre><code class="language-cpp">iter = container-&gt;insert(iter, value);
++iter;
</code></pre>
<p>wobei 'container' und 'iter' aus dem Aufruf</p>
<pre><code class="language-cpp">inserter( container, iter )
</code></pre>
<p>stammen. D.h. auch wenn ein vector intern einen alloc aufruf und die Daten umkopiert und seine (bisherigen) Iteratoren ungültig werden, so liefert er mit der Methode 'insert' schön brav einen gültigen Iterator auf das soeben eingefügte Element zurück. Und erst dieser wird vom insert_iterator inkrementiert. Zeigte der Iterator vorher auf end() so wird auch der inkrementierte Iterator auf (das neue) end() zeigen.</p>
<p>Probiert's aus; es geht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070357</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Sat, 03 Jun 2006 11:28:19 GMT]]></title><description><![CDATA[<p>Hm, ich habe folgendes gemacht:</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;

namespace zparse
{
	template &lt;class T&gt;
	T convert(const char *txt);

	template &lt;class T&gt;
	bool convert(const char *txt, T &amp;obj);

}

template &lt;class T&gt;
T zparse::convert(const char *txt)
{
	std::istringstream buf(txt);
	T x;
	buf &gt;&gt; x;
	return x;
}

template &lt;class T&gt;
bool zparse::convert(const char *txt, T &amp;obj)
{
	std::istringstream buf(txt);
	buf &gt;&gt; obj;
	return buf.fail();
}
</code></pre>
<p>Und die main.cpp Datei sieht so aus:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

#include &quot;zparse.hpp&quot;

int main(int argc, char *argv[])
{
	std::vector&lt;double&gt; a;
	std::transform(argv + 1, argv + argc, std::inserter(a, a.end()), &amp;zparse::convert&lt;double&gt;);
	return 0;
}
</code></pre>
<p>Es lässt sich nicht kompilieren! Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070609</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 03 Jun 2006 11:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Sat, 03 Jun 2006 11:49:03 GMT]]></title><description><![CDATA[<p>weil du hier zwei überladene templates hast, und der compiler nicht weiss, welches er nehmen soll. das kannst du ihm per static_cast sagen (wir wollen die funktion mit einem parameter):</p>
<pre><code class="language-cpp">std::transform(argv + 1, argv + argc, std::inserter(a, a.end()), static_cast&lt;double (*)(const char*)&gt;(&amp;zparse::convert&lt;double&gt;));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1070621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070621</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 Jun 2006 11:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Sat, 03 Jun 2006 11:52:30 GMT]]></title><description><![CDATA[<p>Aber die Template Funktionen haben verschiedene Signaturen. Ich verstehe nicht warum der Kompilator die richtige Funktion nicht finden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070624</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 03 Jun 2006 11:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Sat, 03 Jun 2006 12:42:38 GMT]]></title><description><![CDATA[<p>Weil er in dem Moment, wo er entscheidet wie transform zu expandieren ist, nicht in transform reingucken kann wie der Templateparameter genutzt werden könnte um zu bestimmen welcher genommen werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070656</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sat, 03 Jun 2006 12:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Minimales Element einer Reihe on Sat, 03 Jun 2006 13:03:52 GMT]]></title><description><![CDATA[<p>Ok, ok - jetzt verstehe ich. Dann brauche ich eine Template Funktion, die dieses CAST macht.</p>
<pre><code class="language-cpp">template &lt;class T, class I&gt;
void parse(I &amp;iter, const int argc, const char *argv[]);
</code></pre>
<p>So etwas, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070669</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 03 Jun 2006 13:03:52 GMT</pubDate></item></channel></rss>