<?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[std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in Summe sicher 4 Stunden investiert, um eine Abweichung zwischen matlab und C++ Ergebnissen zu finden.</p>
<p>Folgendes:</p>
<pre><code>std::vector&lt;std::vector&lt;double&gt;&gt; data_i; // hat z.B. 3 Vektoren mit 200 Elementen

// Ich möchte die Summe fuer jeden Vector bilden (Die 3 ist jetzt mal hardcodiert)
std::vector&lt;double&gt; vec_sum_data_i;

for (std::size_t j = 0; j &lt; 3; ++j) {	
		vec_sum_data_i.push_back(std::accumulate(data_i[j].begin(), data_i[j].end(), 0));			
}
</code></pre>
<p>Ich weiß nicht wieso, aber ich erhalte stellenweise als Summe eine 0, obwohl das definitiv falsch ist. Beispiel bei den 3 Vektoren: Die ersten beiden sollen eine Summe von 0 haben, der letzte Vektor eine Summe von 88 (die letzte stimmt).<br />
Rechne ich die Summe selber aus, dann stimmen alle:</p>
<pre><code>for (std::size_t j = 0; j &lt; 3; ++j) {
	double summe = 0.0;
	for (auto&amp; k : data_i[j]) {
		summe += k;
	}
// [...]
}
</code></pre>
<p>Ich kann mir das nicht erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Auffällig ist, dass die Summe 0 umso häufiger aufzutreten scheint, je mehr Vektoren vorhanden sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was mag das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334354/std-accumulate-merkwürdiger-fehler-bei-vector-lt-vector-gt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 15:08:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334354.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Sep 2015 08:39:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 08:39:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in Summe sicher 4 Stunden investiert, um eine Abweichung zwischen matlab und C++ Ergebnissen zu finden.</p>
<p>Folgendes:</p>
<pre><code>std::vector&lt;std::vector&lt;double&gt;&gt; data_i; // hat z.B. 3 Vektoren mit 200 Elementen

// Ich möchte die Summe fuer jeden Vector bilden (Die 3 ist jetzt mal hardcodiert)
std::vector&lt;double&gt; vec_sum_data_i;

for (std::size_t j = 0; j &lt; 3; ++j) {	
		vec_sum_data_i.push_back(std::accumulate(data_i[j].begin(), data_i[j].end(), 0));			
}
</code></pre>
<p>Ich weiß nicht wieso, aber ich erhalte stellenweise als Summe eine 0, obwohl das definitiv falsch ist. Beispiel bei den 3 Vektoren: Die ersten beiden sollen eine Summe von 0 haben, der letzte Vektor eine Summe von 88 (die letzte stimmt).<br />
Rechne ich die Summe selber aus, dann stimmen alle:</p>
<pre><code>for (std::size_t j = 0; j &lt; 3; ++j) {
	double summe = 0.0;
	for (auto&amp; k : data_i[j]) {
		summe += k;
	}
// [...]
}
</code></pre>
<p>Ich kann mir das nicht erklären <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Auffällig ist, dass die Summe 0 umso häufiger aufzutreten scheint, je mehr Vektoren vorhanden sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was mag das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467172</guid><dc:creator><![CDATA[Ratlos3432]]></dc:creator><pubDate>Tue, 08 Sep 2015 08:39:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 08:50:36 GMT]]></title><description><![CDATA[<p>Probier mal</p>
<pre><code>vec_sum_data_i.push_back(std::accumulate(data_i[j].begin(), data_i[j].end(), 0.0 /* &lt;- mit Dezimalpunkt */));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2467174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467174</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 08 Sep 2015 08:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 14:52:27 GMT]]></title><description><![CDATA[<p>Erklärung: <code>accumulate()</code> ist ein Template. D.h. irgendwo muss es den Typ für Summe/Rückgabewert herbekommen, und den holt es sich, wenn nicht anders angegeben, vom dritten Argument des Funktionsaufrufs:<br />
<a href="http://www.cplusplus.com/reference/numeric/accumulate/" rel="nofollow">http://www.cplusplus.com/reference/numeric/accumulate/</a></p>
<p>Und &quot;0&quot; wird zunächst mal als <code>int</code> interpretiert, daher wird der ganze Aufruf mit int berechnet (und alle Zahlen aus dem Vector verlieren ihren Nachkommateil), ergo ein int-Ergebnis.</p>
<p>Du kannst auch schreiben</p>
<pre><code>... std::accumulate&lt;double&gt;(data_i[j].begin() ...
</code></pre>
<p>dann wird <code>double</code> erzwungen und man übersieht es ggf. nicht so leicht - zusätzlich zum &quot;0.0&quot;, was die korrekte Form für eine <code>double</code> -Null ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467225</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Tue, 08 Sep 2015 14:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 15:59:03 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Du kannst auch schreiben</p>
<pre><code>... std::accumulate&lt;double&gt;(data_i[j].begin() ...
</code></pre>
<p>dann wird <code>double</code> erzwungen und man übersieht es ggf. nicht so leicht - zusätzlich zum &quot;0.0&quot;, was die korrekte Form für eine <code>double</code> -Null ist.</p>
</blockquote>
<p>Don't help the compiler! Lasse den Compiler alle Typen deduzieren, es gibt Fälle wo ein Update der Funktion dann was Falsches macht.<br />
Besser:</p>
<pre><code>vec_sum_data_i.push_back(std::accumulate(data_i[j].begin(), data_i[j].end(), double(0)));
</code></pre>
<p>Das machts auch deutlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467234</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 08 Sep 2015 15:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 15:59:49 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Du kannst auch schreiben</p>
<pre><code>... std::accumulate&lt;double&gt;(data_i[j].begin() ...
</code></pre>
<p>dann wird <code>double</code> erzwungen und man übersieht es ggf. nicht so leicht - zusätzlich zum &quot;0.0&quot;, was die korrekte Form für eine <code>double</code> -Null ist.</p>
</blockquote>
<p>Kann man leider nicht schreiben weil der Typ für die Summe erst der zweite Template-Parameter ist. Wenn dann so:</p>
<pre><code>std::accumulate&lt;std::vector&lt;double&gt;::iterator, double&gt;(data_i[j].begin(), ...
</code></pre>
<p>Aber sowas will eigentlich niemand schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467236</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 08 Sep 2015 15:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 17:36:32 GMT]]></title><description><![CDATA[<p>Wenn man will kann man sich auch einen Wrapper schreiben ders richtig macht:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;numeric&gt;
#include &lt;vector&gt;

template &lt;typename InputIt&gt;
auto sum(InputIt first, InputIt last,
	typename std::remove_reference&lt;decltype(*first)&gt;::type init) -&gt; decltype(init)
{
	return std::accumulate(first, last, init);
}

int main()
{
	std::vector&lt;double&gt; v = { 0.5, 1, 2 };
	std::cout &lt;&lt; sum(v.begin(), v.end(), 0 /*Jetzt auch ohne Dezimal-Punkt!*/) &lt;&lt; '\n';
}
</code></pre>
<p>Eigentlich nervig dass sowas nicht der Standard ist... warum eigentlich nicht? Hab als ich den Fehler das erste mal hatte auch ewig gebraucht bis ich das gemerkt habe <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2467256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467256</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 08 Sep 2015 17:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 17:36:27 GMT]]></title><description><![CDATA[<p>Weil <code>accumulate</code> allgemein genug sein soll, auch auf Typen addieren zu können, die mit dem Containerelement nichts am Hut haben.</p>
<p>PS: Du suchst womöglich <code>iterator_traits&lt;&gt;::value_type</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467257</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 08 Sep 2015 17:36:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 17:38:12 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Weil <code>accumulate</code> allgemein genug sein soll, auch auf Typen addieren zu können, die mit dem Containerelement nichts am Hut haben.</p>
</blockquote>
<p>Sorry, aber das versteh ich nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467258</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 08 Sep 2015 17:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Tue, 08 Sep 2015 17:39:47 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Weil <code>accumulate</code> allgemein genug sein soll, auch auf Typen addieren zu können, die mit dem Containerelement nichts am Hut haben.</p>
</blockquote>
<p>Sorry, aber das versteh ich nicht?</p>
</blockquote>
<p>Sagen wir mal, du hast einen Typen, der nicht zu <code>int</code> konvertierbar ist. Auf den ich aber <code>int</code> addieren kann. I.e. <code>+= i</code> ist möglich. Dann wird das von der STL vorgegebene <code>accumulate</code> problemlos funktionieren, deines aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467260</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 08 Sep 2015 17:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Wed, 09 Sep 2015 08:34:49 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Sagen wir mal, du hast einen Typen, der nicht zu <code>int</code> konvertierbar ist. Auf den ich aber <code>int</code> addieren kann. I.e. <code>+= i</code> ist möglich. Dann wird das von der STL vorgegebene <code>accumulate</code> problemlos funktionieren, deines aber nicht.</p>
</blockquote>
<p>Ok, da hast du recht, das hatte ich nicht bedacht... naja, vielleicht geht das ja dann mit concepts-Überladungen sauber (da kenn ich mich aber noch nicht wirklich aus). Weil ungünstig finde ich das trotzdem^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467342</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 09 Sep 2015 08:34:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Thu, 10 Sep 2015 06:21:22 GMT]]></title><description><![CDATA[<p>Nur als Nachtrag: Mit dem double (0.0) war das Problem dann auch gelöst, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467503</guid><dc:creator><![CDATA[Ratlos3432]]></dc:creator><pubDate>Thu, 10 Sep 2015 06:21:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Thu, 10 Sep 2015 17:32:29 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Sagen wir mal, du hast einen Typen, der nicht zu <code>int</code> konvertierbar ist. Auf den ich aber <code>int</code> addieren kann. I.e. <code>+= i</code> ist möglich. Dann wird das von der STL vorgegebene <code>accumulate</code> problemlos funktionieren, deines aber nicht.</p>
</blockquote>
<p>Ich hab nochmal ein bisschen darüber nachgedacht und so ganz passt mir diese Erklärung nicht (vielleicht verstehe ich auch was falsch).</p>
<p>Laut <a href="http://en.cppreference.com/w/cpp/algorithm/accumulate" rel="nofollow">Doku</a> sieht der Code von <code>std::accumulate</code> etwa so aus (entspricht auch dem meines Compilers VS2013):</p>
<pre><code>template&lt;class InputIt, class T&gt;
T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first) {
        init = init + *first;
    }
    return init;
}
</code></pre>
<p>Den Wertetyp des Input-Iterators nenne ich mal <code>T</code> .</p>
<p>Du meinst also man kann auf ein <code>T</code> einen <code>int</code> addieren. Allerdings ist <code>T</code> ja auf der rechten Seite, also müsste man wenn dann den <code>operator+</code> mit <code>int</code> als linksseitigem Argument und <code>T</code> als rechtsseitigem Argument überladen. Außerdem muss dieser <code>operator+</code> dann etwas zu <code>int</code> konvertierbares zurückgeben, da <code>init</code> (vom Typ <code>int</code> ) gleich diesem gesetzt wird. Daher kann man schonmal nicht ein <code>int</code> auf ein <code>T</code> addieren, sondern höchstens ein <code>T</code> auf ein <code>int</code> addieren. Und das Ergebnis muss dann wieder ein <code>int</code> (bzw. in ein solches konvertierbar) sein.</p>
<p>Das heißt, die einzige Möglichkeit die mir einfällt dein Szenario umzusetzen wäre so:</p>
<pre><code>struct foo { int val = 0; }; // Nicht zu int konvertierbar ...

int operator+(int i, foo const &amp;f) { return i + f.val; } // ... aber auf int addierbar
</code></pre>
<p>Das scheint aber keinen Sinn zu machen. Denn dann gilt folgendes:</p>
<pre><code>foo f;
int i = f; // Geht nicht
int j = 0 + f; // Geht
</code></pre>
<p>was offensichtlich semantisch gesehen Mist ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467576</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 10 Sep 2015 17:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Fri, 11 Sep 2015 08:18:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30076">@happystudent</a> Ne, ich meinte folgendes:</p>
<pre><code>struct A {

   A operator+(int);
};

int arr[] {1, 2, 3};
std::accumulate(arr, arr+3, A());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2467623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467623</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 11 Sep 2015 08:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Fri, 11 Sep 2015 10:00:33 GMT]]></title><description><![CDATA[<p>Das hier wäre sogar ein halbwegs sinnvoller Anwendungsfall:</p>
<pre><code>vector&lt;char&gt; foo = {'T', 'e', 's', 't'};
auto str = accumulate(foo.begin(), foo.end(), string());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2467645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467645</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 11 Sep 2015 10:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::accumulate: Merkwürdiger Fehler bei vector&amp;lt;vector&amp;gt; on Mon, 14 Sep 2015 18:51:38 GMT]]></title><description><![CDATA[<p>Stimmt, ihr habt recht. Daran hatte ich nicht gedacht <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/2467985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467985</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 14 Sep 2015 18:51:38 GMT</pubDate></item></channel></rss>