Qual é a diferença entre std :: string e std :: basic_string? E por que ambos são necessários?


95

Qual é a diferença entre std::stringe std::basic_string? E por que ambos são necessários?

Respostas:


62

std::basic_stringé um modelo de classe para fazer strings de tipos de caracteres, std::stringé um typedefpara uma especialização desse modelo de classe para char. Sim, ambos são necessários (ou pelo menos exigidos pela norma).


18
por que ambos são necessários?
Mohamed El-Nakib

1
então você está dizendo que std :: string é typedef std :: basic_string <char> std :: string?
unresolved_external

2
@MuhammadAnnaqeeb com 2,5 anos de atraso, mas a resposta curta é fornecer suporte a string ampla (wstring) (Unicode, 2 bytes por caractere, wchar_t).
Andrew,

49

std::stringé uma instanciação de std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringé necessário ter uma interface semelhante para todos os tipos de strings ( wstringpor exemplo).


33
O termo adequado é "especialização". stringé uma especialização de basic_string.
ANT

3
Eu acho que você poderia discutir sobre isso. "especialização" geralmente é usada para indicar herança. Um modelo de {classe | função} é instanciado substituindo os argumentos do modelo. Há especialização de modelo parcial, mas isso não é usado aqui.
pmr

5
Referir-se a uma classe derivada como uma 'especialização' é um uso menos formal de 'especialização'. A palavra 'especialização' não é usada dessa forma no padrão (tenho quase certeza), mas é usada extensivamente para descrever a especialização de modelo. O nome de uma especialização de modelo pode ser usado em contextos que não forçam e a instanciação implícita, portanto, a especialização e a instanciação são conceitos separados. Bem como uma especialização de modelo (o nome de um modelo com um determinado conjunto de parâmetros), também existem especializações parciais (modelos de classe apenas) e especializações explícitas.
CB Bailey

1
Usar "especialização" aqui seria enganoso. Uma especialização de modelo tem um significado específico (não relacionado à herança), mas NÃO é isso que é usado aqui. std :: string é nada mais nada menos que um typedef, como: namespace std { typedef basic_string<char> string; }Tecnicamente, não é realmente uma instanciação, mas é pelo menos mais próximo (instanciação, por definição, cria uma instância, e um typedef apenas cria um nome, não uma instância )
Jerry Coffin

3
@Charles: é enganoso porque (com modelos), "especialização" normalmente se refere a especialização parcial ou especialização explícita, não um typedef para o que acabará como uma simples instanciação.
Jerry Coffin

19

A std::stringé uma instanciação do std::basic_stringmodelo com um tipo de char. Você precisa de ambos para poder fazer cadeias de outras coisas char, como std::basic_string<wchar_t>para uma cadeia de caracteres largos. Ou se você quiser uma string com elementos de 32 bits std::basic_string<unsigned int>,.


2
Acho que essa deve ser a resposta mais votada. Ele fornece um caso de uso de quando você não instanciaria std::basic_stringsem um chartipo.
hlin117

0

Apenas uma pequena adição ao que todos os outros responderam. Como std::stringé uma especialização basic_stringdele também padrão alguns outros parâmetros exceto o tipo de char. Uma basic_string pode ter um tipo de char personalizado (por exemplo, basic_string pode ter wide_chars), um char_trait personalizado (por exemplo, basic_string pode ter caracteres largos, mas suporta todas as operações de caracteres normais) , e um alocador personalizado (um basic_string pode ter algumas informações extras empacotadas com ele para um depurador personalizado ou um gerenciamento de memória estática).

Utilidade

O std::stringpadrão de todos esses parâmetros para valores razoáveis ​​já que na maioria dos casos você só precisa de um std::stringe esta é a sua utilidade. Por outro lado, sempre que precisar de algo mais personalizado você tem std::basic_string. Então, ambos têm seus propósitos diferentes

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.