我用我的代码发布了一个问题,其中唯一的#include指令如下:
#include <bits/stdc++.h>
我的老师告诉我这样做,但在评论区我被告知我不应该这样做。
Why?
我用我的代码发布了一个问题,其中唯一的#include指令如下:
#include <bits/stdc++.h>
我的老师告诉我这样做,但在评论区我被告知我不应该这样做。
Why?
当前回答
来自N4606,标准编程语言c++工作草案:
17.6.1.2报头信息[Headers]
c++标准库的每个元素都在头文件中声明或定义(视情况而定)。 c++标准库提供了61个c++库头文件,如表14所示。
表14 - c++库头文件
<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>
这里没有<bits/stdc++.h>。这并不奇怪,因为<bits/…>头是实现细节,通常带有一个警告:
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly.
<bits/stdc++.h>还带有一个警告:
* This is an implementation file for a precompiled header.
其他回答
对我来说最大的问题是包含这个头文件将无法编译。因此,如果它在那里,我将不得不删除它,尝试编译,并添加所需的标准头文件。
来自N4606,标准编程语言c++工作草案:
17.6.1.2报头信息[Headers]
c++标准库的每个元素都在头文件中声明或定义(视情况而定)。 c++标准库提供了61个c++库头文件,如表14所示。
表14 - c++库头文件
<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>
这里没有<bits/stdc++.h>。这并不奇怪,因为<bits/…>头是实现细节,通常带有一个警告:
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly.
<bits/stdc++.h>还带有一个警告:
* This is an implementation file for a precompiled header.
如果你的老师是一个ICPC老师,那么他/她是对的,但如果你的老师是一个软件工程老师,他/她可能不是。 两者各有利弊:
使用它可以节省编码时间,但会增加编译时间。 由于它包含大量名称空间,您可能会意外地遇到难以调试的问题。
我们不使用的原因:
#include <bits/stdc++.h>
是因为效率。 让我打个比方: 了解Java的同学: 如果你问你的教练下面的建议是不是一个好主意,除非他们是一个糟糕的教练,否则他们会说不:
import java.*.*
# include……事情基本上是一样的…这不是不使用它的唯一原因,但它是不使用它的主要原因之一。 打个现实生活的比方: 假设你有一个图书馆,你想从图书馆借几本书,你会把整个图书馆搬到你家旁边吗?这既昂贵又低效。如果你只需要5本书,那就只拿5本……不是整个图书馆.....
#include <bits/stdc++.h>
看起来很方便的程序看,我只需要输入一个包含语句,它工作,同样的事情,移动整个图书馆,看,我只需要移动整个图书馆,而不是5本书,一个接一个。对你来说看起来很方便,对真正需要搬家的人来说??没有那么多,你猜怎么着,在c++中,做移动的人将是你的电脑……计算机不会喜欢为您编写的每个源文件移动整个库:).....
包含<bits/stdc++.h>似乎是Stack Overflow上越来越常见的东西,也许是本学年新添加到国家课程中的东西。
我想好处大概是这样给出的:
你只需要写一个#include行。 您不需要查找所有内容都在哪个标准标头中。
不幸的是,这是一个懒惰的hack,直接命名GCC内部头,而不是单个标准头,如<string>, <iostream>和<vector>。它破坏了可移植性,养成了糟糕的习惯。
缺点包括:
它可能只在那个编译器上工作。 当你使用它时,你不知道它会做什么,因为它的内容并不是由标准设置的。 即使只是将编译器升级到它自己的下一个版本也可能破坏您的程序。 每个标准标头都必须与源代码一起解析和编译,这很慢,在某些编译设置下会导致大量可执行文件。
不要这样做!
更多信息:
#include <bits/stdc++.h> with visual studio未编译 #include <bits/stdc++.h>如何在c++中工作?
Quora为什么不好的例子:
在编程比赛中使用#include <bits/stdc++.h>而不是列出很多include是一个很好的实践吗?