Jaka jest różnica między std::string
i std::basic_string
? Dlaczego oba są potrzebne?
95
std::basic_string
to szablon klasy służący do tworzenia łańcuchów z typów znaków, std::string
służy typedef
do specjalizacji tego szablonu klasy dla char
. Tak, oba są potrzebne (lub przynajmniej wymagane przez standard).
std::string
jest instancjąstd::basic_string<T>
:typedef std::basic_string<char> string
std::basic_string
Konieczne jest posiadanie podobnego interfejsu dla wszystkich typów ciągów (wstring
na przykład).źródło
string
jest specjalizacja zbasic_string
.namespace std { typedef basic_string<char> string; }
Technicznie nie jest to też tak naprawdę instancja, ale jest przynajmniej bliższa (instancja z definicji tworzy instancję, a typedef tworzy tylko nazwę, a nie instancję ).A
std::string
jest instancjąstd::basic_string
szablonu z typemchar
. Potrzebujesz obu, aby oprócz tego móc tworzyć ciągi rzeczychar
, na przykładstd::basic_string<wchar_t>
ciąg szerokich znaków. Lub jeśli chcesz ciąg z 32 bitowych elementówstd::basic_string<unsigned int>
.źródło
std::basic_string
bezchar
typu.Tylko mały dodatek do tego, co wszyscy odpowiedzieli. Podobnie jak
std::string
jego specjalizacjabasic_string
, również domyślnie niektóre inne parametry oprócz typu char. Basic_string może mieć niestandardowy typ znaku (np. Basic_string może mieć wide_chars), niestandardową cechę char_trait (np. Basic_string może mieć szerokie znaki, ale obsługuje każdą operację normalnych znaków) i niestandardowy alokator (basic_string może zawierać dodatkowe informacje dla niestandardowego debuggera lub zarządzania pamięcią statyczną).Przydatność
W
std::string
domyślnie wszystkie te parametry do rozsądnych wartości, jak w większości przypadków tylko potrzebowaćstd::string
i to jest jego przydatność. Z drugiej strony, gdy potrzebujesz czegoś bardziej niestandardowego, maszstd::basic_string
. Więc oba mają różne celeźródło