<?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&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()??]]></title><description><![CDATA[<p>Hallo,<br />
beschäftige mich nun erstmals mit std::vector und stoße gleich auf ein kleines Problem. Offensichtlich funtioniert soetwas nicht:<br />
(std:: lasse ich in den Beispielen zur Übersicht weg)<br />
(Auch ist die Liste der string Elemente stark verkürzt, es sind 27 Elemente, hier nur 5)</p>
<p>Ich wollte das std::string Array:</p>
<pre><code>string sprache[5] = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>Als Vector anlegen, ohne weiterhin das string Array zu verwenden.<br />
(Also nicht, das string Array und den vector anlegen und das string Array dann hineinkopieren)</p>
<pre><code>vector &lt;string&gt; sprache(5) = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>/\<br />
||<br />
Also, so funktioniert es schonmal nicht. LOL (Wäre auch zu einfach gewesen!!)</p>
<p>Gut, nach einigem Durchforsten in der Klassenbeschreibung kam ich dann auf diese Lösung:</p>
<pre><code>vector &lt;string&gt; sprache(&quot;Deu&quot;,&quot;Eng&quot;,&quot;Rus&quot;,&quot;Pol&quot;,&quot;Lit&quot;};
</code></pre>
<p>ABER --&gt; Das funktioniert so auch nicht, nur für 2 Elemente, ab 3 Elementen passt wohl der Construktor nicht mehr.</p>
<p>Soweit habe ich es ja nun verstanden, daß es nicht geht, aber gibt es eine Möglichkeit, daß es geht?</p>
<p>Meine bisherige Lösung:</p>
<pre><code>vector&lt;string&gt; sprache;
sprache.push_back(&quot;Deu&quot;);
sprache.push_back(&quot;Eng&quot;);
sprache.push_back(&quot;Rus&quot;);
sprache.push_back(&quot;Pol&quot;);
sprache.push_back(&quot;Lit&quot;);
</code></pre>
<p>funktioniert bestens, aber ist ein wenig umständlich, da ich sehr große string Arrays habe. mit 27, 41 und 138 string Elementen.</p>
<p>Schön wäre eine Initialisierung im Stil von:</p>
<pre><code>vector&lt;string&gt; sprache ..irgendwie die string Elemente reinpacken..
</code></pre>
<p>Also direkt mit den string Elementen initialisieren.</p>
<p>Mir würde auch eine Antwort der Art:</p>
<p>&quot;Geht nicht.&quot; helfen, dann muß ich nicht weiter suchen und kann wieder ruhig schlafen.</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279551/vector-lt-string-gt-initialisieren-gt-string-string-langsamer-als-strcmp</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 12:16:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279551.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Dec 2010 09:04:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 21:59:16 GMT]]></title><description><![CDATA[<p>Hallo,<br />
beschäftige mich nun erstmals mit std::vector und stoße gleich auf ein kleines Problem. Offensichtlich funtioniert soetwas nicht:<br />
(std:: lasse ich in den Beispielen zur Übersicht weg)<br />
(Auch ist die Liste der string Elemente stark verkürzt, es sind 27 Elemente, hier nur 5)</p>
<p>Ich wollte das std::string Array:</p>
<pre><code>string sprache[5] = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>Als Vector anlegen, ohne weiterhin das string Array zu verwenden.<br />
(Also nicht, das string Array und den vector anlegen und das string Array dann hineinkopieren)</p>
<pre><code>vector &lt;string&gt; sprache(5) = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>/\<br />
||<br />
Also, so funktioniert es schonmal nicht. LOL (Wäre auch zu einfach gewesen!!)</p>
<p>Gut, nach einigem Durchforsten in der Klassenbeschreibung kam ich dann auf diese Lösung:</p>
<pre><code>vector &lt;string&gt; sprache(&quot;Deu&quot;,&quot;Eng&quot;,&quot;Rus&quot;,&quot;Pol&quot;,&quot;Lit&quot;};
</code></pre>
<p>ABER --&gt; Das funktioniert so auch nicht, nur für 2 Elemente, ab 3 Elementen passt wohl der Construktor nicht mehr.</p>
<p>Soweit habe ich es ja nun verstanden, daß es nicht geht, aber gibt es eine Möglichkeit, daß es geht?</p>
<p>Meine bisherige Lösung:</p>
<pre><code>vector&lt;string&gt; sprache;
sprache.push_back(&quot;Deu&quot;);
sprache.push_back(&quot;Eng&quot;);
sprache.push_back(&quot;Rus&quot;);
sprache.push_back(&quot;Pol&quot;);
sprache.push_back(&quot;Lit&quot;);
</code></pre>
<p>funktioniert bestens, aber ist ein wenig umständlich, da ich sehr große string Arrays habe. mit 27, 41 und 138 string Elementen.</p>
<p>Schön wäre eine Initialisierung im Stil von:</p>
<pre><code>vector&lt;string&gt; sprache ..irgendwie die string Elemente reinpacken..
</code></pre>
<p>Also direkt mit den string Elementen initialisieren.</p>
<p>Mir würde auch eine Antwort der Art:</p>
<p>&quot;Geht nicht.&quot; helfen, dann muß ich nicht weiter suchen und kann wieder ruhig schlafen.</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999882</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 21:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:13:38 GMT]]></title><description><![CDATA[<p>Hier hast Du die zur Verfügung stehenden Konstruktoren:<br />
<a href="http://cplusplus.com/reference/stl/vector/vector/" rel="nofollow">http://cplusplus.com/reference/stl/vector/vector/</a><br />
Was Du möchtest, geht nicht. Du könntest den Vektor mit einer Anzahl gleicher Werte initialisieren (Die zweite Version), oder mit einem bereits vorhandenen Objekt, auf das mit Iteratoren zugegriffen werden kann (Version Drei) oder mit einem bereits vorhandenen Vektor (die letzte Version).<br />
Mehr ist nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999884</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:16:15 GMT]]></title><description><![CDATA[<p>Alles klar, das hilft mir weiter, dann nehme ich die push_back Version um den Vector zu füllen.</p>
<p>Danke für die flotte Antwort..</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999885</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:16:15 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:35:49 GMT]]></title><description><![CDATA[<p>Doch, doch, das geht.</p>
<p>Die Konstruktorvariante <code>template &lt;class InputIterator&gt; vector (InputIterator first, InputIterator last, const Allocator&amp; = Allocator())</code> sollte funktionieren, folgendermaßen:</p>
<pre><code class="language-cpp">std::string strarr[] = {&quot;str1&quot;, &quot;str2&quot;, &quot;str3&quot;, &quot;str4&quot;};
std::vector&lt;std::string&gt; strvec(strarr, strarr + sizeof(strarr) / sizeof(std::string));
</code></pre>
<p>Zeiger sind auch Iteratoren, wenn es nach der STL geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999890</guid><dc:creator><![CDATA[Famer]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:42:11 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>Ich wollte das std::string Array:</p>
<pre><code>string sprache[5] = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>Als Vector anlegen, <strong>ohne weiterhin das string Array zu verwenden</strong>.<br />
(Also nicht, das string Array und den vector anlegen und das string Array dann hineinkopieren)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1999892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999892</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:51:44 GMT]]></title><description><![CDATA[<p>Für sowas kann man schön <a href="http://www.boost.org/doc/libs/1_45_0/libs/assign/doc/index.html" rel="nofollow">Boost.Assign</a> nehmen.</p>
<pre><code class="language-cpp">#include &lt;boost/assign/std/vector.hpp&gt;

// ...

vector&lt;string&gt; v;
v += &quot;Deu&quot;, &quot;Pol&quot;, &quot;Lit&quot;, &quot;...&quot;;
</code></pre>
<p>Natürlich hast du dann eine zusätzliche Abhängigkeit, die ist in dem Fall aber marginal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999899</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:53:21 GMT]]></title><description><![CDATA[<p>Ich dachte, er meinte damit soetwas wie push_back. Noch ein bisschen früh für mich...<br />
Naja, dann eben Zustimmung für Belli: Geht nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999900</guid><dc:creator><![CDATA[Famer]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 09:53:50 GMT]]></title><description><![CDATA[<p>Wow, die Lösung mit boost gefällt mir.</p>
<p>Vielen Dank!!</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999901</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 09:53:50 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 10:09:51 GMT]]></title><description><![CDATA[<p>Wenn du einen aktuellen Compiler benutzt, der den neuen ( noch nicht verabschiedeten ) Standard unterstützt, kannst du den Vector genau so wie das Array initialisieren. gcc 4.5 oder VisualStudio 2010 unterstützen dies bereits.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999906</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 29 Dec 2010 10:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 10:43:06 GMT]]></title><description><![CDATA[<p>Hmm, meinst du so?</p>
<pre><code>vector &lt;string&gt; sprache(5) = 
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Rus&quot;,
&quot;Pol&quot;,
&quot;Lit&quot;
};
</code></pre>
<p>(Mit runden Klammern, oder mit Eckigen?)</p>
<p>Habe GCC 4.5, aber mit runden Klammern hat es nicht geklappt.</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999917</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 10:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 10:52:52 GMT]]></title><description><![CDATA[<p>Hmmm, so geht es...</p>
<pre><code>vector&lt;string&gt; sprache=
{
&quot;Deu&quot;,
&quot;Eng&quot;,
&quot;Ita&quot;,
&quot;Fra&quot;,
&quot;Gri&quot;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1999921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999921</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 10:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:00:55 GMT]]></title><description><![CDATA[<blockquote>
<p>gcc 4.5 oder VisualStudio 2010 unterstützen dies bereits.</p>
</blockquote>
<p>Also VS2010 unterstützt das leider noch nicht, zumindest bekomme ich den Fehler<br />
error C2552: 'sprache' : non-aggregates cannot be initialized with initializer list</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999925</guid><dc:creator><![CDATA[VS2010]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:02:21 GMT]]></title><description><![CDATA[<p>Allerdings hat er wohl nun Probleme, den Speicher wieder freizugeben jedenfalls schmeisst er mit nun beim Verlassen der Funktion einen Ausnahmefehler.</p>
<p>Ich probiere es nun erst einmal mit der boost Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999926</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:28:12 GMT]]></title><description><![CDATA[<p>Tja, mit der boost Lösung das gleiche Problem.<br />
Nach Verlassen der Funktion ein Ausnahmefehler.<br />
Nur meldet mir der Compiler diesmal, daß er einen nicht-virtuellen Destruktor hat.</p>
<p>Gehe ich recht in der Annahme, daß der vector am Ende nicht freigegeben werden kann und deswegen diesen Ausnahmefehler erzeugt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999935</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:33:26 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>Gehe ich recht in der Annahme, daß der vector am Ende nicht freigegeben werden kann und deswegen diesen Ausnahmefehler erzeugt?</p>
</blockquote>
<p>Dies wäre äußerst ungewöhnlich. Zeig mal mehr Code. Das mit dem fehlenden virtuellen Destruktor klingt schon einmal verdächtig. Erbst du etwa von einem STL-Container?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999937</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:49:51 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>Also, so funktioniert es schonmal nicht. LOL (Wäre auch zu einfach gewesen!!)</p>
</blockquote>
<p>Mit Raten kommst Du in C++ nicht weit. Die Sprache bietet da so einige Irregularitäten. Das kann man sich nicht alles selbst zusammen reimen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999942</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 11:58:35 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>Tja, mit der boost Lösung das gleiche Problem.<br />
Nach Verlassen der Funktion ein Ausnahmefehler.</p>
</blockquote>
<p>Wahrscheinlich rufst Du irgendwo undefiniertes Verhalten hervor.</p>
<p>Don Carsto schrieb:</p>
<blockquote>
<p>Nur meldet mir der Compiler diesmal, daß er einen nicht-virtuellen Destruktor hat.</p>
</blockquote>
<p>Wer hat einen nicht-virtuellen Destruktur und warum sollte das hier eine Rolle spielen?</p>
<p>Don Carsto schrieb:</p>
<blockquote>
<p>Gehe ich recht in der Annahme, daß der vector am Ende nicht freigegeben werden kann und deswegen diesen Ausnahmefehler erzeugt?</p>
</blockquote>
<p>Falsch geraten.</p>
<p>Versuche das Programm zu verkürzen und vereinfachen und damit den Fehler zu isolieren. Oft findet man so schon den Übeltäter. Wenn Du uns ein kurzes, komplettes Programm zeigen kannst, was sich Deiner Meinung nach ähnlich komisch verhält, dann kann man mehr dazu sagen. Betonung liegt auf &quot;kurz&quot; und &quot;komplett&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999944</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Dec 2010 11:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 12:27:59 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Dies wäre äußerst ungewöhnlich. Zeig mal mehr Code. Das mit dem fehlenden virtuellen Destruktor klingt schon einmal verdächtig. Erbst du etwa von einem STL-Container?</p>
</blockquote>
<p>Ich habe nun mal das Ganze in eine einfache Consolen Anwendung gepackt. Die Warnungen mit dem non-virtuell-destruktor kommen trotzdem, aber es läuft ohne Ausnahme durch. (Die Warnungen kommen schon,wenn ich nur die boost-include einbinde) Liegt wohl eher an der hohen Warnstufe des Compilers.</p>
<p>Nun habe ich mal den &quot;fehlerhaften&quot; Code komplett gekürzt und schwupps läuft es durch.<br />
Da scheint irgendein anderes böses Objekt die Ausnahme zu erzeugen.</p>
<p>Leider ist der Coee so lang und komplex, daß ein posten nicht viel Sinn macht.</p>
<p>Da ich nun weiß, daß es nicht am vector selbst liegt, sondern eher an dem chaotischen Drumherum, werde ich das mal entwirren (Schritt für Schritt ausblenden) und die fehlerhafte Stelle suchen.</p>
<p>Sinn des Ganzen war sowieso zunächst den Code komplett zu Überarbeiten, um unsichere Stellen auszumerzen.</p>
<p>zu krümelkacker: (Post erst während der Erstellung gelesen)<br />
Ja, leider kann ich keinen vereinfachten Code posten, der sich ähnlich verhält.<br />
Und das mit dem Isolieren habe ich gerade in Angriff genommen. Mal sehen.</p>
<p>Jedenfalls funktioniert die boost-Lösung und auch die GCC 4.5 mit dem noch nicht freigegebenen C++ Standard auch. Der Übeltäter ist irgendwo anders im Code. <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>
<p>Vielen Dank nochmal für die Unterstützung. Und die Lösung des Problems.</p>
<p>So.. nun gehts ans Fehlersuchen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999964</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 12:27:59 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 14:46:42 GMT]]></title><description><![CDATA[<p>So, habe die letzten Stunden damit verbracht den Fehler zu suchen.</p>
<p>Es lag an einem zu kleinen char filestring[40];</p>
<p>Dieses wurde wohl etwas zu weit (um 3 Zeichen) überschrieben.<br />
Dadurch wurde die restliche Speicherverwaltung überaus brüchig.<br />
Hatte sich bisher noch nie bemerkbar gemacht, doch seit ich nun auf std::strings und std::vector umgestellt habe, wurden Ausnahmen geschmissen.</p>
<p>Eine tickende Zeitbombe....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000021</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 14:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 15:44:37 GMT]]></title><description><![CDATA[<p>Ich hoffe mal schwer, du hast nun das <code>char[]</code> -Array durch <code>std::string</code> ersetzt und nicht nur um 3 Zeichen vergrössert... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Wechsle bei der Gelegenheit am besten alle rohen C-Arrays aus (gegen <code>std::tr1::array</code> , <code>boost::array</code> , oder <code>std::array</code> - alles das Gleiche) und ersetze alle Zeiger auf dynamische Arrays durch <code>std::vector</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000049</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 29 Dec 2010 15:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 16:35:26 GMT]]></title><description><![CDATA[<p>Ja, bin dabei, den kompletten Code zu überarbeiten.<br />
Das war ja auch Sinn der Übung, daß ich die char Arrays durch std:string ersetzen wollte, a) um zu gucken, ob es dann eine Performance-Erhöhung gibt und b) weil ich std::string sicherer von der Speicherverwaltung halte.<br />
Nebenher wollte ich dann auch gleich alle mehrdimensionalen char Arrays durch vector&lt;string&gt; ersetzen.</p>
<p>Habe nun erstmal eine einigermassen lauffähige Version erschaffen, die sich nun genauso verhält wie die Alte, außer, daß es nun 3x-langsamer geworden ist.</p>
<p>Habe aber auch noch nicht den kompletten Code umgebastelt.<br />
Sind noch einge Krücken drinne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000076</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 16:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 19:30:06 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>Habe nun erstmal eine einigermassen lauffähige Version erschaffen, die sich nun genauso verhält wie die Alte, außer, daß es nun 3x-langsamer geworden ist.</p>
</blockquote>
<p>Sollte nicht sein, wenn man richtig umbaut.</p>
<p>Natürlich sollte man schon einige Dinge beachten, damit der Vergleich überhaupt gerechtfertigt ist:</p>
<ul>
<li>Ganze Container so selten wie möglich kopieren. Lieber mit Const-Referenzen oder Iteratoren arbeiten.</li>
<li>Generell Objekt-Kopien vermeiden durch Einsatz von <code>swap()</code> und Move-Semantik in C++0x.</li>
<li>Wenn die Grösse bei <code>std::vector</code> und <code>std::string</code> im Voraus bekannt ist, mit <code>reserve()</code> vorallokieren.</li>
<li>Im Release-Modus kompilieren <strong>und</strong> Debug-Laufzeitumgebung abschalten.</li>
<li>Sicherheitsmassnahmen wie Checked-Iterators deaktivieren.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2000126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000126</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 29 Dec 2010 19:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 21:57:32 GMT]]></title><description><![CDATA[<p>So, habe nun die Bremse gefunden.<br />
Sehr kurios.</p>
<p>Hatte zunächst nach dem Umstellen auf string und vector folgendes sehr zeitaufwendige Konstrukt von char-Array auf string umgestellt (Dieses wird etwa 26000 mal aufgerufen)<br />
(Die Schleife selbst -&gt;for(int aa=0;aa&lt;shad_sku.size();aa++)&lt;- ca.65000 mal)</p>
<p>Hier das Original mit char-Array:</p>
<pre><code>if (teilupdate==1)
{
if (strcmp(test[spalmengel],&quot;0&quot;)==0) strcpy(app,&quot;x&quot;);

strcpy(bigbuffer,&quot;&quot;);
sprintf(bigbuffer,&quot;%s\t%s\t%s\t%s\t%s\t%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\t\t\t\t%s\t%s\t%d\t\n&quot;,test[spalsku],test[spalautor]
,fattitle,test[spalverlag],test[spaljahr],test[spalformat],test[spalpreis],test[spalmengel],test[spalamazustand],fatnote,test[spalkatamazon],test[spalsprache],amaurl,app,7);

 for (int aa=0;aa&lt;anzsku;aa++)
  {
   if (strcmp(shad[aa].sku,test[spalsku])==0)
     {
      if((strcmp(shad[aa].anz,test[spalmengel])!=0)||(strcmp(shad[aa].dat,test[spalaenderung])!=0)) {f &lt;&lt; bigbuffer;aa=anzsku;flag=1;NR++;}
      else {aa=anzsku;flag=1;}
     }       
  }
if (flag==0) {f &lt;&lt; bigbuffer;NR++;}
rectx=SUMAKT*balkx/SUMMAX;SUMAKT++;
}
</code></pre>
<p>Laufzeit flotte 16 Sekunden.</p>
<p>Dann die Abänderung ins std::string + vector:<br />
bigbuffer ist nun ein stringstream, aber der bremst nicht.</p>
<pre><code>if (teilupdate==1)
{
if (test[spalmengel]==&quot;0&quot;) strcpy(app,&quot;x&quot;);

bigbuffer &lt;&lt; test[spalsku] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalautor] &lt;&lt; &quot;\t&quot; &lt;&lt; fattitle &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalverlag]
          &lt;&lt; &quot;\t&quot; &lt;&lt; test[spaljahr] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalformat] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalpreis] &lt;&lt; &quot;\t\t\t&quot;
          &lt;&lt; test[spalmengel] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalamazustand] &lt;&lt; &quot;\t&quot; &lt;&lt; fatnote &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalkatamazon]
          &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalsprache] &lt;&lt; &quot;\t\t\t\t&quot; &lt;&lt; amaurl &lt;&lt; &quot;\t&quot; &lt;&lt; app &lt;&lt; &quot;\t&quot; &lt;&lt; &quot;7&quot; &lt;&lt; &quot;\t\n&quot;;

for (int aa=0;aa&lt;shad_sku.size();aa++)
  {
   if (shad_sku.at(aa)==test[spalsku])
     {
      if((shad_anz.at(aa)!=test[spalmengel])||(shad_dat.at(aa)!=test[spalaenderung]))
         {
          f &lt;&lt; bigbuffer.str();
          flag=1;
          NR++;
          break;
         }
      else
         {
          flag=1;
          break;
         }
     }
  }
if (flag==0) {f &lt;&lt; bigbuffer.str();NR++;}
rectx=SUMAKT*balkx/SUMMAX;SUMAKT++;
}
</code></pre>
<p>Laufzeit grobe 60 Sekunden.</p>
<p>Dann nun wieder abgeändert in:</p>
<pre><code>if (teilupdate==1)
{
if (strcmp(test[spalmengel].c_str(),&quot;0&quot;)==0) strcpy(app,&quot;x&quot;);

bigbuffer &lt;&lt; test[spalsku] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalautor] &lt;&lt; &quot;\t&quot; &lt;&lt; fattitle &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalverlag]
          &lt;&lt; &quot;\t&quot; &lt;&lt; test[spaljahr] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalformat] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalpreis] &lt;&lt; &quot;\t\t\t&quot;
          &lt;&lt; test[spalmengel] &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalamazustand] &lt;&lt; &quot;\t&quot; &lt;&lt; fatnote &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalkatamazon]
          &lt;&lt; &quot;\t&quot; &lt;&lt; test[spalsprache] &lt;&lt; &quot;\t\t\t\t&quot; &lt;&lt; amaurl &lt;&lt; &quot;\t&quot; &lt;&lt; app &lt;&lt; &quot;\t&quot; &lt;&lt; &quot;7&quot; &lt;&lt; &quot;\t\n&quot;;

for (int aa=0;aa&lt;shad_sku.size();aa++)
  {
   if (strcmp(shad_sku.at(aa).c_str(),test[spalsku].c_str())==0)
     {
      if((strcmp(shad_anz.at(aa).c_str(),test[spalmengel].c_str())!=0)||(strcmp(shad_dat.at(aa).c_str(),test[spalaenderung].c_str())!=0))
         {
          f &lt;&lt; bigbuffer.str();
          flag=1;
          NR++;
          break;
         }
      else
         {
          flag=1;
          break;
         }
     }
  }
if (flag==0) {f &lt;&lt; bigbuffer.str();NR++;}
rectx=SUMAKT*balkx/SUMMAX;SUMAKT++;
}
</code></pre>
<p>Also sämtliche string==string und string!=string Vergleiche durch strcmp(x,y)==0/!=0 ersetzt.<br />
Laufzeit grobe 25 Sekunden.</p>
<p>.at() und .size() Verzicht führt zu keinerlei Veränderung.</p>
<p>Warum ist string==string string!=string langsamer als strcmp() ??</p>
<p>Gibt es da eine Abhilfe?</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000196</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 29 Dec 2010 21:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Wed, 29 Dec 2010 23:30:51 GMT]]></title><description><![CDATA[<p>Und welche Compileroptionen? Keine Ahnung was f ist und sonst bleibt auch nur raten uebrig.</p>
<blockquote>
<p>.at() und .size() Verzicht führt zu keinerlei Veränderung</p>
</blockquote>
<p>Na das wuerde mich stutzig machen.</p>
<blockquote>
<p>Warum ist string==string string!=string langsamer als strcmp()?</p>
</blockquote>
<p>Hmm, es ist nicht langsamer. Anstatt zu raten, benutze einen Profiler!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000214</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 29 Dec 2010 23:30:51 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Thu, 30 Dec 2010 00:14:01 GMT]]></title><description><![CDATA[<p>Hast du meine Ratschläge befolgt (besonders die letzten beiden)?</p>
<p>Ansonsten kann ich mich knivil anschliessen. Und benutze bitte [cpp]- statt [code]-Tags, die haben Syntaxhighlighting.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000218</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Dec 2010 00:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;string&amp;gt; initialisieren.. -&amp;gt; string==&#x2F;!=string langsamer als strcmp()?? on Thu, 30 Dec 2010 09:34:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Hast du meine Ratschläge befolgt (besonders die letzten beiden)?</p>
</blockquote>
<p>Ja, habe etliche Kombinationen probiert und es führte zun Nichts.<br />
Vorallokierung mit .reserve() gab auch keinelei Vorteile.</p>
<blockquote>
<p>Ansonsten kann ich mich knivil anschliessen. Und benutze bitte [cpp]- statt [code]-Tags, die haben Syntaxhighlighting.</p>
</blockquote>
<p>[quote]</p>
<p>Okay, habe nun nochmals den Schleifenkörper auf Durchläufe geprüft und muss sagen es sind insgesamt: 2075966830 Durchläufe. !!Jaja, was für ein Wahnsinn!!<br />
(Es werden hier zwei Tabellen miteinander verglichen. Die 1.Tabelle hat knappe 65000 Einträge die 2.Tabelle ca.26000.)</p>
<p>Da beide Tabellen aber nach gleichem Kriterium sortiert sind, muß ich garnicht jedesmal die komplette Tabelle nach einem Match durchsuchen, sondern es reicht, wenn ich nach einem Fund, einfach den Schleifenstartindex hochsetze.<br />
(Dadurch verkleinert sich der Suchbereich)<br />
Nachdem ich diese kleine Korrektur vorgenommen hatte, sind es nur noch 64435 Durchläufe.<br />
Auf dieser Basis habe ich nun die strcmp's wieder durch string==string ersetzt und die Zeit ist nun ohne merkliche Unterschiede jedesmal knappe 8 Sekunden.</p>
<p>(Hatte auch gestern mal eine Lösung mit &lt;vector&gt;.erase() versucht, aber durch diese dynamische Vectorverkleinerung schrumpfte zwar der Suchbereich, aber es dauerte auch sehr lange, weil das Entfernen eines Vector-Elements wohl auch recht zeitaufwendig ist)</p>
<p>Auf jeden Fall spielt wohl die Anzahl der Schleifen eine Rolle.<br />
Wenn ich nun richtig gerechnet habe ist der Unterschied zwischen strcmp und string==string 0,000000025 Sekunden.<br />
Bei 65000 Durchläufen wären es 0,0016 Sekunden länger.<br />
Und bei 2000000000 Durchläufen schon 50 Sekunden.</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000262</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Thu, 30 Dec 2010 09:34:39 GMT</pubDate></item></channel></rss>