<?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[const_iterator]]></title><description><![CDATA[<p>Mit dem Compiler VC8 ist STL erweitert/umgebaut worden. Nun habe ich folgendes Problem</p>
<pre><code class="language-cpp">char sz[]=&quot;Hello&quot;;
std::string s=sz;
std::string::const_iterator iBegin,iEnd,iPos;

//std::string
iBegin=s.begin();
iEnd  =iBegin+3;
iPos  =std::find(iBegin,iEnd,'e');

//char
iBegin =std::string::const_iterator(sz,NULL);
iEnd   =iBegin+3;
iPos   =std::find(iBegin,iEnd,'e');
</code></pre>
<p>Erst einmal bereitet mir die Benutzung des const_iterator mit dem Parameter NULL Kopfschmerzen. Compilieren läßt sich das Ganze. Allerdings kommt beim Aufruf Assertion Failed: this-&gt;_MyCont!=NULL und zwar schon bei iBegin+3. Das ist nun doch sehr ärgerlich.</p>
<p>Wie kann man das Problem lösen? Muß ich jetzt wirklich jeden charString in std::string Kopieren um dann damit weiter zu arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149998/const_iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 18:23:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149998.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Jun 2006 09:48:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 09:48:29 GMT]]></title><description><![CDATA[<p>Mit dem Compiler VC8 ist STL erweitert/umgebaut worden. Nun habe ich folgendes Problem</p>
<pre><code class="language-cpp">char sz[]=&quot;Hello&quot;;
std::string s=sz;
std::string::const_iterator iBegin,iEnd,iPos;

//std::string
iBegin=s.begin();
iEnd  =iBegin+3;
iPos  =std::find(iBegin,iEnd,'e');

//char
iBegin =std::string::const_iterator(sz,NULL);
iEnd   =iBegin+3;
iPos   =std::find(iBegin,iEnd,'e');
</code></pre>
<p>Erst einmal bereitet mir die Benutzung des const_iterator mit dem Parameter NULL Kopfschmerzen. Compilieren läßt sich das Ganze. Allerdings kommt beim Aufruf Assertion Failed: this-&gt;_MyCont!=NULL und zwar schon bei iBegin+3. Das ist nun doch sehr ärgerlich.</p>
<p>Wie kann man das Problem lösen? Muß ich jetzt wirklich jeden charString in std::string Kopieren um dann damit weiter zu arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076081</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 09:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 09:54:10 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=18363" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=58" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076090</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 12 Jun 2006 09:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 10:09:34 GMT]]></title><description><![CDATA[<p>idefix schrieb:</p>
<blockquote>
<pre><code class="language-cpp">iBegin =std::string::const_iterator(sz,NULL);
</code></pre>
</blockquote>
<p>das ist kein standard C++. was soll das überhaupt bewirken? pointer (in ein array) sind ebenfalls random access iteratoren im sinne der standard bibliothek. folglich machen wir so etwas:</p>
<pre><code class="language-cpp">char* pos=std::find(sz,sz+3,'e');
</code></pre>
<p>im übrigen besitzt std::string find memberfunktionen, die flexibler und ggf. effizienter arbeiteten, wenn auch nicht mit iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076101</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 Jun 2006 10:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 10:35:31 GMT]]></title><description><![CDATA[<p>das die Memberfunktion string::find besser ist keine Frage.<br />
Ich habe diverse Funktionen die als Übergabeparameter string::const_iterator haben. Bis her funktionierte alles hervorragend. Nun habe ich den VC8 Compiler installiert und muß die Quellen alle durch gehen. In der STL von MS wird jetzt der Buffer overrun Thematik für alle mal der Gar ausgemacht. (wer's glaubt). Wie auch immer.</p>
<p>Auszug xstring</p>
<pre><code class="language-cpp">#if _HAS_ITERATOR_DEBUGGING
 #define _STRING_CONST_ITERATOR(ptr)	const_iterator(ptr, this)

	__CLR_OR_THIS_CALL _String_const_iterator(pointer _Ptr, const _Container_base *_Pstring)
		{	// construct with pointer _Ptr
		_SCL_SECURE_VALIDATE(
			_Pstring == NULL || 
			_Ptr != NULL &amp;&amp; 
			((_Mystring *)_Pstring)-&gt;_Myptr() &lt;= _Ptr &amp;&amp; _Ptr &lt;= (((_Mystring *)_Pstring)-&gt;_Myptr() + ((_Mystring *)_Pstring)-&gt;_Mysize));
		this-&gt;_Adopt(_Pstring);
		_Myptr = _Ptr;
		}
</code></pre>
<p>Jetzt kann ich mit</p>
<pre><code class="language-cpp">#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
</code></pre>
<p>das alles wieder weg definen, was mich aber doch sehr stört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076124</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 10:35:31 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 10:51:11 GMT]]></title><description><![CDATA[<p>Was diesen debuggenden Iterator angeht macht der sowieso nicht was Du möchtest, da er einen Anfang-Iterator und offenbar einen Zeiger des enthaltenen Containers erwartet. Diesen &quot;fragt&quot; er vermutlich wo das Ende ist - was bei einem NULL-Zeiger logischerweise auch nicht funktioniert.</p>
<p>Desweiteren finde ich nirgendwo, in keiner Beschreibung der C++ Standardbibliothek eine Anwendung des string::const_iterator wie Du ihn benutzt.</p>
<p>Fazit:<br />
Hättest Du es von Anfang nach Standard gemacht hättest Du jetzt vermutlich kein Problem (sorry, aber ist die Wahrheit)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076136</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Jun 2006 10:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 11:15:25 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Hättest Du es von Anfang nach Standard gemacht hättest Du jetzt vermutlich kein Problem (sorry, aber ist die Wahrheit)</p>
</blockquote>
<p>Witzbold!</p>
<pre><code class="language-cpp">bool foo(string::const_iterator iBegin, string::const_iterator iEnd)
{
...
return true;
...
return false;
}
</code></pre>
<p>das ist doch wohl Standardkonform oder?<br />
Nun bekomme ich leider ein const char Array und soll dann weiter machen. Hat bisher auch alles wunderbar geklappt. Ich habe mir das nicht einfallen string::const_iterator(ptr,this). Das einzige was mir bis jetzt eingefallen ist den Securitykram wieder weg zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076161</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 11:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 11:27:38 GMT]]></title><description><![CDATA[<p>idefix schrieb:</p>
<blockquote>
<p>Witzbold!</p>
</blockquote>
<p>Nö, war eigentlich garnicht humoristisch gemeint, habe deshalb sogar absichtlich auf Smileys verzichtet.</p>
<blockquote>
<pre><code class="language-cpp">bool foo(string::const_iterator iBegin, string::const_iterator iEnd)
</code></pre>
<p>das ist doch wohl Standardkonform oder?</p>
</blockquote>
<p>Ja, das ist Standardkonform.<br />
Das jedoch nicht:</p>
<pre><code class="language-cpp">iBegin =std::string::const_iterator(sz,NULL);
</code></pre>
<p>Aber wenn Du eine allgemeingültige Funktion möchtest die mit String-Iteratoren als auch Array-Iteratoren klarkommt, mach es doch wie die Standardbibliothek selbst:</p>
<pre><code class="language-cpp">template&lt;typename FwdIt&gt;
bool foo(FwdIt iBegin, FwdIt  iEnd)
</code></pre>
<p>Lässt sich aufrufen mit:</p>
<pre><code class="language-cpp">const char* hello = &quot;Hello&quot;;
foo(hello, hello + strlen(hello));

std::string world = &quot;World&quot;;
foo(world.begin(), world.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1076172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076172</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Jun 2006 11:27:38 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 11:36:56 GMT]]></title><description><![CDATA[<p>benutzt du eigentlich VC8 LordJaxom?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076175</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 11:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 11:46:02 GMT]]></title><description><![CDATA[<p>Was hat das mit Standardkonformen Code zu tun?</p>
<p>Aber ja, ich habe Zugang zu einem VC8 und probiere damit auch meistens aus, was ich hier lese, private entwickle ich jedoch fast nur mit G++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076179</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Jun 2006 11:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 12:08:00 GMT]]></title><description><![CDATA[<p>Gut. So gar sehr gut.</p>
<p>Das const_iterator(sz,NULL) nicht Standardkonform ist mir schon klar.<br />
Wenn ich aber den Standard wie folgt benutze:</p>
<pre><code class="language-cpp">iBegin=std::string::const_iterator(sz);
</code></pre>
<p>dann bekomme ich folgende Fehlermeldung</p>
<pre><code>error C2440: '&lt;function-style-cast&gt;' : cannot convert from 'char [6]' to 'std::_String_const_iterator&lt;_Elem,_Traits,_Alloc&gt;'
1&gt;        with
1&gt;        [
1&gt;            _Elem=char,
1&gt;            _Traits=std::char_traits&lt;char&gt;,
1&gt;            _Alloc=std::allocator&lt;char&gt;
1&gt;        ]
1&gt;        No constructor could take the source type, or constructor overload resolution was ambiguous
</code></pre>
<p>Und nun?</p>
<p>Das Gleiche passiert auch mit iterator. Mir ist einfach nicht klar warum MS das so geändert hat und warum es jetzt Defines gibt, die das wieder aufheben. Das wird doch zu ein großen Drucheinander führen. Was auch nicht mehr geht ist:</p>
<pre><code class="language-cpp">const char *pszstr = str.begin();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1076194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076194</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 12:08:00 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 12:39:19 GMT]]></title><description><![CDATA[<p>Warum Microsoft es ändert, kann ich Dir natürlich nicht sagen, was ich aber sagen kann, ist dass Microsoft das Recht hatte das zu tun. Der Standard schreibt nämlich nicht vor, dass ein String-Iterator ein Character-Pointer sein muss. Er kann es sein, muss es aber nicht. Es ist nur vorgeschrieben dass er sich (im Falle Random-Access-Iterator) wie ein Zeiger <strong>verhält</strong>.</p>
<p>Thinking in C++, Kapitel 1: Strings schrieb:</p>
<blockquote>
<p>Iterators are themselves objects which move through a collection or container of other objects, selecting them one at a time, but never providing direct access to the implementation of the container. Iterators are <em>not</em> pointers, but they are useful for many of the same jobs.</p>
</blockquote>
<p>In manchen Implementierungen wird Dein Code also funktionieren, in anderen nicht. Hier hat Microsoft wohl einen Grund gesehen die (ehemals als const char*) Implementierung von const_iterator zu ändern.</p>
<p>Der Grund warum die meisten Iteratoren nicht ineinander konvertierbar sind ist denke ich einfach dass o.a. Template-Lösungen die auf <strong>irgendeinem</strong> Forward-Iterator arbeiten flexibel genug sind dass eine Konvertierbarkeit nicht erforderlich ist.</p>
<p>BTW:<br />
Mit einem G++ 3.2 funktioniert das erste Snippet sogar noch, das zweite jedoch schon nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076203</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Jun 2006 12:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 12:55:47 GMT]]></title><description><![CDATA[<p>Warum Microsoft das geändert hat ist klar.</p>
<p>Die Sache ist so: der Standard spezifiziert, was ein std::string::const_iterator zu können hat. Was er darüber hinaus kann, ist undefiniert.</p>
<p>Eine einfache (und schnelle) Implementierung ist es, std::string::const_iteartor als const char* über ein typedef gleich zu setzen. Der Implementierer kann aber auch eine Klasse implementieren, die weitere Features, wie z. B. zusätzliche Prüfungen realsiert. Solange der Iterator alles kann, was er können soll, ist das legitim und sogar im Sinne des Erfinders.</p>
<p>Eine const_iterator-Klasse, die Prüfungen macht, ist natürlich sicherer, aber langsamer als ein const char*, hat also seine Vor- und Nachteile. Daher ist das durchaus Sinnvoll, das über den Präprozessor ein- und ausschaltbar zu machen, so daß das Programm im debug-code mit Netz und doppelten Boden arbeitet und im release-code dann mit voller Geschwindigkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076212</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 12 Jun 2006 12:55:47 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 14:00:32 GMT]]></title><description><![CDATA[<p>Also letztendlich bedeutet das:</p>
<p>Übergang von C/C++ nach stl<br />
oder vielleicht besser von nicht stl nach stl</p>
<pre><code class="language-cpp">char szSource[]=&quot;Hello&quot;;
char szResult[255];

//jetzt Übergang
string s;
s=string(szSource);
//weiter mit stl
.....
//wieder zurück
strcpy(szResult,s.c_str());
</code></pre>
<p>Das ist aber äußerst unbefriedigend. Warum muß ich den kopieren? Wenn ich den Quelle garnicht bearbeiten will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076259</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 12 Jun 2006 14:00:32 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 12 Jun 2006 14:23:15 GMT]]></title><description><![CDATA[<p>Vielleicht wäre es einfacher, die empfangende Funktion in eine Template-Funktion umzubauen die wie die Standard-Algorithmen mit beliebigen Iteratoren (also auch char* bis char*+laenge) klarkommt. Den Ansatz dafür habe ich ja schon gepostet <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1076271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076271</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 12 Jun 2006 14:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to const_iterator on Mon, 19 Jun 2006 07:08:14 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich muß ja zugeben das ich die Zuweisung eines const char* an einen string::const_iterator missbräuchlich verwendet habe. Aber es funktionierte eben sehr gut. Nach langem hin und her, habe ich mir einen eigenen Iterator geschreiben, der mit dieser Zuweisung sehr gut um gehen kann. Ich habe mich immer etwas gescheut einen eigenen Iterator zuschreiben, aber so schwer ist das auch wieder nicht. Hier kam mir der Vorteil von Templates sehr entgegen, denn ich brauchte nicht alles um schreiben.</p>
<p>Eine Frage bleibt trotzdem. Ist ein C-String überhaupt in std::string konvertierbar ohne da dieser kopiert werden muß? Oder interpretiert die STL C-Strings und Strings gänzlich voneinander getrennt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080377</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Mon, 19 Jun 2006 07:08:14 GMT</pubDate></item></channel></rss>