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).
Partes de la Biblioteca estándar de C ++ se basaban en partes de la STL, y es a estas partes a las que muchas personas (incluidos varios autores y cplusplus.com, notoriamente plagadas de errores) todavía se refieren como "la STL". Sin embargo, esto es inexacto; de hecho, el estándar C ++ nunca menciona "STL", y hay diferencias de contenido entre los dos.
(...) "STL" rara vez se usa para referirse a los bits de stdlib que están basados en SGI STL. La gente piensa que es toda la biblioteca estándar. Se pone en CV. Y es engañoso.
Casi no 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?
Respuestas:
El "STL" fue escrito por Alexander Stepanov en los días previos a la estandarización de C ++. C ++ existió durante 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 ocurrió la estandarización, el comité lenguaje diseñado partes de la biblioteca estándar de C ++ (que es parte del estándar de la lengua) a muy asemejarse a la STL.
A lo largo de los años, muchas personas, incluidos autores de libros destacados y varios sitios web, han seguido refiriéndose a la Biblioteca estándar de C ++ como "el STL", a pesar de que las dos entidades están separadas y de que existen algunas diferencias. Estas diferencias son aún más pronunciadas en el próximo nuevo estándar C ++, que incluye varias características y altera significativamente algunas clases.
El STL original ahora a menudo se llama "una implementación de la Biblioteca de plantillas estándar de C ++" (¡bastante al revés al historial real!), 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 se trata de si la Biblioteca estándar actual debería llamarse "el STL" en su totalidad o en parte, y / o si importa cómo se llama.
Para "STL"
Hay una escuela de pensamiento que dice que todo el mundo sabe ahora que "STL" significa la biblioteca estándar, tal como todos saben que "C ++" es el lenguaje estandarizado por ISO.
También incluye a aquellos que creen que realmente no importa mientras todas las partes entiendan de qué se está hablando.
Es un término que se hace aún más frecuente por la naturaleza de la bestia, gran parte del cual hace un uso intensivo de la función 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 pueden no notar pequeñas diferencias de idioma.
El autor de ese artículo se ha encontrado en numerosas ocasiones con personas que creen que toda la Biblioteca estándar de C ++ es el STL, incluidas las características que nunca formaron parte del propio STL. La mayoría de los defensores vocales de "el STL", por el contrario, saben exactamente lo que quieren decir con él 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 de hecho son implementaciones del 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 C ++ no contiene el texto "STL" en ninguna parte, y algunas personas habitualmente emplean frases como "el STL está incluido en la Biblioteca del Estándar C ++", lo cual es completamente incorrecto.
Creo que continuar propagando el uso del término de esta manera solo conducirá a que el malentendido continúe para siempre. Por desgracia, puede ser completamente contraproducente intentar cambiar las cosas, incluso si se supone que es para mejor. Podemos estar atrapados con doble sentido para siempre.
Conclusión
Aprecio que esta publicación haya sido un poco sesgada: escribí el artículo al que vinculaste. :) De todos modos, espero que esto ayude a explicar la batalla un poco mejor.
Actualización 13/04/2011
Aquí hay tres ejemplos perfectos de alguien que está usando "el STL" para referirse a toda la Biblioteca Estándar de C ++. Continúa desconcertando que tanta gente jure ciegamente que nadie hace esto, cuando es fácil verlo casi a diario.
fuente
std::iota
está, porque no pudo hacer que funcione. Es una extensión no estándar de SGI , que llaman "estándar" cuando les conviene porque es "el STL", y todo el mundo sabe que "el STL" es parte de la Biblioteca Estándar de C ++, ¿verdad? Y se introdujo en C ++ 0x, pero no está disponible en C ++ 03. Grrr.No hay una respuesta única 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 ++.
Ese desarrollo básicamente "bifurcado". El comité incluyó algunas partes, rechazó otras por completo y rediseñó algunas (con la participación de Alexander). El desarrollo de la biblioteca original se trasladó más tarde a Silicon Graphics, pero continuó por separado de la biblioteca estándar de C ++.
Después de esas piezas se añadieron a la biblioteca estándar, algunas otras partes de la biblioteca estándar se modificaron para encajar mejor con lo que se añadió (por ejemplo,
begin
,end
,rbegin
yrend
se añadieron astd::string
lo que podría ser utilizado como un contenedor). Casi al mismo tiempo, la mayor parte de la biblioteca (incluso piezas que eran completamente no relacionada) se hicieron en las plantillas para adaptarse a diferentes tipos (por ejemplo, flujos estándares).Algunas personas también usan STL como una forma abreviada de "Biblioteca STandard".
Eso significa que cuando alguien usa el término "STL" podría estar refiriéndose a cualquiera de aproximadamente 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 suponen que todos los demás reconocerán a qué se refieren. Esto lleva a muchos malentendidos, y al menos algunas guerras de fuego serias que hicieron que la mayoría de los participantes parecieran tontos porque simplemente estaban hablando de cosas completamente diferentes.
Desafortunadamente, es probable que la confusión continúe sin cesar. Es mucho más conveniente referirse a "STL" que algo así como "los contenedores, iteradores y algoritmos en la biblioteca estándar de C ++, pero sin incluirlos
std::string
, aunque puede actuar como un contenedor". Aunque la "biblioteca estándar de C ++" no es tan larga y torpe como esa, "STL" sigue siendo mucho más corta y simple. Hasta que alguien invente términos que sean más precisos (cuando sea necesario) e igualmente convenientes, "STL" continuará usándose y continuará la confusión.fuente
std
. Estaba hablando de "std" en "stdlib", que significa "estándar". ¡Creo que está bastante claro lo que eso significa!std
es UB, excepto en algunos casos específicos nombrados: estos casos de adición se nombran en el estándar y, por lo tanto, siguen siendo perfectamente compatibles; "estándar" aún se aplicaría.El término "STL" o "Biblioteca de plantillas estándar" no aparece en ninguna parte del estándar ISO 14882 C ++. Entonces, referirse a la biblioteca estándar de C ++ como STL está mal. El término "Biblioteca estándar de C ++" o "biblioteca estándar" es lo que oficialmente utiliza ISO 14882:
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 comocopy
yswap
.Pero, por supuesto, el estándar C ++ incluye muchas más cosas fuera del STL, por lo que el término "biblioteca estándar C ++" es más correcto (y es lo que realmente usan los documentos estándar).
fuente
std
espacio de nombres (IIRC).He hecho 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.
fuente
-1
de mi parte. El libro trata sobre el STL en el sentido de "las partes de la biblioteca estándar derivadas de la biblioteca de Stepanov". Tómese el tiempo para revisar los libros TOC. Lo único fuera del STL original que pude encontrar fuestd::string
, y que había sido equipado para ser un contenedor STL completo.De la Biblioteca GNU Standard C ++ (libstdc ++) Preguntas frecuentes :
La STL (Biblioteca de plantillas estándar) fue la inspiración para grandes fragmentos 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 del STL, y algunas de ellas ni siquiera son plantillas, como
std::locale
ystd::thread
.Libstdc ++ - v3 incorpora una gran cantidad de código del SGI STL (la fusió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,
string
no es de SGI y no utiliza su clase de "soga" (aunque eso se incluye como una extensión opcional), ni lo esvalarray
ni algunos otros. Las clases comovector<>
eran de SGI, pero se han modificado ampliamente.Puede encontrar más información sobre la evolución de libstdc ++ en la documentación sobre la evolución de la API y la compatibilidad con versiones anteriores .
Las preguntas frecuentes para el 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/ ya no existe .
fuente