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?

Benj
fonte

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).

CB Bailey
fonte
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).

pmr
fonte
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>,.

Zanson
fonte
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

Spyros Mourelatos
fonte