it-swarm-pt.tech

Como o #include <bits / stdc ++. H> funciona em C ++?

Eu li de um blog codeforces que, se #include <bits/stdc++.h> em um programa C++, não há necessidade de incluir outros arquivos de cabeçalho. como o #include <bits/stdc++.h> funciona e é aceitável usá-lo em vez de incluir arquivos de cabeçalho individuais?

99
JerryGoyal

É basicamente um arquivo de cabeçalho que também inclui todas as bibliotecas padrão e arquivos de inclusão stl. O único propósito que posso ver para isso seria para testes e educação.

Se, e. fonte GCC 4.8.0 /bits/stdc++.h .

Usá-lo incluiria muitas coisas desnecessárias e aumentaria o tempo de compilação.

Edit: Como Neil diz, é uma implementação de cabeçalhos pré-compilados. Se você configurá-lo para pré-compilação corretamente, ele pode, de fato, acelerar o tempo de compilação, dependendo do seu projeto. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )

No entanto, sugiro que você reserve um tempo para aprender sobre cada um dos cabeçalhos sl/stl e inclua-os separadamente e não use "superheaders", exceto para fins de pré-compilação.

97
Zelix

#include <bits/stdc++.h> é um arquivo de implementação para um cabeçalho pré-compilado.

Da perspectiva da engenharia de software, é uma boa ideia minimizar a inclusão. Se você usá-lo, na verdade, inclui muitos arquivos, que seu programa pode não precisar, aumentando assim o tempo de compilação e o tamanho do programa desnecessariamente. [edit: como apontado pelo @Swordfish nos comentários que o tamanho do programa de saída permanece inalterado. Mas ainda assim, é uma boa prática incluir apenas as bibliotecas que você realmente precisa, a menos que seja uma competição competitiva.]

Mas nos concursos, usar esse arquivo é uma boa ideia, quando você quer reduzir o tempo gasto em tarefas domésticas; especialmente quando sua classificação é sensível ao tempo.

Funciona na maioria dos juízes online, em ambientes de concursos de programação, incluindo ACM-ICPC (Sub-Regionais, Regionais e Finais Mundiais) e em muitos juízes online.

As desvantagens disso são que

  • aumenta o tempo de compilação.
  • usa um arquivo de cabeçalho não-padrão interno da biblioteca GNU C++ e, portanto, não compilará em MSVC, XCode e muitos outros compiladores
30
abe312

Esse arquivo de cabeçalho não faz parte do padrão C++, portanto, não é portátil e deve ser evitado.

Além disso, mesmo se houvesse algum cabeçalho no padrão, você iria querer evitá-lo em vez de cabeçalhos específicos, já que o compilador tem que realmente ler e analisar cada cabeçalho incluído (incluindo cabeçalhos recursivamente incluídos) toda vez que unidade de tradução é compilada.

23
Robert Allan Hennigan Leahy

É basicamente um arquivo de cabeçalho que inclui todas as bibliotecas padrão. Em concursos de programação, usar esse arquivo é uma boa ideia, quando você deseja reduzir o tempo gasto em tarefas domésticas; especialmente quando sua classificação é sensível ao tempo. Em concursos de programação, as pessoas se concentram mais em encontrar algoritmos para resolver um problema do que em engenharia de software. Da perspectiva da engenharia de software, é uma boa ideia minimizar a inclusão. Se você usá-lo, na verdade, inclui muitos arquivos, que seu programa pode não precisar, aumenta o tempo de compilação e o tamanho do programa desnecessariamente.

visite isto para mais detalhes https://www.geeksforgeeks.org/bitsstdc-h-c/

isso é melhor coisa para codificação on-line onde rank importa muito

3
Vivek Ghanchi

Infelizmente essa abordagem não é portátil C++ (até agora).

Todos os nomes padrão estão no namespace std e além disso você não pode saber quais nomes são NÃO definidos por inclusão e cabeçalho (em outras palavras, é perfeitamente legal que uma implementação declare o nome std::string direta ou indiretamente ao usar #include <vector>).

Apesar disso, você é obrigado pela linguagem a saber e dizer ao compilador qual cabeçalho padrão inclui qual parte da biblioteca padrão. Esta é uma fonte de bugs de portabilidade, porque se você esquecer por exemplo #include <map> mas usar std::map é possível que o programa compile de qualquer maneira silenciosamente e sem avisos em uma versão específica de um compilador específico, e você pode obter erros somente mais tarde ao portar para outro compilador ou versão.

Na minha opinião, não há desculpas técnicas válidas porque isso é necessário para o usuário geral: o binário do compilador pode ter todo o namespace padrão embutido e isso pode realmente aumentar o desempenho ainda mais do que cabeçalhos pré-compilados (por exemplo, usando hashing perfeito para pesquisas, removendo padrões cabeçalhos de análise ou carregamento/demarshalling e assim por diante).

O uso de cabeçalhos padrão simplifica a vida de quem constrói compiladores ou bibliotecas padrão e isso é tudo. Não é algo para ajudar os usuários.

No entanto, esta é a maneira como a linguagem é definida e você precisa saber qual cabeçalho define quais nomes planejam para que alguns neurônios extras sejam queimados em configurações sem sentido para lembrar (ou tente encontrar e IDE que adiciona automaticamente os cabeçalhos padrão que você usa e remove os que você não usa ... uma alternativa razoável).

1
6502

É basicamente um arquivo de cabeçalho que inclui todas as bibliotecas padrão.
Em concursos de programação, usar este arquivo é uma boa idéia, quando você quer reduzir o tempo desperdiçado em tarefas domésticas; especialmente quando sua classificação é sensível ao tempo.
Em concursos de programação, as pessoas se concentram mais em encontrar um algoritmo para resolver um problema do que em engenharia de software.
Mas em engenharia de software perspectiva, não é uma boa ideia usar. Se você usá-lo, na verdade, inclui muitos arquivos, que seu programa pode não precisar, aumentando assim o tempo de compilação e o tamanho do programa desnecessariamente.

1
Linkon