Was ist die interne Struktur von std :: wstring? Beinhaltet es die Länge? Ist es null beendet? Beide?
Beinhaltet es die Länge
Ja. Es wird vom C ++ 11 Standard benötigt.
§ 21.4.4
size_type size() const noexcept;
1. Rückgabe : Eine Zählung der Anzahl der char-ähnlichen Objekte, die sich momentan in der Zeichenfolge befinden.
2. Komplexität : konstante Zeit.
Beachten Sie jedoch, dass Unicode nicht bekannt ist.
Ist es null beendet?
Ja. Es wird auch vom C ++ 11-Standard verlangt, dass std::basic_string::c_str
einen gültigen Zeiger für den Bereich von [0, size ()] zurückgibt, in dem my_string[my_string.size()]
gültig ist, daher ein Nullzeichen.
§ 21.4.7.1
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1. Rückgabe : Ein Zeigerp
so, dassp + i == &operator[](i)
für jedesi
in[0,size()]
.
2. Komplexität : konstante Zeit.
3. Benötigt : Das Programm darf keinen der Werte verändern im Zeichen-Array gespeichert.
Wir wissen es nicht. Es liegt ganz an der Implementierung. (Zumindest bis C ++ 03 - offenbar C ++ 11 - muss der interne Puffer 0-terminiert sein.) Sie können sich den Quellcode der C ++ - Standard-Bibliotheksimplementierung ansehen, wenn der von Ihnen verwendete OpenSource ist.
Abgesehen davon würde ich es logisch finden, wenn es NULL-terminiert wäre und es auch eine explizite Länge gespeichert hätte. Das ist gut, weil es dann dauernd dauert, die Länge und eine gültige C-Zeichenfolge zurückzugeben:
%Vor% Wenn es keine explizite Länge gespeichert hat, müsste size()
die Zeichen bis zum NUL
in O(n)
zählen, was verschwenderisch ist, wenn Sie es vermeiden können.
Wenn der interne Puffer jedoch nicht NUL-terminiert war, sondern nur die Länge, dann wäre es mühsam, eine korrekte NUL-terminierte C-Zeichenfolge zu erstellen: Die Zeichenfolge müsste entweder ihren Speicher neu zuweisen und anhängen die 0 (und Neuzuweisung ist eine teure Operation), oder sie müsste den gesamten Puffer kopieren, was wiederum eine Operation O(n)
ist.
(Warnung: schamlose Eigenwerbung - in einem C-Sprachprojekt, an dem ich gerade arbeite, habe ich genau diesen Ansatz zur Implementierung flexibler String-Objekte gewählt.)
basic_string (von dem wstring ist typedef) braucht keine Terminatoren.
Ja, es verwaltet seine eigenen Längen.
Wenn Sie eine nullterminierte (alias C-String) Version von string / wstring benötigen, rufen Sie c_str () auf. Aber es kann ein Nullzeichen darin enthalten, in welchem Fall so ziemlich jede C-Funktion, die C-Strings behandelt, die gesamte Zeichenkette nicht sehen kann.
Tags und Links c++