Ambos son matrices de tamaño variable, y std :: basic_string no tiene ninguna función específicamente relacionada con el carácter, como upper(). ¿Qué tiene de especial la cuerda para mejorar los datos de los personajes?¿Por qué son distintos los tipos de cadenas y vectores?
Respuesta
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.
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.
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.
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
@ 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
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.
- 1. ¿Por qué los vectores son tan superficiales?
- 2. ¿Por qué los arrays de arrays (vectores) son tan lentos?
- 3. ¿Por qué los vectores en caja son tan lentos?
- 4. Los tipos de vectores OpenCL usan SIMD
- 5. F #: ¿Por qué los tipos de opciones no son compatibles con los tipos que aceptan nulos?
- 6. ¿Por qué los tipos sellados son más rápidos?
- 7. ¿Qué son exactamente los tipos integrales?
- 8. emulando por completo los distintos tipos integrados (específicamente: char16_t y char32_t)
- 9. ¿Los tipos de referencia son tipos anulables?
- 10. ¿Por qué son tipos de referencia de punteros?
- 11. ¿Por qué tenemos punteros distintos de vacío?
- 12. ¿Los tipos de valor son inmutables por definición?
- 13. Compruebe si los tipos son moldeables/subclases
- 14. ¿Por qué los EJB son seguros y los servlets no?
- 15. ¿Qué son aserciones? y por qué los usarías?
- 16. ¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C#?
- 17. ¿Qué son los tipos de datos de JavaScript?
- 18. ¿Por qué GLib redefine los tipos?
- 19. ¿Por qué los tipos WinRT deben sellarse?
- 20. ¿Los tipos primitivos son diferentes en Java y C#?
- 21. ¿Por qué los tipos de CLR sin firmar son tan difíciles de usar en C#?
- 22. ¿Qué son los árboles de expresión, cómo los usa y por qué los usaría?
- 23. ¿Los punteros son tipos primitivos en C++?
- 24. pid_t (y tipos similares): ¿por qué? ¿Por qué?
- 25. Pasando vectores por referencia
- 26. ¿Cuáles son los usos de los tipos polimórficos?
- 27. ¿Por qué las propiedades de los tipos anónimos en C# son de solo lectura?
- 28. ¿Qué tan geniales son los tipos de datos definidos por el usuario en SQL Server?
- 29. ¿Qué son las cookies firmadas y por qué son útiles?
- 30. ¿Por qué usar === cuando está seguro de que los tipos son iguales?
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