Was ist der Unterschied zwischen std :: string und std :: basic_string? Und warum werden beide benötigt?

90

Was ist der Unterschied zwischen std::stringund std::basic_string? Und warum werden beide benötigt?

Benj
quelle

Antworten:

62

std::basic_stringist eine Klassenvorlage zum Erstellen von Zeichenfolgen aus Zeichentypen, std::stringist typedefeine Spezialisierung dieser Klassenvorlage für char. Ja, beide werden benötigt (oder zumindest vom Standard verlangt).

CB Bailey
quelle
14
warum werden sie beide gebraucht?
Mohamed El-Nakib
1
Sie sagen also, dass std :: string typedef std :: basic_string <char> std :: string ist?
ungelöste_externe
1
@MuhammadAnnaqeeb 2,5 Jahre zu spät, aber die kurze Antwort lautet, auch Unterstützung für breite Zeichenfolgen (wstring) (Unicode, 2 Bytes pro Zeichen, wchar_t) bereitzustellen.
Andrew
41

std::stringist eine Instanziierung von std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringist erforderlich, um eine ähnliche Schnittstelle für alle Arten von Zeichenfolgen zu haben ( wstringzum Beispiel).

pmr
quelle
31
Der richtige Begriff ist "Spezialisierung". stringist eine Spezialisierung von basic_string.
Am
2
Ich denke, Sie könnten darüber streiten. "Spezialisierung" wird normalerweise verwendet, um die Vererbung anzuzeigen. Eine Vorlage {class | function} wird durch Ersetzen der Vorlagenargumente instanziiert. Es gibt eine teilweise Vorlagenspezialisierung, die hier jedoch nicht verwendet wird.
PMR
5
Eine abgeleitete Klasse als "Spezialisierung" zu bezeichnen, ist eine weniger formale Verwendung von "Spezialisierung". Das Wort "Spezialisierung" wird im Standard überhaupt nicht so verwendet (da bin ich mir ziemlich sicher), aber es wird ausgiebig verwendet, um die Spezialisierung von Vorlagen zu beschreiben. Der Name einer Vorlagenspezialisierung kann in Kontexten verwendet werden, in denen keine Instanziierung erzwungen und impliziert wird. Spezialisierung und Instanziierung sind daher separate Konzepte. Neben einer Vorlagenspezialisierung (der Name einer Vorlage mit einem bestimmten Parametersatz) gibt es auch Teilspezialisierungen (nur Klassenvorlagen) und explizite Spezialisierungen.
CB Bailey
1
Die Verwendung von "Spezialisierung" wäre hier irreführend. Eine Vorlagenspezialisierung hat eine bestimmte Bedeutung (unabhängig von der Vererbung), aber das wird hier NICHT verwendet. std :: string ist nichts mehr oder weniger als ein typedef, wie: namespace std { typedef basic_string<char> string; }Technisch gesehen ist es auch keine wirkliche Instanziierung, aber zumindest näher (Instanziierung erstellt per Definition eine Instanz, und ein typedef erstellt nur einen Namen, keine Instanz ).
Jerry Coffin
3
@Charles: Es ist irreführend, weil sich "Spezialisierung" (mit Vorlagen) normalerweise entweder auf eine teilweise Spezialisierung oder auf eine explizite Spezialisierung bezieht, nicht auf ein typedef für das, was als einfache Instanziierung enden wird.
Jerry Coffin
15

A std::stringist eine Instanziierung der std::basic_stringVorlage mit einem Typ von char. Sie benötigen beides, damit Sie außerdem eine Reihe von Dingen erstellen können char, z. B. std::basic_string<wchar_t>für eine Reihe von breiten Zeichen. Oder wenn Sie eine Zeichenfolge mit 32-Bit-Elementen möchten , std::basic_string<unsigned int>.

Zanson
quelle