2011-05-12 11 views
35

(Cuando digo STL, estoy hablando de la biblioteca de plantillas que gira en torno a los contenedores, iteradores, algoritmos y funtores.)
Esta pregunta vino a la mente después de pensar que un std::string comporta sobre todo como un contenedor normal, con begin y end funciones (incluyendo iterador), una función size y la posibilidad de utilizar todas aquellas para algoritmos STL normales que funcionan en contenedores/rangos a través de sus iteradores (por ejemplo, transform, sort, find, etc.).¿std :: string es parte del STL?

Al mismo tiempo, sin embargo, no es un contenedor en sí, ya que no cabe en la imagen de los contenedores que almacenan datos arbitrarios. Además, opera en los datos contenidos principalmente a través de funciones miembro, como substr, find_first_of, etc., mientras que el contenedor verdadero no hace eso y deja que los algoritmos manejen eso.

Además, el cplusplus reference site y el estándar C++ no enumeran std::string junto con los contenedores reales, sino en una categoría distinta.
Sin embargo, en SGI's STL site, basic_string (y en consecuencia string typedef) se mencionan con el otro contenedor y basic_string reference site indica que pertenece a la categoría "contenedores".

Ahora mi pregunta es, ¿es realmente string parte de la STL o es una biblioteca distinta en sí misma?
Y si ahora pertenece al STL, ¿difería en el STL original desarrollado por Stepanov?

+9

¿A quién le importa el STL en este momento, que no sea por curiosidad histórica? – ildjarn

+4

@ildjarn: Bueno, me gusta acumular conocimiento. : P Además, ¿ves esa pequeña etiqueta 'history'? :) Solo estoy interesado en cosas como esta, así que lo pido. – Xeo

+1

Ah, claro, en realidad no vi la etiqueta 'history': -] – ildjarn

Respuesta

25

No, realmente no. Y sí, más o menos.

There are varying definitions of "the STL", incluyendo:

  • El actual STL HP/SGI, la biblioteca original, partes de las cuales la biblioteca Standard C++ se basó en. Incluyeron contenedores, iteradores y algoritmos. Las cadenas fueron no una parte de esto.

  • Las partes de la biblioteca estándar de C++ que se basaron en la biblioteca SGI STL: contenedores, iteradores y algoritmos. Todavía sin cadenas.

  • Todos los de la biblioteca estándar de C++. Esta definición no tiene absolutamente ninguna conexión a tierra en lógica o realidad, si se sigue, se incluiría std::string.

Tenga en cuenta que el TEL real se ha desarrollado desde C++ fue estandarizado (hace unos 13 años, recuerda), y han adoptado hacia atrás-algunas de las cosas que entró en la norma, como las cuerdas. Esto no significa que originalmente estaban allí en 1998 ... pero ahora están ahí por razones de "compatibilidad".


Resumen

El STL fue contenedores, algoritmos y iteradores.

Las cadenas y las secuencias se adoptaron para C++ 98, luego hacia atrás -adoptado para el SGI STL moderno.

Si las cadenas son "parte de la STL" o no depende de si usted sigue la lógica y el razonamiento, o si llama a la biblioteca estándar "STL".

Espero que esto ayude.

+0

Solo una nota menor: al menos como fue distribuido originalmente, el HP STL en realidad * sí * incluyó una clase 'bstring' (cadena básica) (no debe confundirse con' basic_string'), aunque como recuerdo, realmente solo estaba allí, así que no tendrían que tratar con cadenas tipo C en programas de demostración triviales (pero aparentemente no querían tratar con cada compilador que tenga su propia clase de cadena única). –

2

Es parte de STL de hecho. Y std :: string es solo basic_string typedef. Es contenedor, especializado (no en C++ "especialización", que significa :)) para el almacenamiento de datos con semántica de cadenas. Sin embargo, no tengo idea de Stepanov. Vale la pena mencionar que STL es "Biblioteca de plantillas estándar", no solo la subparte de contenedores. Eso incluye algoritmos, secuencias y algunos rasgos.

+0

@Xeo: ¿Eh? Las secuencias, los algoritmos y los iteradores son precisamente las únicas cosas que se adaptaron de la STL para el estándar. –

+0

@Tomalak: Oh, corrientes. Ahora leo eso como IOstreams, tal vez porque también tenías ese error en tu otra respuesta.> _> " – Xeo

+0

@Xeo: La diferencia es ...? –

9

No hay una respuesta real a esto. Por un lado, std::string se desarrolló de manera completamente independiente de los otros contenedores. Por otro lado, se ha agregado lo suficiente para cumplir con todos los requisitos de un contenedor de acceso aleatorio. Si elige clasificarlo como parte de "STL" o no depende totalmente de usted, al final, solo señala el hecho de que "STL" carece de una única definición acordada, y las posibilidades de que ocurra repentinamente obtener un significado claro es remoto (por decirlo de una manera agradable).

IOW, "STL" es una abreviatura pésima porque la gente lo usa para significar al menos tres cosas diferentes, pero, desafortunadamente, no hay una mejor abreviación con un significado mejor definido, por lo que STL permanece en uso y probablemente continúe haciéndolo (y continúe obstruyendo la comunicación) indefinidamente.

Cuestiones relacionadas