Яка різниця між std :: string та std :: basic_string? І навіщо потрібні обидва?


94

Яка різниця між std::stringта std::basic_string? І навіщо потрібні обидва?

Відповіді:


63

std::basic_stringє шаблоном класу для створення рядків із типів символів, std::stringє typedefспеціалізацією цього шаблону класу для char. Так, вони обоє потрібні (або принаймні вимагаються стандартом).


17
навіщо вони обоє потрібні?
Мохамед Ель-Накіб

1
отже, ви говорите, що std :: string є typedef std :: basic_string <char> std :: string?
unresolved_external

1
@MuhammadAnnaqeeb запізнився на 2,5 роки, але короткою відповіддю є також підтримка широкого рядка (wstring) (Unicode, 2 байти на символ, wchar_t).
Ендрю

46

std::stringє екземпляром std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringнеобхідно мати подібний інтерфейс для всіх типів рядків ( wstringнаприклад).


33
Правильний термін - "спеціалізація". stringє спеціалізація в basic_string.
АНТ

3
Думаю, ви могли б посперечатися з цього приводу. "спеціалізація" зазвичай використовується для позначення спадщини. Шаблонний {клас | функція} створюється за допомогою заміни аргументів шаблону. Існує часткова спеціалізація на шаблонах, але вона тут не використовується.
pmr 02

5
Посилання на похідний клас як на "спеціалізацію" є менш формальним використанням "спеціалізації". Слово "спеціалізація" взагалі не використовується в цьому стандарті (я впевнений у цьому), але широко використовується для опису спеціалізації на шаблонах. Назва спеціалізації шаблону може використовуватися в контекстах, які не примусово та неявно створюють екземпляри, тому спеціалізація та інстанціація є окремими поняттями. Окрім спеціалізації на шаблоні (назва шаблону з певним набором параметрів), існують також часткові спеціалізації (лише шаблони класів) та явні спеціалізації.
CB Bailey

1
Використання тут "спеціалізації" було б оманливим. Спеціалізація шаблону має конкретне значення (не пов’язане з успадкуванням), але це НЕ те, що використовується тут. std :: string не є нічим більш-менш ніж typedef, наприклад: namespace std { typedef basic_string<char> string; }Технічно це теж не є екземпляром, але принаймні ближче (інстанціація, за визначенням, створює екземпляр, а typedef лише створює ім'я, а не екземпляр ).
Джеррі Коффін 02

3
@Charles: це оманливе, оскільки (із шаблонами) "спеціалізація" зазвичай стосується або часткової спеціалізації, або явної спеціалізації, а не typedef для того, що в кінцевому підсумку стане простим екземпляром.
Джеррі Коффін, 02

17

A std::string- це екземпляр std::basic_stringшаблону з типом char. Вам потрібно і те, і інше, щоб ви могли складати ряд речей, крім того char, наприклад, std::basic_string<wchar_t>для рядка широких символів. Або , якщо ви хочете рядок з 32 - бітними елементами std::basic_string<unsigned int>.


2
Я думаю, що це повинна бути найкраща відповідь. Він надає варіант використання, коли ви не std::basic_stringстворили б інстанцію без charтипу.
hlin117
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.