Я отправил вопрос со своим кодом, единственной #include
директивой которого было следующее:
#include <bits/stdc++.h>
Мой учитель сказал мне сделать это, но в разделе комментариев мне сообщили, что я не должен.
Зачем?
c++
portability
turbo-c++
c++-faq
implementation-defined-behavior
Гонки легкости на орбите
источник
источник
using namespace std;
где-то версия для включения .bits/stdc++.h.gch
вместо этого включит предварительно скомпилированную версию. Он существует, потому что он должен существовать, чтобы его скомпилированная версия могла быть сгенерирована.Ответы:
Включение
<bits/stdc++.h>
, по-видимому, становится все более распространенным явлением в переполнении стека, возможно, что-то новое, добавленное в национальную учебную программу в текущем учебном году.Я предполагаю, что преимущества расплывчаты так:
#include
строкуК сожалению, это ленивый хак, который называет внутренний заголовок GCC напрямую, а не отдельными стандартными заголовками, такими как
<string>
,<iostream>
и<vector>
. Это разрушает мобильность и воспитывает ужасные привычки.К недостаткам можно отнести:
Не делай этого!
Больше информации:
Пример того, почему Quora это плохо:
источник
using namesapce std;
. Всего две строки и практически каждый красивый идентификатор используется. Невероятно неприятно видеть, что этому учат.Зачем? Потому что он используется так, как если бы он был стандартным заголовком C ++, но ни один стандарт не упоминает об этом. Таким образом, ваш код непереносим по построению. Вы не найдете никакой документации для этого на cppreference . Так что это может с таким же успехом не существовать. Это плод чьего-то воображения :)
К моему ужасу и неверию, я обнаружил, что есть хорошо известный учебный сайт, где каждый пример C ++, похоже, содержит этот заголовок . Мир безумен. Это доказательство.
Для тех, кто пишет такие "учебники"
Пожалуйста, прекратите использовать этот заголовок. Забудь об этом. Не распространяйте это безумие. Если вы не хотите понять, почему это неправильно , поверьте мне на слово. Я не в порядке, когда ко мне относятся как к авторитетной фигуре, и я, вероятно, наполовину занят этим, но я сделаю исключение только в этом одном случае. Я утверждаю, что знаю, о чем я говорю здесь. Поверь мне на слово. Я умоляю тебя.
PS Я вполне могу себе представить отвратительный «стандарт обучения», где могла возникнуть эта злая идея, и обстоятельства, которые привели к ней. Просто потому, что, казалось, есть практическая потребность в этом, это не делает его приемлемым - даже в ретроспективе.
PPS Нет, в этом не было практической необходимости. Стандартных заголовков C ++ не так много, и они хорошо документированы. Если вы учите, вы оказываете своим ученикам медвежью услугу, добавляя такую «магию». Создание программистов с магическим мышлением - это последнее, что мы хотим. Если вам нужно предложить учащимся подмножество C ++, чтобы облегчить им жизнь, просто подготовьте раздаточный материал с кратким списком заголовков, применимых к изучаемому вами курсу, и с краткой документацией для конструкций библиотеки, которые вы ожидаете использовать учениками.
источник
Существует сайт обмена стеками под названием « Программирование головоломок и код-гольф» . В головоломки программирования на этом сайте соответствуют этому определению головоломки :
Они предназначены для развлечения, а не для того, чтобы работающий программист мог быть удивлен реальной проблемой, возникающей в их повседневной работе.
Code Golf - это «тип соревнования по развлекательному компьютерному программированию, в котором участники стремятся получить максимально короткий исходный код, реализующий определенный алгоритм». В ответах на сайте PP & CG вы увидите, как люди указывают количество байтов в своих ответах. Когда они найдут способ сбрить несколько байтов, они вычеркнут исходное число и запишут новое.
Как и следовало ожидать, игра в гольф кода вознаграждает за крайнее злоупотребление языком программирования. Однобуквенные имена переменных. Нет пробелов. Творческое использование библиотечных функций. Недокументированные функции. Нестандартные практики программирования. Ужасные хаки.
Если на работе программист отправит запрос на извлечение, содержащий код в стиле гольфа, он будет отклонен. Их сотрудники смеялись бы над ними. Их менеджер заходил к их столу, чтобы поболтать. Тем не менее, программисты развлекаются, отправляя ответы в PP & CG.
С чем это связано
stdc++.h
? Как уже отмечали другие, использовать его лениво. Он не переносимый, поэтому вы не знаете, будет ли он работать на вашем компиляторе или на следующей версии вашего компилятора. Это воспитывает вредные привычки. Это нестандартно, поэтому поведение вашей программы может отличаться от ожидаемого. Это может увеличить время компиляции и размер исполняемого файла.Это все действительные и правильные возражения. Так зачем кому-то использовать это чудовище?
Оказывается, некоторые люди любят программировать головоломки без кода игры в гольф . Они собираются вместе и соревнуются на таких мероприятиях, как ACM-ICPC, Google Code Jam и Facebook Hacker Cup, или на таких сайтах, как Topcoder и Codeforces. Их рейтинг основан на правильности программы, скорости выполнения и скорости, с которой они отправляют решение. Чтобы максимизировать скорость выполнения, многие участники используют C ++. Чтобы максимизировать скорость кодирования, некоторые из них используют
stdc++.h
.Это хорошая идея? Давайте проверим список недостатков. Переносимость? Это не имеет значения, поскольку эти события кодирования используют конкретную версию компилятора, которую участники заранее знают. Соответствие стандартам? Не относится к блоку кода, срок полезного использования которого составляет менее одного часа. Время компиляции и размер исполняемого файла? Они не являются частью рубрики конкурса.
Так что у нас остались вредные привычки. Это действительное возражение. Используя этот заголовочный файл, участники избегают возможности узнать, какой стандартный заголовочный файл определяет функции, которые они используют в своей программе. Когда они пишут реальный код (и не используют
stdc++.h
), им придется тратить время на поиск этой информации, а значит, они будут менее продуктивными. Это обратная сторона практики сstdc++.h
.Это поднимает вопрос о том, почему вообще стоит участвовать в конкурентном программировании, если оно поощряет вредные привычки, такие как использование
stdc++.h
и нарушение других стандартов кодирования. Один из ответов заключается в том, что люди делают это по той же причине, по которой они публикуют программы на PP & CG: некоторые программисты находят приятным использование своих навыков кодирования в игровом контексте.Таким образом, вопрос о том, стоит ли использовать,
stdc++.h
сводится к тому, перевешивает ли скорость кодирования в конкурсе программирования перевес вредных привычек, которые можно выработать при его использовании.Этот вопрос спрашивает: «Почему я не должен включать
<bits/stdc++.h>
?» Я понимаю, что это было задано и получено ответ, чтобы сделать точку, и принятый ответ предназначен для Единого истинного ответа на этот вопрос. Но вопрос не в том, почему я не #include<bits/stdc++.h>
в рабочий код? Поэтому я считаю разумным рассмотреть другие сценарии, в которых ответ может быть другим.источник
От N4606, рабочий проект, стандарт для языка программирования C ++:
17.6.1.2 Заголовки [заголовки]
Каждый элемент стандартной библиотеки C ++ объявляется или определяется (в зависимости от ситуации) в заголовке.
Стандартная библиотека C ++ предоставляет 61 заголовок библиотеки C ++, как показано в таблице 14.
Таблица 14 - Заголовки библиотеки C ++
Там нет <bits / stdc ++. H> там. Это неудивительно, поскольку заголовки <bits / ...> являются деталями реализации и обычно содержат предупреждение:
<bits / stdc ++. h> также содержит предупреждение:
источник