2010-03-13 14 views

Respuesta

10

La mayor parte de la razón tiene que ver con la localización y la internacionalización (L10I18), el rendimiento y por razones históricas.

Para los problemas del L10I18, se agregó char_traits, y notará que los flujos también los tienen. La intención era hacer "personajes más inteligentes" de alguna manera, pero el resultado fue inútil. Casi lo único que es bueno para char_traits es especializar algunas de las comparaciones std :: string/wstring, copias, etc. como compiladores intrínsecos.

La falla se debe principalmente a las secuencias de UNIX, que ven al personaje como el "átomo" principal donde en las GUI, web, etc. que se internacionalizan, la cadena es el "átomo" principal. En otras palabras, en C/C++ land, tenemos "matrices tontas de caracteres inteligentes" para cadenas, mientras que cualquier otro lenguaje usa "matrices inteligentes de caracteres tontos". Unicode toma el último enfoque.

Otra gran diferencia entre basic_string y vector - basic_string solo puede contener tipos de POD. Esto puede hacer una diferencia en algunos casos en algún momento el compilador tiene un tiempo más fácil para optimizar basic_string en comparación con el vector.

basic_string a veces tiene muchas otras optimizaciones, como Copy on Write y Small String Optimization. Estos varían de una implementación a la siguiente.

Sin embargo, probablemente la mayor razón por la cual hay dos cosas casi iguales es histórica: las cadenas son anteriores al STL, y la mayor parte del trabajo parecía centrarse en hacerlas interoperar con la biblioteca IOStream. Un C++ Urban Myth es que STL es una "biblioteca de contenedores" que se agregó a C++.No lo es, y para que sea adoptado en C++, se agregaron contenedores. Una "Interfaz STL" también se atornilló a la clase de cadena existente. std :: vector se tomó en gran medida de una implementación de vector que existía en AdaSTL.

1

Fue una decisión de diseño al principio de la creación de STL. Creo que mucha gente ahora admite que la interfaz std::string está demasiado hinchada e inconsistente con el resto del STL, pero es demasiado tarde para cambiarla.

+0

Sí, es un tipo de conocimiento común. Uno de los libros Sutter/Alexandrescu C++ incluso tiene un capítulo al respecto (junto con un ejercicio de rediseño de la clase std :: string). – riviera

3

Las cadenas tienen funciones especiales relacionadas con cadenas: c_str, substr, concatenación, entre otras. Además, no olvide el punto importante que strings agrega automáticamente el '\0' al final de sus datos (y lo maneja correctamente con concatenación, etc.) para que no tengan la misma operación que vector<char> o algo así.

Pero sí, son increíblemente similares. Ambos tienen un puntero a una matriz asignada en el montón, pero ciertamente no son lo mismo.

+0

Realmente no veo substr o concatenación como cadena de caracteres específica. Hay idiomas que proporcionan aquellos para matrices arbitrarias. Sin embargo, tiene razón acerca de la terminación nula: c_str() es, desafortunadamente, la función más común que uso en std :: string. – dan04

+0

@ dan04: std :: string tiene toneladas de funciones y sobrecargas diseñadas para hacerlo funcionar de la mano con cadenas de estilo C (que es lo que son los literales de cadena en C++). No tendría sentido que 'vector ' respalde todas esas operaciones para' T * ', porque' char * 'pasa a ser un puntero con un significado muy específico. – UncleBens

6

std :: string tiene una gran cantidad de operadores que std :: vector no:

  • operador + (anexar una cadena a cadena B, + realmente no tiene sentido para los vectores)
  • < operador,>, ==,! = (comparación de cadenas, algunos no tienen sentido para los vectores)
  • c_str() (devolver una representación "estilo C")
  • y más (incluyendo subcadena, encontrar, etc, pero algunos de ellos se implementan en otras partes de STL y se pueden usar en vectores, más o menos)

Es cierto que hay poco más que std :: string tenga que un vector no o no, pero estos son importantes, son la mayoría de los casos de uso para una cadena.

Cuestiones relacionadas