Qual é a diferença entre "STL" e "C ++ Standard Library"?


446

Alguém chamou minha atenção para este artigo que afirma (estou parafraseando) que o termo STL é usado incorretamente para se referir a toda a biblioteca padrão do C ++, em vez das partes que foram retiradas do SGI STL.

(...) refere-se ao "STL", apesar de muito poucas pessoas ainda usarem o STL (que foi projetado na SGI).

Partes da biblioteca padrão do C ++ eram baseadas em partes do STL, e é nessas partes que muitas pessoas (incluindo vários autores e o notável cplusplus.com) ainda se referem como "o STL". No entanto, isso é impreciso; de fato, o padrão C ++ nunca menciona "STL" e há diferenças de conteúdo entre os dois.

(...) "STL" raramente é usado para se referir aos bits do stdlib que são baseados no SGI STL. As pessoas pensam que é a biblioteca padrão inteira. É colocado nos currículos. E isso é enganador.

Eu quase não sei nada sobre a história do C ++, então não posso julgar a correção do artigo. Devo me abster de usar o termo STL? Ou isso é uma opinião isolada?


62
As pessoas precisam de bons nomes para descrever as coisas. O gênio de Stepanov mudou a maneira como programamos. Um nome como "programação de biblioteca padrão" é totalmente inútil para descrever isso. Chame de "programação stl" e todo mundo sabe o que você quer dizer. Argumentar sobre isso apenas erra o ponto: precisamos de um bom nome.
Hans Passant

34
@ Hans: Não, você perdeu o ponto: " todo mundo sabe o que você quer dizer" não é verdade .
Lightness Races em Órbita

16
Eu não tenho idéia do que você quer dizer.
Hans Passant

21
Aqui está um exemplo perfeito de alguém que está usando "o STL" para se referir a toda a biblioteca padrão do C ++. Continua me confundindo o fato de tantas pessoas jurarem que são cegas que ninguém faz isso, quando é fácil ver quase diariamente.
Leveza raças em Orbit

Respostas:


571

O "STL" foi escrito por Alexander Stepanov nos dias anteriores à padronização do C ++. O C ++ existia nos anos 80, mas o que chamamos agora de " C ++ " é a linguagem padronizada na ISO / IEC 14882: 2014 (e versões anteriores, como ISO / IEC 14882: 2011).

O STL já era amplamente utilizado como uma biblioteca para C ++, dando aos programadores acesso a contêineres, iteradores e algoritmos. Quando a padronização aconteceu, a comissão de linguagem projetada partes da biblioteca padrão C ++ (que faz parte do padrão de linguagem) para muito coincidem com o STL.

Ao longo dos anos, muitas pessoas - incluindo autores de livros de destaque e vários sites - continuaram a se referir à Biblioteca Padrão C ++ como "a STL", apesar do fato de as duas entidades serem separadas e de haver algumas diferenças. Essas diferenças são ainda mais acentuadas no novo novo padrão C ++, que inclui vários recursos e altera significativamente algumas classes.

O STL original agora é chamado de "uma implementação da Biblioteca de modelos padrão do C ++" (em vez do histórico real!), Da mesma maneira que o Microsoft Visual Studio ou GCC envia uma implementação da Biblioteca padrão do C ++. Mas a "Biblioteca de modelos padrão" e a "Biblioteca padrão" não são a mesma coisa.

A batalha é sobre se a atual Biblioteca Padrão deve ser chamada de "STL", no todo ou em parte, e / ou se importa como é chamada.

Para "STL"

Existe uma escola de pensamento que diz que todo mundo sabe agora que "STL" significa a biblioteca padrão, assim como todo mundo agora sabe que "C ++" é a linguagem padronizada pela ISO.

Também inclui aqueles que acreditam que isso realmente não importa , desde que todas as partes entendam o que está sendo discutido.

É um termo tornado ainda mais prevalente pela natureza da fera, muito do que faz uso pesado do recurso C ++ conhecido como "modelos".

Para "Biblioteca Padrão C ++" (ou stdlib)

No entanto, há outra escola de pensamento - na qual eu assino - que diz que isso é confuso. As pessoas que aprendem C ++ pela primeira vez não conhecem essa distinção e podem não perceber pequenas diferenças de idioma.

O autor desse artigo encontrou inúmeras vezes pessoas que acreditam que toda a biblioteca padrão do C ++ é a STL, incluindo recursos que nunca fizeram parte da própria STL. A maioria dos defensores vocais do "the STL", em contraste, sabe exatamente o que eles querem dizer com isso e se recusa a acreditar que nem todo mundo "entende". Claramente, o uso do termo não é uniforme.

Além disso, existem algumas bibliotecas semelhantes a STL que são de fato implementações da STL original, não a Biblioteca Padrão C ++. Até recentemente, o STLPort era um deles (e mesmo lá, a confusão é abundante!).

Além disso, o padrão C ++ não contém o texto "STL" em nenhum lugar e algumas pessoas costumam usar frases como "o STL está incluído na biblioteca padrão do C ++", o que é totalmente incorreto.

É minha convicção que continuar propagando o uso do termo dessa maneira apenas levará ao mal-entendido para sempre. Infelizmente, pode ser totalmente contraproducente tentar mudar as coisas, mesmo que seja para melhor. Podemos ficar presos a dois significados para sempre.

Conclusão

Compreendo que este post tenha sido um pouco tendencioso: escrevi o artigo ao qual você vinculou. :) De qualquer forma, espero que isso ajude a explicar a batalha um pouco melhor.

Atualização 13/04/2011

Aqui estão três exemplos perfeitos de alguém que está usando "o STL" para se referir a toda a biblioteca padrão do C ++. Continua me confundindo o fato de tantas pessoas jurarem que são cegas que ninguém faz isso, quando é fácil ver quase diariamente.


136
O S tandard T emplate L ibrary não só foi criado por St epanov e L ee, mas eles também estavam trabalhando no S oftware T ecnologia L aboratory no momento.
precisa saber é o seguinte

21
Alguém hoje perguntou em qual cabeçalho std::iotaestá, porque ele não conseguiu fazê-lo funcionar. É uma extensão não padrão da SGI , que eles chamam de "padrão" quando lhes convém, porque é "o STL", e todo mundo sabe que "o STL" faz parte da C ++ Standard Library, certo? E foi introduzido no C ++ 0x, mas não está disponível no C ++ 03. Grrr.
Lightness Races in Orbit

40
E MS STL é mantida por S tephan T . L avavej, também conhecido como STL.
11132 Mihaela


26
Bjarne Stroustrup diferencia especificamente o STL de outras partes da Biblioteca Padrão no "cânone", The C ++ Programming Language 4th Edition.
Codenheim

84

Não há uma resposta realmente correta. Alexander Stepanov desenvolveu uma biblioteca chamada STL (trabalhando para a HP na época). Essa biblioteca foi proposta para inclusão no padrão C ++.

Isso basicamente "bifurcou" o desenvolvimento. O comitê incluiu algumas partes, rejeitou outras completamente e redesenhou algumas (com a participação de Alexander). O desenvolvimento da biblioteca original foi posteriormente transferido para a Silicon Graphics, mas continuou separadamente da biblioteca padrão C ++.

Depois essas peças foram adicionados à biblioteca de padrão, algumas outras partes da biblioteca padr foram modificadas para melhorar o ajuste com o que foi adicionado (por exemplo, begin, end, rbegine rendforam adicionados a std::stringisso, poderia ser usado como um recipiente). Na mesma época, a maior parte da biblioteca (mesmo peças completamente não relacionadas) foi transformada em modelos para acomodar tipos diferentes (por exemplo, fluxos padrão).

Algumas pessoas também usam o STL apenas como uma forma curta de "Biblioteca Padrão".

Isso significa que quando alguém usa o termo "STL", pode estar se referindo a qualquer uma das meia dúzia de coisas diferentes. Para o bem ou para o mal, a maioria das pessoas que o usa parece ignorar a multiplicidade de significados e assume que todo mundo reconhecerá a que se refere. Isso leva a muitos mal-entendidos e pelo menos algumas sérias guerras de chamas que fizeram a maioria dos participantes parecer tola porque estavam simplesmente falando de coisas totalmente diferentes.

Infelizmente, é provável que a confusão continue inabalável. É muito mais conveniente se referir a "STL" do que algo como "os contêineres, iteradores e algoritmos na biblioteca padrão C ++, mas não incluindo std::string, mesmo que possa agir como um contêiner". Embora a "biblioteca padrão C ++" não seja tão longa e desajeitada como essa, "STL" ainda é muito mais curta e simples. Até ou a menos que alguém invente termos que sejam mais precisos (quando necessário) e igualmente convenientes, "STL" continuará a ser usado e a confusão continuará a resultar.


5
@ Jerry: O primeiro; é isso que "std" significa. :)
Lightness Races in Orbit

6
@ Jerry: Não tenho certeza de onde os namespaces entram nele. Implementações compatíveis não adicionam nada ao espaço para nome std. Eu estava falando sobre o "std" em "stdlib", que significa "padrão". Eu acho que é bem claro o que isso significa!
Leveza raças em Orbit

3
@ Jerry: Eu realmente não acho que seja exagero esperar que alguém leia o adjetivo "padrão", como "isso está no padrão". Enquanto isso, 17.4.3.1/1 é bastante claro que adicionar coisas ao namespace stdé UB, exceto em alguns casos nomeados específicos: esses casos de adição são nomeados no padrão e, portanto, ainda são perfeitamente compatíveis; "padrão" ainda se aplicaria.
Corridas do Lightness em Órbita

1
A história da SGI e da HP aqui está ao contrário. Stepanov estava na HP antes de estar na SGI.
Kragen Javier Sitaker

2
Acabei de reler os comentários aqui e pensei que valia a pena acrescentar mais um ponto (reconhecidamente menor): acho que é um pouco difícil esperar que "padrão" sempre signifique "isso está no padrão". Em particular, muitos programadores C ++ usou a frase "biblioteca padrão" muito antes de lá era um padrão. Para que não se pense que eles estavam se referindo à biblioteca no padrão C, vou apontar que o mesmo aconteceu com os programadores C muito antes de haver (até um rascunho) de um padrão C.
Jerry Coffin

52

O termo "STL" ou "Biblioteca de modelos padrão" não aparece em nenhum lugar do padrão ISO 14882 C ++. Portanto, referir-se à biblioteca padrão C ++ como STL está errado. O termo "Biblioteca Padrão C ++" ou "biblioteca padrão" é o que é oficialmente usado pela ISO 14882:

Padrão ISO 14882 C ++:

17 - Introdução à biblioteca [lib.library]:

  1. Esta cláusula descreve o conteúdo da Biblioteca Padrão C ++ , como um programa C ++ bem formado faz uso da biblioteca e como uma implementação em conformidade pode fornecer as entidades na biblioteca.

...

STL é uma biblioteca originalmente projetada por Alexander Stepanov, independente do padrão C ++. No entanto, alguns componentes da biblioteca padrão C ++ incluem componentes STL como vector, liste algoritmos como copye swap.

Mas é claro que o padrão C ++ inclui muito mais coisas fora da STL, portanto o termo "biblioteca padrão C ++" é mais correto (e é o que é realmente usado pelos documentos de padrões).


5
+1. Embora, no STL, não houvesse stdespaço para nome (IIRC).
Lightness Races em Órbita

1
Na época, a maioria dos compiladores C ++ não implementava espaços para nome. Na verdade, não sei se eles estavam no padrão.
Kragen Javier Sitaker

3
@ Kragen: Bem, não havia um padrão.
Lightness Races in Orbit

3
Oh. Bem, houve alguns livros de Stroustrup, mas suponho que não seja exatamente a mesma coisa, é?
Kragen Javier Sitaker

23

Argumentei esse mesmo argumento recentemente, mas acredito que um pouco de tolerância possa ser permitida. Se Scott Meyers cometer o mesmo erro, você estará em boa companhia.


@Tomalak & @Mark: Na verdade, Scott não, -1de mim. O livro é realmente sobre o STL no sentido de "as partes da lib std provenientes da biblioteca de Stepanov". Aproveite o tempo para examinar os livros TOC. A única coisa que encontrei fora da STL original foi std::stringe ela foi equipada para ser um contêiner completo da STL.
SBI

@sbi: Você evidentemente interpretou mal minha posição. Eu não usaria "STL" da maneira que Scott usa. Por favor, leia minha resposta.
Lightness Races em órbita

6
@Tomalak, também não usaria "STL" dessa maneira, embora eu provavelmente tenha sido culpado disso no passado. Só acho que não vale a pena espancar as pessoas.
Mark Ransom

1
Que eu possa respeitar. Fico mais irritado com as pessoas que se recusam a reconhecer a ambiguidade potencial. :)
Lightness Races in Orbit

11
Você também estaria na companhia de Bjarne Stroustrup - ref. por exemplo. stroustrup.com/DnE2005.pdf : "o STL (o "Standard Template Library", isto é, os recipientes e algoritmo quadro da biblioteca padrão ISO C ++)"
Sander De Dycker

7

Na FAQ da biblioteca C ++ padrão GNU (libstdc ++) :


A STL (Standard Template Library) foi a inspiração para grandes partes da C ++ Standard Library, mas os termos não são intercambiáveis ​​e não significam a mesma coisa. A Biblioteca Padrão C ++ inclui muitas coisas que não vieram da STL e algumas delas nem são modelos, como std::localee std::thread.

O Libstdc ++ - v3 incorpora muito código do SGI STL (a mesclagem final foi do release 3.3 ). O código no libstdc ++ contém muitas correções e alterações em comparação com o código SGI original.

Em particular, stringnão é da SGI e não faz uso de sua classe "corda" (embora isso esteja incluído como uma extensão opcional), nem é valarraynem algumas outras. Classes como vector<>eram da SGI, mas foram extensivamente modificadas.

Mais informações sobre a evolução do libstdc ++ podem ser encontradas na documentação de evolução da API e compatibilidade com versões anteriores .

O FAQ do STL da SGI ainda é uma leitura recomendada.


Para sua informação, em março de 2018, até o site oficial da STL www.sgi.com/tech/stl/ desapareceu .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.