Apa perbedaan antara std :: string dan std :: basic_string? Dan mengapa keduanya dibutuhkan?

94

Apa perbedaan antara std::stringdan std::basic_string? Dan mengapa keduanya dibutuhkan?

Benj
sumber

Jawaban:

63

std::basic_stringadalah template kelas untuk membuat string dari tipe karakter, std::stringadalah typedefuntuk spesialisasi template kelas itu char. Ya, keduanya dibutuhkan (atau setidaknya disyaratkan oleh standar).

CB Bailey
sumber
17
mengapa keduanya dibutuhkan?
Mohamed El-Nakib
1
jadi Anda mengatakan bahwa std :: string adalah typedef std :: basic_string <char> std :: string?
unresolved_external
2
@MuhammadAnnaqeeb 2,5 tahun terlambat tetapi jawaban singkatnya adalah menyediakan dukungan string lebar (wstring) (Unicode, 2 byte per karakter, wchar_t).
Andrew
47

std::stringadalah contoh dari std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringperlu memiliki antarmuka yang serupa untuk semua jenis string ( wstringmisalnya).

pmr
sumber
33
Istilah yang tepat adalah "spesialisasi". stringadalah spesialisasi dari basic_string.
AnT
3
Saya kira Anda bisa berdebat tentang itu. "spesialisasi" biasanya digunakan untuk menunjukkan warisan. Sebuah template {class | function} dibuat dengan mengganti argumen template. Ada spesialisasi template parsial tetapi ini tidak digunakan di sini.
pmr
5
Mengacu pada kelas turunan sebagai 'spesialisasi' adalah penggunaan 'spesialisasi' yang kurang formal. Kata 'spesialisasi' sama sekali tidak digunakan seperti ini dalam standar (saya cukup yakin), tetapi digunakan secara luas untuk menjelaskan spesialisasi template. Nama spesialisasi template bisa digunakan dalam konteks yang tidak memaksa dan instansiasi implisit sehingga spesialisasi dan instansiasi adalah konsep yang terpisah. Selain spesialisasi template (nama template dengan sekumpulan parameter tertentu), ada juga spesialisasi parsial (hanya template kelas) dan spesialisasi eksplisit.
CB Bailey
1
Menggunakan "spesialisasi" di sini akan menyesatkan. Spesialisasi template memiliki arti tertentu (tidak terkait dengan warisan), tapi BUKAN itu yang digunakan di sini. std :: string tidak lebih atau kurang dari typedef, seperti: namespace std { typedef basic_string<char> string; }Secara teknis, ini juga bukan sebuah instantiation, tapi setidaknya lebih dekat (instantiation, menurut definisi, membuat sebuah instance, dan typedef hanya membuat sebuah nama, bukan sebuah instance ).
Jerry Coffin
3
@Charles: menyesatkan karena (dengan template), "spesialisasi" biasanya mengacu pada spesialisasi parsial, atau spesialisasi eksplisit, bukan typedef yang akan berakhir sebagai contoh sederhana.
Jerry Coffin
17

A std::stringadalah contoh std::basic_stringtemplate dengan tipe char. Anda membutuhkan keduanya sehingga Anda dapat membuat string hal-hal selain itu char, seperti std::basic_string<wchar_t>string karakter lebar. Atau jika Anda menginginkan string dengan elemen 32 bit std::basic_string<unsigned int>,.

Zanson
sumber
2
Saya pikir ini harus menjadi jawaban pilihan teratas. Ini memberikan kasus penggunaan saat Anda tidak akan membuat instance std::basic_stringtanpa chartipe.
hlin117