Std :: string ile std :: basic_string arasındaki fark nedir? Ve neden her ikisi de gerekli?


94

Arasındaki fark nedir std::stringve std::basic_string? Ve neden her ikisi de gerekli?

Yanıtlar:


63

std::basic_stringkarakter tiplerinin dışında dizeleri yapmak için bir sınıf şablonu vardır std::stringbir olduğunu typedefiçin bu sınıf şablonun bir uzmanlık için char. Evet, ikisi de gereklidir (veya en azından standart tarafından gereklidir).


17
neden ikisi de gerekli?
Mohamed El-Nakib

1
yani std :: string'in typedef std :: basic_string <char> std :: string olduğunu söylüyorsunuz?
unresolved_external

1
@MuhammadAnnaqeeb 2.5 yıl gecikti, ancak kısa cevap, geniş dize (wstring) (Unicode, karakter başına 2 bayt, wchar_t) desteği sağlamaktır.
Andrew

46

std::stringşunların bir örneğidir std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringtüm dizge türleri için benzer bir arayüze sahip olmak gerekir ( wstringörneğin).


33
Uygun terim "uzmanlaşma" dır. stringa, uzmanlık arasında basic_string.
AnT

3
Sanırım bunun hakkında tartışabilirsin. "uzmanlaşma" genellikle kalıtımı belirtmek için kullanılır. Şablonlu bir {class | function}, şablon argümanları değiştirilerek somutlaştırılır. Kısmi şablon uzmanlığı var ancak bu burada kullanılmıyor.
pmr

5
Türetilmiş bir sınıfa 'uzmanlaşma' olarak atıfta bulunmak, 'uzmanlaşmanın' daha az resmi bir kullanımıdır. 'Uzmanlaşma' kelimesi standartta hiç böyle kullanılmıyor (oldukça eminim), ancak şablon uzmanlığını tanımlamak için yaygın olarak kullanılıyor. Bir şablon uzmanlaşmasının adı, somutlaştırmayı zorlamayan ve örtmeyen bağlamlarda kullanılabilir, bu nedenle uzmanlaşma ve somutlaştırma ayrı kavramlardır. Bir şablon uzmanlığının (belirli bir parametre kümesine sahip bir şablonun adı) yanı sıra, kısmi uzmanlıklar (yalnızca sınıf şablonları) ve açık uzmanlıklar da vardır.
CB Bailey

1
Burada "uzmanlaşmayı" kullanmak yanıltıcı olur. Bir şablon uzmanlığının belirli bir anlamı vardır (kalıtımla ilgili olmayan), ancak burada kullanılan şey bu DEĞİLDİR. std :: string bir typedef'ten az ya da çok değildir, örneğin: namespace std { typedef basic_string<char> string; }Teknik olarak, gerçekten bir örnekleme değildir, ama en azından daha yakındır (somutlaştırma, tanımı gereği, bir örnek oluşturur ve typedef, bir örnek değil, yalnızca bir ad oluşturur. ).
Jerry Coffin

3
@Charles: Bu yanıltıcıdır çünkü (şablonlarla), "uzmanlaşma" normalde ya kısmi uzmanlığı ya da açık uzmanlığı ifade eder, basit bir örnekleme olarak sonuçlanacak bir typedef'i değil .
Jerry Coffin

17

A std::string, std::basic_stringşablonun bir tür char. Sen yanında şeylerin dizeleri yapmak, böylece hem ihtiyaç char, böyle bir std::basic_string<wchar_t>geniş karakter dizesi için. Veya 32 bit elemanlı bir dizge istiyorsanız std::basic_string<unsigned int>,.


2
Bence bu en çok oylanan cevap olmalı. std::basic_stringBir chartür olmadan somutlaştırmayacağınız zamanlar için bir kullanım durumu sağlar .
hlin117
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.