<?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::string split-Funktion Optimierung möglich?]]></title><description><![CDATA[<p>es kommt zwar relativ selten vor, dass ich frag, ob mein Code gut ist, aber<br />
in diesem Fall gehts doch ein bisschen darum, das er Performant ist und<br />
verbessern will ich mich ja auch mal <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>
<p>Habe hier mal zwei Splitfunktionen mit Aufruf gebastelt.<br />
Nach meinen Messungen ist schonmal split1 um &quot;einiges Schneller&quot; als split2.<br />
Aber ich glaube, dass man trotzdem noch eingiges verbessern könnte.<br />
Bin ja kein Spezi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Hat jemand ein paar Vorschläge?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

#include &lt;windows.h&gt;

void split1(const std::string src, const std::string delimiter, std::vector&lt;std::string&gt; &amp;vecString)
{
	int newPos = 0, oldPos = 0;

	oldPos = src.find(delimiter, 0);
	if(oldPos != std::string::npos)
		vecString.push_back(src.substr(0, oldPos));
	else
		vecString.push_back(src);

	while(oldPos != std::string::npos)
	{
		newPos = src.find(delimiter, oldPos+delimiter.length());
		if(oldPos != std::string::npos)
			vecString.push_back(src.substr(oldPos+delimiter.length(), newPos-oldPos));

		oldPos = newPos;
	}
}

void split2(const std::string src, const std::string delimiter, std::vector&lt;std::string&gt; &amp;vecString)
{
	int pos;
	std::string temp = src;

	do
	{
		pos = temp.find(delimiter, 0);

		if(pos != std::string::npos)
		{
			std::string result = src.substr(0, pos);
			vecString.push_back(result);
			temp = temp.substr(pos + 1, temp.length() - pos - 1);
		}
	} while(pos != std::string::npos);

	if(temp.length() &gt; 0)
	{
		vecString.push_back(temp);
	}
}

int main(int argc, char **argv)
{
	LONGLONG freq;
	LONGLONG startFrame;
	LONGLONG endFrame;

	int i;

	std::string src = &quot;12 23 43 33 53&quot;;

	for(int j=0; j&lt;20; j++)
	{
		// SPLIT 1
		QueryPerformanceFrequency((LARGE_INTEGER*) &amp;freq);
		QueryPerformanceCounter((LARGE_INTEGER*) &amp;startFrame);

		for(i=0; i&lt;1000; ++i)
		{
			std::vector&lt;std::string&gt; vecString(0);
			split1(src, &quot;x&quot;, vecString);
		}

		QueryPerformanceCounter((LARGE_INTEGER*) &amp;endFrame);
		printf(&quot;%d\t&quot;, endFrame-startFrame);

		// SPLIT 2
		QueryPerformanceCounter((LARGE_INTEGER*) &amp;startFrame);

		for(i=0; i&lt;1000; ++i)
		{
			std::vector&lt;std::string&gt; vecString2(0);
			split2(src, &quot;x&quot;, vecString2);
		}

		QueryPerformanceCounter((LARGE_INTEGER*) &amp;endFrame);
		printf(&quot;%d&quot;, endFrame-startFrame);

		std::cout &lt;&lt; std::endl;
	}

	return 0;
}
</code></pre>
<p>( Ja, ich weiß, dass es &quot;using namespace std;&quot; gibt *g* )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260552/std-string-split-funktion-optimierung-möglich</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 03:42:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260552.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Feb 2010 21:00:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Sat, 06 Feb 2010 21:00:22 GMT]]></title><description><![CDATA[<p>es kommt zwar relativ selten vor, dass ich frag, ob mein Code gut ist, aber<br />
in diesem Fall gehts doch ein bisschen darum, das er Performant ist und<br />
verbessern will ich mich ja auch mal <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>
<p>Habe hier mal zwei Splitfunktionen mit Aufruf gebastelt.<br />
Nach meinen Messungen ist schonmal split1 um &quot;einiges Schneller&quot; als split2.<br />
Aber ich glaube, dass man trotzdem noch eingiges verbessern könnte.<br />
Bin ja kein Spezi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Hat jemand ein paar Vorschläge?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

#include &lt;windows.h&gt;

void split1(const std::string src, const std::string delimiter, std::vector&lt;std::string&gt; &amp;vecString)
{
	int newPos = 0, oldPos = 0;

	oldPos = src.find(delimiter, 0);
	if(oldPos != std::string::npos)
		vecString.push_back(src.substr(0, oldPos));
	else
		vecString.push_back(src);

	while(oldPos != std::string::npos)
	{
		newPos = src.find(delimiter, oldPos+delimiter.length());
		if(oldPos != std::string::npos)
			vecString.push_back(src.substr(oldPos+delimiter.length(), newPos-oldPos));

		oldPos = newPos;
	}
}

void split2(const std::string src, const std::string delimiter, std::vector&lt;std::string&gt; &amp;vecString)
{
	int pos;
	std::string temp = src;

	do
	{
		pos = temp.find(delimiter, 0);

		if(pos != std::string::npos)
		{
			std::string result = src.substr(0, pos);
			vecString.push_back(result);
			temp = temp.substr(pos + 1, temp.length() - pos - 1);
		}
	} while(pos != std::string::npos);

	if(temp.length() &gt; 0)
	{
		vecString.push_back(temp);
	}
}

int main(int argc, char **argv)
{
	LONGLONG freq;
	LONGLONG startFrame;
	LONGLONG endFrame;

	int i;

	std::string src = &quot;12 23 43 33 53&quot;;

	for(int j=0; j&lt;20; j++)
	{
		// SPLIT 1
		QueryPerformanceFrequency((LARGE_INTEGER*) &amp;freq);
		QueryPerformanceCounter((LARGE_INTEGER*) &amp;startFrame);

		for(i=0; i&lt;1000; ++i)
		{
			std::vector&lt;std::string&gt; vecString(0);
			split1(src, &quot;x&quot;, vecString);
		}

		QueryPerformanceCounter((LARGE_INTEGER*) &amp;endFrame);
		printf(&quot;%d\t&quot;, endFrame-startFrame);

		// SPLIT 2
		QueryPerformanceCounter((LARGE_INTEGER*) &amp;startFrame);

		for(i=0; i&lt;1000; ++i)
		{
			std::vector&lt;std::string&gt; vecString2(0);
			split2(src, &quot;x&quot;, vecString2);
		}

		QueryPerformanceCounter((LARGE_INTEGER*) &amp;endFrame);
		printf(&quot;%d&quot;, endFrame-startFrame);

		std::cout &lt;&lt; std::endl;
	}

	return 0;
}
</code></pre>
<p>( Ja, ich weiß, dass es &quot;using namespace std;&quot; gibt *g* )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851625</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Sat, 06 Feb 2010 21:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Sat, 06 Feb 2010 21:27:10 GMT]]></title><description><![CDATA[<p>Hm naja, wenn du mal kurz erklärt hättest was in den Funktionen überhaupt passieren soll (wenigstens ein paar Kommentare), hätte man auch darüber nachdenken können, ob man das anders lösen kann. So kann man nicht viel sagen. Den Code finde ich eigentlich schon ganz OK, aber bei den Parameter hätte ich const-reference's genommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851636</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Sat, 06 Feb 2010 21:27:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Sat, 06 Feb 2010 21:38:54 GMT]]></title><description><![CDATA[<p>Jawohl Kóyaánasqatsi ... Dein Wunsch sei mir Befehl *g*.</p>
<p>Im Prinzip eine ganz normale Splitfunktion, die anhand eines Delimiters<br />
die einzelnen Elemente in einen std::vector speichert.</p>
<p>Einzige Besonderheit ist bloß, dass der Delimiter mehrere Zeichen beinhalten kann. (drum hab ich von einer Iteration über jedes Zeichen abgesehen)<br />
Und wird kein Delimiter gefunden, wird der übergebene String 1:1 in den Vector geschrieben.</p>
<p>Die Performance erschien mir deshalb wichtig, weil der String aus dem Netzwerk zu mir gesand wird <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="😃"
    /> und ich ihn so schnell wie möglich verarbeiten will.<br />
Kann ja sein, dass es in diese Richtung Tipps und Tricks gibt.</p>
<p>Die 5 popeligen Zahlen sind ja net viel. Das dürften später so um die 100 sein *grübel*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851647</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Sat, 06 Feb 2010 21:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Sat, 06 Feb 2010 22:10:03 GMT]]></title><description><![CDATA[<p>BasicMan01 schrieb:</p>
<blockquote>
<p>Hat jemand ein paar Vorschläge?</p>
</blockquote>
<p>Mach so wenig wie möglich. Wenn du etwas machen kannst, ohne haufenweise Sachen zu kopieren, ist das in der Regel günstiger.<br />
Zunächst einmal habe ich Probleme mit dem Interafce</p>
<pre><code class="language-cpp">void split1(const std::string src, const std::string delimiter, std::vector&lt;std::string&gt; &amp;vecString)
</code></pre>
<p>Dass die ersten beiden Parameter keine Referenzen sind, ist vermutlich nur ein Unfall. Der dritte Parameter sollte eher als Ergebnis erscheinen, denn das ist, was dessen Funktion darstellt. Interessanter wäre aber die Verwendung eines Outputiterators, um nicht unnötig auf einen bestimmten Containertyp beschränkt zu sein. Zudem kann man sich fragen, ob die Beschränkung auf string nützlich ist. Folgender Entwurf zeigt, dass eine reine Iteratorversion praktibel ist</p>
<pre><code class="language-cpp">template &lt;typename Forwarditerator1, typename Forwarditerator2, typename Outpuititerator&gt;
Outputiterator split(Forwarditerator1 begin, Forwarditerator1 end, Forwarditerator2 delimiter_begin, Forwarditerator2 deliminiter_end, Outputiterator out)
{
    typedef typename std::iterator_traits&lt;Outputiterator&gt;::value_type value_type;
    Forwarditerator1 pos = std::find_end( begin, end, delimiter_begin, delimiter_end );
// Der Standardalgorithmus findet das letzte Vorkommen, daher rekursive Anwendung
// man könnte auch selbst basteln mit find+equal
    if ( pos != end )
    {
        out = split( begin, pos, delimiter_begin, delimiter_end, out );
        std::advance( pos, std::distance( delimiter_begin, delimiter_end ) );
    }
    else
        pos = begin;
    *out = value_type( pos, end );
    return ++out;
}

template &lt;typename Forwarditerator1, typename T, std::size_t N, typename Outpuititerator&gt;
Outputiterator split(Forwarditerator1 begin, Forwarditerator1 end, T (&amp;arr)[N], Outputiterator out)
{
    return split( begin, end, arr, arr + N, out );
}
</code></pre>
<p>Anwendung</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; vec;
            split(src.begin(),src.end(), &quot;x&quot;, std::back_inserter(vec));
</code></pre>
<p>boosts Stringalgo Bibliothek verfügt ebenfalls über ein split</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1851656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1851656</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 06 Feb 2010 22:10:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Sun, 07 Feb 2010 21:26:49 GMT]]></title><description><![CDATA[<p>OK, camper <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="😃"
    /> ... ich bekomm deinen Code nicht in meinem Ofen gebacken.<br />
Ich dachte, fang erstmal einfach an und probier es ohne Templates, um überall dahinter zu steigen</p>
<pre><code class="language-cpp">std::string split(std::string::iterator begin, std::string::iterator end, std::string::iterator delBegin, std::string::iterator delEnd, std::vector&lt;std::string&gt;::iterator vec)
{
	return begin;
}

std::string split(std::string::iterator begin, std::string::iterator end, std::string (&amp;del)[2], std::vector&lt;std::string&gt;::iterator vec)
{
	return split(begin, end, del, del+2, vec);
}

int main(int argc, char **argv)
{
	std::string src = &quot;12 23 43 33 53&quot;;
	std::string del = &quot;x&quot;;

	std::vector&lt;std::string&gt; vecString(0);

	split(src.begin(), src.end(), &quot;x&quot;, std::back_inserter(vecString));
	split(src.begin(), src.end(), del.begin(), del.end(), std::back_inserter(vecString));

	return 0;
}
</code></pre>
<p>Punkt 1 ist das: &quot;'back_inserter' : Ist kein Element von 'std'&quot;<br />
Punkt 2 ist der 3. Parameter der unteren split-Funktion &gt; std::string (&amp;del)[2]</p>
<p>mich würde die Funktionsdefinition ohne templates interessieren. Da kann ich dann drauf aufbauen.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Zudem kann man sich fragen, ob die Beschränkung auf string nützlich ist</p>
</blockquote>
<p>Das hast du aber jetzt hoffentlich net geschrieben, weil du sonst deinen Beispielcode hättest umschreiben müssen? <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/1852079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852079</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Sun, 07 Feb 2010 21:26:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Mon, 08 Feb 2010 09:54:50 GMT]]></title><description><![CDATA[<p>zu Punkt 1</p>
<pre><code class="language-cpp">#include &lt;iterator&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1852288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852288</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 08 Feb 2010 09:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Wed, 15 Aug 2012 10:14:02 GMT]]></title><description><![CDATA[<p>Ist zwar etwas her, aber in Zeile 38 deines ersten Postings muss es</p>
<pre><code class="language-cpp">std::string result = temp.substr(0, pos);
</code></pre>
<p>heißen (temp statt src).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241998</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 15 Aug 2012 10:14:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::string split-Funktion Optimierung möglich? on Wed, 15 Aug 2012 10:19:12 GMT]]></title><description><![CDATA[<p>Nanu, was ist denn mit dir los? Betrunken? Du machst doch sonst nicht so einen Nekromist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241999</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 15 Aug 2012 10:19:12 GMT</pubDate></item></channel></rss>