Qual é a diferença entre std::string
e std::basic_string
? E por que ambos são necessários?
Respostas:
std::basic_string
é um modelo de classe para fazer strings de tipos de caracteres, std::string
é um typedef
para uma especialização desse modelo de classe para char
. Sim, ambos são necessários (ou pelo menos exigidos pela norma).
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 ( wstring
por exemplo).
string
é uma especialização de basic_string
.
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 )
A std::string
é uma instanciação do std::basic_string
modelo 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>
,.
std::basic_string
sem um char
tipo.
Apenas uma pequena adição ao que todos os outros responderam. Como std::string
é uma especialização basic_string
dele 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).
O std::string
padrão de todos esses parâmetros para valores razoáveis já que na maioria dos casos você só precisa de um std::string
e 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