cppreference - ¿Cuál es la diferencia entre “STL” y “Biblioteca estándar de C++”?
c++ library download (5)
De las Preguntas Frecuentes de la Biblioteca de C ++ de GNU (libstdc ++) :
La STL (biblioteca de plantillas estándar) fue la inspiración para grandes porciones de la biblioteca estándar de C ++, pero los términos no son intercambiables y no significan lo mismo. La biblioteca estándar de C ++ incluye muchas cosas que no provienen de la STL, y algunas de ellas ni siquiera son plantillas, como std::locale
y std::thread
.
Libstdc ++ - v3 incorpora una gran cantidad de código de SGI STL (la combinación final fue de la versión 3.3 ). El código en libstdc ++ contiene muchas correcciones y cambios en comparación con el código SGI original.
En particular, la string
no es de SGI y no hace uso de su clase de "cuerda" (aunque se incluye como una extensión opcional), ni valarray
ni algunas otras. Las clases como vector<>
eran de SGI, pero se han modificado ampliamente.
Puede encontrar más información sobre la evolución de libstdc ++ en la documentación de la evolución de API y la compatibilidad con versiones anteriores .
Las FAQ para STL de SGI todavía se recomienda leer.
Para su información, a partir de marzo de 2018, incluso el sitio web oficial de STL www.sgi.com/tech/stl/ se ha ido .
Alguien me llamó la atención sobre este artículo que afirma (estoy parafraseando) que el término STL se usa incorrectamente para referirse a toda la Biblioteca estándar de C ++ en lugar de las partes que se tomaron de SGI STL.
(...) se refiere al "STL", a pesar del hecho de que muy pocas personas todavía usan el STL (que fue diseñado en SGI).
Algunas partes de la biblioteca estándar de C ++ se basaron en partes de la STL, y son estas partes las que muchas personas (incluidos varios autores y cplusplus.com, notoriamente plagadas de errores) todavía denominan "la STL". Sin embargo, esto es inexacto; de hecho, el estándar de C ++ nunca menciona "STL", y hay diferencias de contenido entre los dos.
(...) "STL" se usa raramente para referirse a los bits de la stdlib que se basan en el SGI STL. La gente piensa que es toda la biblioteca estándar. Se pone en CVs. Y es engañoso.
Apenas sé nada sobre la historia de C ++, así que no puedo juzgar la corrección del artículo. ¿Debo abstenerme de usar el término STL? ¿O es esta una opinión aislada?
El "STL" fue escrito por Alexander Stepanov en los días previos a la estandarización de C ++. C ++ existió hasta los años 80, pero lo que ahora llamamos " C++ " es el lenguaje estandarizado en ISO / IEC 14882: 2014 (y versiones anteriores, como ISO / IEC 14882: 2011).
El STL ya se usaba ampliamente como una biblioteca para C ++, dando a los programadores acceso a contenedores, iteradores y algoritmos. Cuando se llevó a cabo la estandarización, el comité de idiomas diseñó partes de la Biblioteca estándar de C ++ (que es parte del estándar de idiomas) para que coincida muy estrechamente con la STL.
A lo largo de los años, muchas personas, incluidos destacados autores de libros y varios sitios web, han seguido refiriéndose a la Biblioteca Estándar de C ++ como "STL", a pesar del hecho de que las dos entidades están separadas y que existen algunas diferencias. Estas diferencias son aún más pronunciadas en el próximo nuevo estándar de C ++, que incluye varias características y altera significativamente algunas clases.
La STL original ahora se suele denominar "una implementación de la Biblioteca de plantillas estándar de C ++" (¡más bien al pasado!), De la misma manera que su Microsoft Visual Studio o GCC envía una implementación de la Biblioteca estándar de C ++. Pero la "Biblioteca de plantillas estándar" y la "Biblioteca estándar" no son lo mismo.
La batalla es sobre si la biblioteca estándar actual debe llamarse "la STL" en su totalidad o en parte, y / o si importa lo que se llama.
Para "STL"
Hay una escuela de pensamiento que dice que todo el mundo sabe ahora que "STL" significa la biblioteca estándar, al igual que todo el mundo ahora sabe que "C ++" es el lenguaje estandarizado de ISO.
También incluye a aquellos que creen que realmente no importa mientras todas las partes entiendan de qué se habla.
Es un término hecho aún más prevalente por la naturaleza de la bestia, gran parte de la cual hace un uso intensivo de la característica de C ++ conocida como "plantillas".
Para "Biblioteca estándar de C ++" (o stdlib)
Sin embargo, hay otra escuela de pensamiento, a la que me suscribo, que dice que esto es confuso. Las personas que aprenden C ++ por primera vez no conocen esta distinción y es posible que no noten pequeñas diferencias de idioma.
El autor de ese artículo ha encontrado muchas veces personas que creen que toda la biblioteca estándar de C ++ es la STL, incluidas las características que nunca fueron parte de la misma STL. La mayoría de los defensores vocales de "la STL", en contraste, saben exactamente lo que quieren decir con eso y se niegan a creer que no todos "lo entienden". Claramente, el uso del término no es uniforme.
Además, hay algunas bibliotecas similares a STL que son implementaciones de hecho de la STL original, no la biblioteca estándar de C ++. Hasta hace poco, STLPort era uno de ellos (e incluso allí, ¡ la confusión abunda!).
Además, el Estándar de C ++ no contiene el texto "STL" en ninguna parte, y algunas personas emplean habitualmente frases como "el STL está incluido en la Biblioteca de Estándar de C ++", que es simplemente incorrecto.
Creo que continuar propagando el uso del término de esta manera solo conducirá al malentendido para siempre. Por desgracia, puede ser totalmente contraproducente intentar cambiar las cosas, incluso si se supone que es para mejor. Podemos estar estancados con dobles significados para siempre.
Conclusión
Aprecio que esta publicación haya sido un poco parcial: escribí el artículo al que te vinculaste. :) De todos modos, espero que esto ayude a explicar la batalla un poco mejor.
Actualización 13/04/2011
Aquí hay three examples perfect de alguien que usa "STL" para referirse a toda la biblioteca estándar de C ++. Me sigue desconcertando que tantas personas juren ciegas que nadie lo hace, cuando es fácil de ver casi a diario.
El término "STL" o "Biblioteca de plantillas estándar" no aparece en ninguna parte del estándar ISO 14882 C ++. Por lo tanto, referirse a la biblioteca estándar de C ++ como STL es incorrecto. El término "Biblioteca estándar de C ++" o "biblioteca estándar" es lo que oficialmente utiliza ISO 14882:
Norma ISO 14882 C ++:
17 - Introducción a la biblioteca [lib.library]:
- Estas cláusulas describen el contenido de la biblioteca estándar de C ++ , cómo un programa de C ++ bien formado hace uso de la biblioteca y cómo una implementación conforme puede proporcionar las entidades en la biblioteca.
...
STL es una biblioteca diseñada originalmente por Alexander Stepanov, independiente del estándar C ++. Sin embargo, algunos componentes de la biblioteca estándar de C ++ incluyen componentes STL como vector
, list
y algoritmos como copy
e swap
.
Pero, por supuesto, el estándar de C ++ incluye muchas más cosas fuera del STL, por lo que el término "biblioteca de estándar de C ++" es más correcto (y es lo que realmente utilizan los documentos de estándares).
Hice este mismo argumento recientemente, pero creo que se puede permitir un poco de tolerancia. Si Scott Meyers comete el mismo error, estás en buena compañía.
No hay una respuesta que sea realmente correcta. Alexander Stepanov desarrolló una biblioteca que llamó STL (que trabajaba para HP en ese momento). Esa biblioteca fue propuesta para su inclusión en el estándar C ++.
Que básicamente el desarrollo "bifurcado". El comité incluyó algunas partes, rechazó otras completamente y rediseñó algunas (con la participación de Alexander). El desarrollo de la biblioteca original se trasladó posteriormente a Silicon Graphics, pero continuó por separado de la biblioteca estándar de C ++.
Después de agregar esas piezas a la biblioteca estándar, algunas otras partes de la biblioteca estándar se modificaron para que encajen mejor con lo que se agregó (por ejemplo, begin
, end
, rbegin
y rend
se agregaron a std::string
para que pueda usarse como una envase). Casi al mismo tiempo, la mayoría de la biblioteca (incluso las piezas que no estaban relacionadas entre sí se convirtieron en plantillas para adaptarse a diferentes tipos (p. Ej., Secuencias estándar).
Algunas personas también usan STL como una forma corta de "Biblioteca Estándar".
Eso significa que cuando alguien usa el término "STL" podría estar refiriéndose a una media docena de cosas diferentes. Para bien o para mal, la mayoría de las personas que lo usan parecen ignorar la multiplicidad de significados y asumen que todos los demás reconocerán a qué se refieren. Esto lleva a muchos malentendidos, y al menos a algunas guerras de llamas serias que hicieron que la mayoría de los participantes se vieran tontos porque simplemente estaban hablando de cosas completamente diferentes.
Desafortunadamente, la confusión es probable que continúe sin cesar. Es mucho más conveniente referirse a "STL" que a algo así como "contenedores, iteradores y algoritmos en la biblioteca estándar de C ++, pero sin incluir std::string
, aunque puede actuar como un contenedor". A pesar de que la "biblioteca estándar de C ++" no es tan larga y torpe como esa, "STL" todavía es mucho más corta y sencilla. Hasta que, o a menos que alguien invente términos que sean más precisos (cuando sea necesario) y tan convenientes, se continuará utilizando "STL" y se seguirá generando confusión.