Jaka jest różnica między std::stringi std::basic_string? Dlaczego oba są potrzebne?
Odpowiedzi:
std::basic_stringto szablon klasy służący do tworzenia łańcuchów z typów znaków, std::stringsłuży typedefdo specjalizacji tego szablonu klasy dla char. Tak, oba są potrzebne (lub przynajmniej wymagane przez standard).
std::stringjest instancją std::basic_string<T>:
typedef std::basic_string<char> string
std::basic_stringKonieczne jest posiadanie podobnego interfejsu dla wszystkich typów ciągów ( wstringna przykład).
stringjest specjalizacja z basic_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::stringjest instancją std::basic_stringszablonu z typem char. Potrzebujesz obu, aby oprócz tego móc tworzyć ciągi rzeczy char, na przykład std::basic_string<wchar_t>ciąg szerokich znaków. Lub jeśli chcesz ciąg z 32 bitowych elementów std::basic_string<unsigned int>.
std::basic_stringbez chartypu.
Tylko mały dodatek do tego, co wszyscy odpowiedzieli. Podobnie jak std::stringjego specjalizacja basic_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ą).
W std::stringdomyślnie wszystkie te parametry do rozsądnych wartości, jak w większości przypadków tylko potrzebować std::stringi to jest jego przydatność. Z drugiej strony, gdy potrzebujesz czegoś bardziej niestandardowego, masz std::basic_string. Więc oba mają różne cele