¿Cuál es la diferencia entre "STL" y "Biblioteca estándar de C ++"?


446

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?


6262
La gente necesita buenos nombres para describir cosas. El genio de Stepanov cambió la forma en que programamos. Un nombre como "programación de biblioteca estándar" es completamente inútil para describir eso. Llámalo "programación stl" y todos saben a qué te refieres. Discutir sobre eso simplemente pierde el punto: necesitamos un buen nombre.
Hans Passant

34
@Hans: No, se pierden el punto: " todo el mundo sabe lo que quiere decir" es no es cierto .
Carreras de ligereza en órbita

16
No tengo idea de lo que quieres decir.
Hans Passant

21
Aquí hay un ejemplo perfecto 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.
Carreras de ligereza en órbita el

Respuestas:


571

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.


136
El S stándar T emplat L ibrary no sólo fue creado por San epanov y L ee, sino que también estaban trabajando en el S oftware T ecnología L aboratory en el momento.
Kragen Javier Sitaker

21
Alguien preguntó hoy en qué encabezado std::iotaestá, 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.
Carreras de ligereza en órbita

40
Y MS STL es mantenida por S tephan T . L avavej, también conocido como STL.
Mihaela


26
Bjarne Stroustrup diferencia específicamente el STL de otras partes de la Biblioteca estándar en el "canon", El lenguaje de programación C ++ 4ta edición.
Codenheim

84

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, rbeginy rendse añadieron a std::stringlo 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.


55
@Jerry: El primero; eso es lo que significa "estándar". :)
Carrera de ligereza en órbita

66
@Jerry: No estoy seguro de dónde entran los espacios de nombres. Las implementaciones compatibles no agregan nada al espacio de nombres std. Estaba hablando de "std" en "stdlib", que significa "estándar". ¡Creo que está bastante claro lo que eso significa!
Carreras de ligereza en órbita

3
@Jerry: Realmente no creo que sea difícil esperar que alguien lea el adjetivo "estándar" como "esto está en el estándar". Mientras tanto, 17.4.3.1/1 es bastante claro que agregar cosas al espacio de nombres stdes 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.
Carreras de ligereza en órbita

1
La historia de SGI y HP aquí es al revés. Stepanov estaba en HP antes de estar en SGI.
Kragen Javier Sitaker

2
Acabo de releer los comentarios aquí y pensé que valía la pena agregar un punto más (ciertamente menor): creo que es un poco exagerado esperar que "estándar" siempre signifique "esto está en el estándar". En particular, muchos programadores de C ++ utilizan la frase "librería estándar" mucho antes de que era un estándar. Si uno piensa que se referían a la biblioteca en el estándar C, señalaré que lo mismo era cierto para los programadores C mucho antes de que hubiera (incluso un borrador de) un estándar C.
Jerry Coffin

52

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:

Norma ISO 14882 C ++:

17 - Introducción a la biblioteca [lib.library]:

  1. Esta cláusula describe el contenido de la Biblioteca estándar de C ++ , cómo un programa 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, listy algoritmos como copyy swap.

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).


55
+1. Aunque, en el STL, no había stdespacio de nombres (IIRC).
Carreras de ligereza en órbita

1
En ese momento, la mayoría de los compiladores de C ++ no implementaban espacios de nombres. De hecho, no sé si incluso estaban en el estándar.
Kragen Javier Sitaker

3
@Kragen: Bueno, no había un estándar.
Carreras de ligereza en órbita el

3
Oh. Bueno, había algunos libros de Stroustrup, pero supongo que no es exactamente lo mismo, ¿verdad?
Kragen Javier Sitaker

23

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.


@Tomalak y @Mark: En realidad, Scott no, -1de 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 fue std::string, y que había sido equipado para ser un contenedor STL completo.
sbi

@sbi: Evidentemente has malinterpretado mi posición. No usaría "STL" de la manera en que lo hace Scott. Por favor lee mi respuesta.
Carreras de ligereza en órbita

66
@Tomalak, tampoco usaría "STL" de esa manera, aunque probablemente haya sido culpable en el pasado. Simplemente no creo que valga la pena golpear a la gente.
Mark Ransom

1
Que puedo respetar. Me inquieta mucho la gente que se niega a reconocer la ambigüedad potencial. :)
ligereza corre en órbita el

11
También estarías en compañía de Bjarne Stroustrup - ref. p.ej. stroustrup.com/DnE2005.pdf : "el STL (la" Biblioteca de plantillas estándar "; es decir, los contenedores y el marco de algoritmo de la biblioteca estándar ISO C ++)"
Sander De Dycker

7

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::localey std::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, stringno es de SGI y no utiliza su clase de "soga" (aunque eso se incluye como una extensión opcional), ni lo es valarrayni algunos otros. 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 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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.