Jaka jest różnica między std::string
i std::basic_string
? Dlaczego oba są potrzebne?
Odpowiedzi:
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).
string
jest 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::string
jest instancją std::basic_string
szablonu 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_string
bez char
typu.
Tylko mały dodatek do tego, co wszyscy odpowiedzieli. Podobnie jak std::string
jego 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::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, masz std::basic_string
. Więc oba mają różne cele