Wie ist der (innere)Aufbau einer String-Klasse?
-
Genau genommen ist string ein typedef für basic_string<char>. Und basic_string<T> ist in der Regel ähnlich organisiert wie ein vector<T> mit ein paar extra Methoden.
-
Die string-Klasse ist genau so aufgebaut wie andere Klassen auch. String ist übrigens nur ein typedef für std::basic_string<char> und da das mit Templates arbeitet, müsste das sogar in den Headern stehen.
Alternativ kannst du dir den Source Code vom GCC herunterladen und da nachschauen.
-
Dazu muss man sich den GCC nichtmal runterladen:
http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/include/bits/basic_string.h?view=markup
(und ein paar der Methoden sind hier implementiert: http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/include/bits/basic_string.tcc?view=markup )
-
Vielen Dank für eure Unterstützung.
Jetzt habe ich eine bessere Vorstellung davon wie solch eine 'interne' Klasse aufgebaut ist.
Danke
-
std::string ist nicht wirklich toll designt.
-
sxxxxxxxxxx schrieb:
std::string ist nicht wirklich toll designt.
Warum?
-
tntnet schrieb:
sxxxxxxxxxx schrieb:
std::string ist nicht wirklich toll designt.
Warum?
http://ridiculousfish.com/blog/archives/2009/09/17/i-didnt-order-that-so-why-is-it-on-my-bill-episode-2/
(ist aber nur eine Kleinigkeit.)
-
wow, fast 3000 Zeilen Code für so eine simple Utility Klasse.
Alle möglichen und unmöglichen Methoden reingepackt, möglichst in 3 oder 4 Ausführungen, mit unterschiedlichen Namen.* 3 Methoden, mit unterschiedlichem Namen, für die Länge
* 3 Methoden, mit unterschiedlichem Namen, um die Größe zu ändern
* 12 verschiedene Methoden um etwas am String hinzu zu fügen.
* Den Rekord hält die Methode um einen Teil zu ersetzen, mit 14 Ausführungen.Wie viel Zeilen Code hat der Unit Test für die basic_string Klasse?
-
DEvent schrieb:
Wie viel Zeilen Code hat der Unit Test für die basic_string Klasse?
Eine
diff string string
-
DEvent schrieb:
wow, fast 3000 Zeilen Code für so eine simple Utility Klasse.
Alle möglichen und unmöglichen Methoden reingepackt, möglichst in 3 oder 4 Ausführungen, mit unterschiedlichen Namen.* 3 Methoden, mit unterschiedlichem Namen, für die Länge
* 3 Methoden, mit unterschiedlichem Namen, um die Größe zu ändern
* 12 verschiedene Methoden um etwas am String hinzu zu fügen.
* Den Rekord hält die Methode um einen Teil zu ersetzen, mit 14 Ausführungen.Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
-
swswws schrieb:
DEvent schrieb:
wow, fast 3000 Zeilen Code für so eine simple Utility Klasse.
Alle möglichen und unmöglichen Methoden reingepackt, möglichst in 3 oder 4 Ausführungen, mit unterschiedlichen Namen.* 3 Methoden, mit unterschiedlichem Namen, für die Länge
* 3 Methoden, mit unterschiedlichem Namen, um die Größe zu ändern
* 12 verschiedene Methoden um etwas am String hinzu zu fügen.
* Den Rekord hält die Methode um einen Teil zu ersetzen, mit 14 Ausführungen.Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
Und damit das mit der Internationalität mal gescheit klappt, wünsche ich mir endlich std::u8string und std::u8cout usw.
-
und http://de.wikipedia.org/wiki/UTF-32 und http://de.wikipedia.org/wiki/UTF-16 und http://de.wikipedia.org/wiki/UTF-7
-
UTF-32 könnte man ja noch als std::basic_string<uint32_t> oder std::basic_string<long int> oder so definieren, aber bei u8string oder so müsste dann schon eine eigene Klasse herhalten
-
swswws schrieb:
Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
wstring und string sind beide nur ein typedef für basic_string.
-
rüdiger schrieb:
swswws schrieb:
Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
wstring und string sind beide nur ein typedef für basic_string.
Weswegen aber bei der Template-Instantiierung von beiden trotzdem der Code verdoppelt wird.
-
wxSkip schrieb:
Weswegen aber bei der Template-Instantiierung von beiden trotzdem der Code verdoppelt wird.
Das ist ja jetzt ein tolles Argument. Wenn ich einen std::vector<float> und einen std::vector<double> anleg und verwende ist das böse Codeduplizierung?
Das haben templates so an sich. Und das ist schön so. Die einzige Alternative: alles über void-Pointer regeln...
-
l'abra d'or schrieb:
wxSkip schrieb:
Weswegen aber bei der Template-Instantiierung von beiden trotzdem der Code verdoppelt wird.
Das ist ja jetzt ein tolles Argument. Wenn ich einen std::vector<float> und einen std::vector<double> anleg und verwende ist das böse Codeduplizierung?
Das haben templates so an sich. Und das ist schön so. Die einzige Alternative: alles über void-Pointer regeln...Ich habe ja gar nicht gesagt, dass ich es schlecht finde. Ich habe jetzt bloß die Argumentation von swswws so aufgefasst, dass er jetzt findet, dass die Datei unnötig groß ist, er könnte aber damit genausogut gemeint haben, dass sich die STL-Entwickler unnötig viel Mühe gemacht haben.
-
rüdiger schrieb:
swswws schrieb:
Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
wstring und string sind beide nur ein typedef für basic_string.
Ja und schon die Tatsache, dass es beide gibt ist Müll. Schreibst du Funktionen denen du als Parameter wstring, string oder basic_string übergibst?
-
swswws schrieb:
rüdiger schrieb:
swswws schrieb:
Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
wstring und string sind beide nur ein typedef für basic_string.
Ja und schon die Tatsache, dass es beide gibt ist Müll. Schreibst du Funktionen denen du als Parameter wstring, string oder basic_string übergibst?
Ich bin zwar nicht gefragt, aber ich schreibe schon Funktionen, die als Parameter string oder wstring benutzen. Bei meinem derzeitigen Projekt habe ich in einem globalen Header einen Typ str_t und char_t definiert, die ich dann zwischen string/char und wstring/wchar_t umschalten kann (dazu kommen noch fstream, strstream und ein _()-Makro).
Ist zwar mühseliger, die Zeichenketten immer mit dem Makro einzuklammern, aber dadurch wird dann wenigstens die schnelle Umstellung sichergestellt, auch, falls es mal u*string geben wird.
Was dann nervt ist, dass Dateinamen und so was nur als string übergeben werden können und man dann eventuell noch zwischen den string-Typen konvertieren muss, wofür es m.E. keine gescheiten Funktionen gibt.Da freue ich mich doch, dass wenigstens für wxWidgets 3.0 gescheite String-Konvertierungsfunktionen angesagt sind.
-
UTF-8 Support kommt in C++0x.
@wxSkip
Der ursprüngliche Code wird ja nicht verdoppelt. Nichtmal das Binary, da ja nur benötigte Methoden instanziiert werden müssen und auch hier kann ein Compiler gemeinsamen Code reduzieren.swswws schrieb:
rüdiger schrieb:
swswws schrieb:
Und wegen der Untauglichkeit von std::string in Verbindung mit Internationalisierung gibt es mit std::wstring praktische eine Verdoppelung.
wstring und string sind beide nur ein typedef für basic_string.
Ja und schon die Tatsache, dass es beide gibt ist Müll. Schreibst du Funktionen denen du als Parameter wstring, string oder basic_string übergibst?
Nein, es ist nicht Müll. wstring hat enorme Speicheranforderungen (4byte für ein Zeichen für aktuellen Unicode), warum sollte man dafür bezahlen, wenn man es nicht braucht? Das verstößt gegen die Philosophie von C++. Dank Templates kann man den Code ja trotzdem für beide (und sogar noch viel mehr) Fälle schreiben. Daher sehe ich hier kein Problem. Solange man nicht zeichenweise auf Unicode-Strings arbeiten muss ist wstring einfach zu viel.