Ist wstring null beendet?

7

Was ist die interne Struktur von std :: wstring? Beinhaltet es die Länge? Ist es null beendet? Beide?

    
Jonathan Allen 30.07.2013, 06:01
quelle

3 Antworten

12
  

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 Zeiger p so, dass p + i == &operator[](i) für   jedes i in [0,size()] .
  2. Komplexität : konstante Zeit.
  3. Benötigt : Das Programm darf keinen der Werte verändern   im Zeichen-Array gespeichert.

    
Rapptz 30.07.2013, 06:41
quelle
10

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.)

    
user529758 30.07.2013 06:04
quelle
0

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.

    
DanielKO 30.07.2013 06:04
quelle

Tags und Links