Qual è la differenza tra std :: string e std :: basic_string? E perché sono necessari entrambi?


94

Qual è la differenza tra std::stringe std::basic_string? E perché sono necessari entrambi?

Risposte:


63

std::basic_stringè un modello di classe per creare stringhe di tipi di carattere, std::stringè typedefuna specializzazione di quel modello di classe per char. Sì, sono entrambi necessari (o almeno richiesti dallo standard).


17
perché sono entrambi necessari?
Mohamed El-Nakib

1
quindi stai dicendo che std :: string è typedef std :: basic_string <char> std :: string?
unresolved_external

1
@MuhammadAnnaqeeb con 2,5 anni di ritardo, ma la risposta breve è fornire anche il supporto per stringhe larghe (wstring) (Unicode, 2 byte per carattere, wchar_t).
Andrew

46

std::stringè un'istanza di std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringè necessario avere un'interfaccia simile per tutti i tipi di stringhe ( wstringad esempio).


33
Il termine corretto è "specializzazione". stringè una specializzazione di basic_string.
AnT

3
Immagino che potresti discuterne. "specializzazione" viene solitamente utilizzata per indicare l'eredità. Una {classe | funzione} basata su modello viene istanziata sostituendo gli argomenti del modello. Esiste una specializzazione parziale del modello ma non viene utilizzata qui.
pmr

5
Fare riferimento a una classe derivata come "specializzazione" è un uso meno formale di "specializzazione". La parola "specializzazione" non è affatto usata in questo modo nello standard (ne sono abbastanza sicuro), ma è ampiamente utilizzata per descrivere la specializzazione del modello. Il nome di una specializzazione del modello può essere utilizzato in contesti che non forzano e non richiedono istanze implicite, quindi specializzazione e istanza sono concetti separati. Oltre a una specializzazione modello (il nome di un modello con un particolare insieme di parametri), ci sono anche specializzazioni parziali (solo modelli di classe) e specializzazioni esplicite.
CB Bailey,

1
Usare la "specializzazione" qui sarebbe fuorviante. Una specializzazione modello ha un significato specifico (non correlato all'ereditarietà), ma NON è ciò che viene utilizzato qui. std :: string non è altro che un typedef, come: namespace std { typedef basic_string<char> string; }Tecnicamente, non è nemmeno un'istanza, ma è almeno più vicina (l'istanziazione, per definizione, crea un'istanza e un typedef crea solo un nome, non un'istanza ).
Jerry Coffin

3
@Charles: è fuorviante perché (con i modelli), "specializzazione" si riferisce normalmente alla specializzazione parziale o alla specializzazione esplicita, non a un typedef per ciò che finirà per essere una semplice istanza.
Jerry Coffin

17

A std::stringè un'istanza del std::basic_stringmodello con un tipo di char. Hai bisogno di entrambi per poter creare stringhe di cose char, ad esempio std::basic_string<wchar_t>una stringa di caratteri larghi. O se volete una stringa con 32 elementi bit, std::basic_string<unsigned int>.


2
Penso che questa dovrebbe essere la risposta più votata. Fornisce un caso d'uso in cui non è possibile creare un'istanza std::basic_stringsenza un chartipo.
hlin117
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.