<?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::basic_string]]></title><description><![CDATA[<p>Hi - ich versuch mich gerade daran, nen eigenen String zu schreiben. Weniger um ihn zu verwenden und vor allem aus langer Weile bzw. um halt ein wenig rumzuprobieren...<br />
Allerdings hab ich eine Frage zum Standard (das hier ist aus dem working draft von 2005, sollte aber auch im aktuellen Standard so sein):</p>
<p>21.3.1 basic_string constructors schrieb:</p>
<blockquote>
<p>In all basic_string constructors, a copy of the Allocator argument is used for any memory allocation performed by the constructor or member functions during the lifetime of the object.</p>
</blockquote>
<p>Der eine Allokator soll also für den kompletten Speicher zuständig sein - das beist sich aber ein wenig mit meinem Ansatz, dass der User das verwendete Array selbst heraussuchen kann.<br />
Dann braucht man für <code>c_str()</code> ja bekanntlich noch einen anderen container...<br />
Ist die Lösung damit noch Standard-Konform? Bzw. gibt es eine Möglichkeit, dass der vector den selben(nicht den gleichen^^) allocator nutzt, wie die deque?</p>
<pre><code class="language-cpp">template&lt;
	typename TChar,
	typename traits = std::char_traits&lt;TChar&gt;,
	typename TAlloc = std::allocator&lt;TChar&gt;,
	typename array_type = std::deque&lt;TChar, TAlloc&gt;
&gt;
struct basic_string
{
	struct _m
	{
		array_type content;
		mutable std::vector&lt;value_type, allocator_type&gt; c_str_content;
	} m;

	const char* c_str() const
	{
		m.c_str_content.reserve(size()+1);
		m.c_str_content.assign(begin(), end());
		m.c_str_content.push_back(value_type());

		return &amp;*m.c_str_content.begin();
	}
};
</code></pre>
<p>Dann hab ich noch eine Frage zu <code>assign()</code> : Ich habe nirgendwo gefunden, dass bei assign kein zweites Objekt erstellt werden darf und dann einfach geswapt werden darf(also wird das ja mit Sicherheit die bevorzugte Lösung sein - würdet ihr das <code>reserve(size()+1)</code> dann trotzdem lassen oder eher weglassen oder einen anderen weg gehen?</p>
<p>Danke schon mal,<br />
bb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249689/std-basic_string</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 12:17:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249689.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Sep 2009 16:58:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::basic_string on Thu, 10 Sep 2009 16:58:03 GMT]]></title><description><![CDATA[<p>Hi - ich versuch mich gerade daran, nen eigenen String zu schreiben. Weniger um ihn zu verwenden und vor allem aus langer Weile bzw. um halt ein wenig rumzuprobieren...<br />
Allerdings hab ich eine Frage zum Standard (das hier ist aus dem working draft von 2005, sollte aber auch im aktuellen Standard so sein):</p>
<p>21.3.1 basic_string constructors schrieb:</p>
<blockquote>
<p>In all basic_string constructors, a copy of the Allocator argument is used for any memory allocation performed by the constructor or member functions during the lifetime of the object.</p>
</blockquote>
<p>Der eine Allokator soll also für den kompletten Speicher zuständig sein - das beist sich aber ein wenig mit meinem Ansatz, dass der User das verwendete Array selbst heraussuchen kann.<br />
Dann braucht man für <code>c_str()</code> ja bekanntlich noch einen anderen container...<br />
Ist die Lösung damit noch Standard-Konform? Bzw. gibt es eine Möglichkeit, dass der vector den selben(nicht den gleichen^^) allocator nutzt, wie die deque?</p>
<pre><code class="language-cpp">template&lt;
	typename TChar,
	typename traits = std::char_traits&lt;TChar&gt;,
	typename TAlloc = std::allocator&lt;TChar&gt;,
	typename array_type = std::deque&lt;TChar, TAlloc&gt;
&gt;
struct basic_string
{
	struct _m
	{
		array_type content;
		mutable std::vector&lt;value_type, allocator_type&gt; c_str_content;
	} m;

	const char* c_str() const
	{
		m.c_str_content.reserve(size()+1);
		m.c_str_content.assign(begin(), end());
		m.c_str_content.push_back(value_type());

		return &amp;*m.c_str_content.begin();
	}
};
</code></pre>
<p>Dann hab ich noch eine Frage zu <code>assign()</code> : Ich habe nirgendwo gefunden, dass bei assign kein zweites Objekt erstellt werden darf und dann einfach geswapt werden darf(also wird das ja mit Sicherheit die bevorzugte Lösung sein - würdet ihr das <code>reserve(size()+1)</code> dann trotzdem lassen oder eher weglassen oder einen anderen weg gehen?</p>
<p>Danke schon mal,<br />
bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776052</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Thu, 10 Sep 2009 16:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Thu, 10 Sep 2009 17:27:02 GMT]]></title><description><![CDATA[<p>unskilled @logged-off schrieb:</p>
<blockquote>
<p>Der eine Allokator soll also für den kompletten Speicher zuständig sein - das beist sich aber ein wenig mit meinem Ansatz, dass der User das verwendete Array selbst heraussuchen kann.<br />
Dann braucht man für <code>c_str()</code> ja bekanntlich noch einen anderen container...<br />
Ist die Lösung damit noch Standard-Konform? Bzw. gibt es eine Möglichkeit, dass der vector den selben(nicht den gleichen^^) allocator nutzt, wie die deque?</p>
</blockquote>
<p>Wahrscheinlich nicht. Wenn du dich gleichzeitig ein wenig am Entwurf des neuen Standards orientierst, wirst du erkennen, das alles andere als ein normales Array für die Speicherverwaltung sowieso eher unerwünscht sein dürfte.</p>
<p>unskilled @logged-off schrieb:</p>
<blockquote>
<p>Dann hab ich noch eine Frage zu <code>assign()</code> : Ich habe nirgendwo gefunden, dass bei assign kein zweites Objekt erstellt werden darf und dann einfach geswapt werden darf(also wird das ja mit Sicherheit die bevorzugte Lösung sein - würdet ihr das <code>reserve(size()+1)</code> dann trotzdem lassen oder eher weglassen oder einen anderen weg gehen?</p>
</blockquote>
<p>Das sollte zulässig sein, im nächsten Standard sowieso (der bestimmt explizit swap(str) als zulässige Implementation für den move-Fall). Einen Vorteil sehe ich darin nicht (wenn man sowieso kopieren muss): wenn der Speicher des ursprünglichen Strings ausreicht, sollte die Wiederverwendung dieses Speichers effizienter sein. Bedenke, das sowieso nur Typen mit einfacher Kopiersemantik als Zeichentypen zulässig sind, im Gegensatz zum allgemeinen Fall brauchen wir uns hier keine Gedanken um Exceptionsicherheit beim normalen Kopieren machen, denn das kann nicht fehlschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776059</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Sep 2009 17:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Thu, 10 Sep 2009 19:09:28 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Bedenke, das sowieso nur Typen mit einfacher Kopiersemantik als Zeichentypen zulässig sind, im Gegensatz zum allgemeinen Fall brauchen wir uns hier keine Gedanken um Exceptionsicherheit beim normalen Kopieren machen, denn das kann nicht fehlschlagen.</p>
</blockquote>
<p>Guter Hinweis, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Naja - der einzige richtige Nachteil sind imho die traits-Fkt.<br />
vor allem find() - da weiß ich noch gar nicht, wie ich das mache...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776092</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Thu, 10 Sep 2009 19:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 15:33:33 GMT]]></title><description><![CDATA[<p>gut - da bei find() nur im standard steht, dass traits_type::eq und nicht traits_type::find genutzt werden muss, wars doch np...</p>
<p>aber ich hab noch ne Frage zu find_first_of bzw. find:</p>
<p>21.3.6.3 basic_string::find_first_of schrieb:</p>
<blockquote>
<p>7.:</p>
<pre><code class="language-cpp">size_type find_first_of ( charT c , size_type pos = 0) const
{
 return find_first_of( basic_string&lt;charT,traits,Allocator&gt;(1,c),pos );
}
</code></pre>
</blockquote>
<p>was ist der Unterschied dieser Fkt und der find-Überladung:</p>
<pre><code class="language-cpp">size_type find(charT c , size_type pos = 0) const;
</code></pre>
<p>?</p>
<p>Ich konnte keinen finden...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777130</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Sat, 12 Sep 2009 15:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 16:09:29 GMT]]></title><description><![CDATA[<p>Willst du tatsächlich einen <code>std::string</code> mit seinen über hundert Memberfunktionen nachbauen? Ich würde mir das nochmals gut überlegen und wenigstens nicht die gleichen Fehler begehen, die schonmal gemacht wurden. <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>Siehe sonst auch <a href="http://www.gotw.ca/gotw/084.htm" rel="nofollow">http://www.gotw.ca/gotw/084.htm</a>...</p>
<p>unskilled @logged-off schrieb:</p>
<blockquote>
<p>was ist der Unterschied dieser Fkt und der find-Überladung:</p>
</blockquote>
<p>Ich habe das gefunden:</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://www.cplusplus.com/reference/string/string/find/" rel="nofollow">http://www.cplusplus.com/reference/string/string/find/</a>&quot;&gt;Notice that unlike member find_first_of, whenever more than one character is being searched for, it is not enough that only one of these characters match, but the entire sequence of characters to find must be matched.</p>
</blockquote>
<p>BTW: Hast du dein Passwort vergessen und das der E-Mail-Adresse ebenfalls? :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777159</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 12 Sep 2009 16:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 16:11:32 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>BTW: Hast du dein Passwort vergessen und das der E-Mail-Adresse ebenfalls? :p</p>
</blockquote>
<p>LOL. Ich habe im anderen Thread fast das gleiche gefragt. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777162</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 12 Sep 2009 16:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 16:40:43 GMT]]></title><description><![CDATA[<p>Japp - langeweile <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=";D"
      alt="😉"
    /><br />
und so, wie ich einen meiner profs kenne, werden wir auch nächstes semester wieder genug Hausarbeiten bekommen, bei denen wir nicht eine einzige Zeile der Standard-Lib nutzen dürfen - also wirds vll nicht mal so sinnlos sein^^ und dümmer wird man dadurch ja nun auch nicht - und (um gleich die ausgeloggt-frage zu beantworten) sitz ich nur am laptop, weil mein (pc-)mainboard kaputt ist und kann hier nich ma ordentlich spielen&gt;.&lt; also hab ich eh nix besseres zu tun.</p>
<p>zum 1. link - japp, kannte ich schon - aber wenns so nunmal so standardisiert wurde...</p>
<p>zum 2. link (was du gefunden hattest):<br />
wenn mich nicht alles täuscht, steht dort auch kein unterschied sondern nur, dass es unterschiedliche ergebnisse liefert, sobald nicht nur ein zeichen übergeben wird!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777178</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 12 Sep 2009 16:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 16:48:55 GMT]]></title><description><![CDATA[<blockquote>
<p>— at(xpos+I) == <a href="http://str.at" rel="nofollow">str.at</a>(I) for all elements I of the string controlled by str</p>
<p>...</p>
<p>— at(xpos) == <a href="http://str.at" rel="nofollow">str.at</a>(I) for some element I of the string controlled by str.</p>
</blockquote>
<p>Wenn I nur 0 sein kann, weil der entsprechende String nur ein Zeichen hat, kann es offenbar keinen Unterschied geben. Diese Überladungen existieren offensichtlich nur der Vollständigkeit halber beide als degenerierte Versionen des allgemeinen Falls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777184</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 12 Sep 2009 16:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 16:59:22 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<blockquote>
<p>— at(xpos+I) == <a href="http://str.at" rel="nofollow">str.at</a>(I) for all elements I of the string controlled by str</p>
<p>...</p>
<p>— at(xpos) == <a href="http://str.at" rel="nofollow">str.at</a>(I) for some element I of the string controlled by str.</p>
</blockquote>
<p>Wenn I nur 0 sein kann, weil der entsprechende String nur ein Zeichen hat, kann es offenbar keinen Unterschied geben. Diese Überladungen existieren offensichtlich nur der Vollständigkeit halber beide als degenerierte Versionen des allgemeinen Falls.</p>
</blockquote>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777193</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 12 Sep 2009 16:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 18:57:23 GMT]]></title><description><![CDATA[<p>Und nochmal... : D</p>
<p>im Gegensatz zu den 100den von find-Fkt, die lediglich <code>traits_type::eq()</code> ist die string-compare-fkt so definiert:</p>
<p>standard schrieb:</p>
<blockquote>
<p>int compare(const basic_string &amp;str) const<br />
{<br />
const size_type rlen = std::min(size(), str.size()); //1 Effects: Determines the effective length rlen of the strings to compare as the smallest of size() and str.size().<br />
return traits_type::compare(data(), str.data(), rlen); //The function then compares the two strings by calling traits::compare(data(), str.data(), rlen).<br />
}</p>
</blockquote>
<p>standard schrieb:</p>
<blockquote>
<p>[traits::compare]<br />
yields: 0 if for each i in [0,n), X::eq(p[i],q[i]) is true; else, a negative value if, for some j in [0,n), X::lt(p[j],q[j]) is true and for each i in [0,j)<br />
X::eq(p[i],q[i]) is true; else a positive value.</p>
</blockquote>
<p>traits::compare ist also über eq bzw lt definiert.<br />
ist es nun noch standard-konform, wenn man die string-compare-fkt nicht mittels der traits-compare-fkt sondern direkt mit eq implementiert?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777257</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 12 Sep 2009 18:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 19:08:55 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>traits::compare ist also über eq bzw lt definiert.</p>
</blockquote>
<p>Das betrifft aber nur die Ermittelung des Rückgabewertes. Eine nutzerdefinierte traits-Klasse könnte durchaus in diesen Funktionen noch anders beobachtbares Verhalten zusätzlich einbauen. Mit anderen Worten: im Standardfall char_traits&lt;char&gt;, char_traits&lt;wchar_t&gt; kannst du machen, was du willst, ansonsten ist es problematisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777264</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 12 Sep 2009 19:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::basic_string on Sat, 12 Sep 2009 19:15:54 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>traits::compare ist also über eq bzw lt definiert.</p>
</blockquote>
<p>Das betrifft aber nur die Ermittelung des Rückgabewertes. Eine nutzerdefinierte traits-Klasse könnte durchaus in diesen Funktionen noch anders beobachtbares Verhalten zusätzlich einbauen. Mit anderen Worten: im Standardfall char_traits&lt;char&gt;, char_traits&lt;wchar_t&gt; kannst du machen, was du willst, ansonsten ist es problematisch.</p>
</blockquote>
<p>Das ich das in diesen beiden Fällen machen kann, hab ich auch schon geschlussfolgert.<br />
Schade - ich hatte gehofft, dass du irgend ne Stelle so deutest, dass man einen dem standard entsprechenden traits-typ angeben muss^^</p>
<p>Fällt jemandem ein Fall ein, wo es sinnvoll ist, dass jmd. ein compare schreibt, welches nicht dem standard-compare entspricht? Mir ist vorhin keiner eingefallen und jetzt auch noch nicht <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=";D"
      alt="😉"
    /></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777270</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 12 Sep 2009 19:15:54 GMT</pubDate></item></channel></rss>