跳转到内容

标准库头文件

C++23 标准库的接口由 107 个头文件组成,其中有 21 个对应 C 标准库。从 C++23 开始,你只需导入命名模块 std,即可访问整个标准库;本书中的所有示例也都是这样做的。除少数不可导入的头文件(例如 <cassert>)外,已经不再需要显式导入或包含单独的头文件。不过,如果你的编译器尚未支持 C++23 的命名模块 std,那么你仍然需要导入或包含相应的头文件。在这种情况下,往往很难记清源代码中究竟该包含哪些头文件,因此本附录按八个类别,对每个头文件中最有用的功能做了简要说明:

  • C 标准库
  • 容器
  • 算法、迭代器、范围与分配器
  • 通用工具
  • 数学工具
  • 异常
  • I/O 流
  • 线程支持库

C++ 标准库几乎完整地包含了整个 C 标准库。这些头文件与 C 中的版本大体相同,主要有以下两点区别:

  • 头文件名采用 <cname>,而不是 <name.h>
  • <cname> 头文件中声明的所有名称都位于 std 命名空间中。

下表列出了所有 C 标准库头文件,并概述了它们最常用的功能。请注意,通常建议尽量避免直接使用 C 风格功能,而在可能的情况下优先使用等价的 C++ 特性:

头文件内容
assert() 宏。
字符判定与字符处理函数,例如 isspace() 和 tolower()
定义 errno 表达式,这是一个宏,用于获取某些 C 函数最近一次错误的错误码。
支持浮点环境,例如浮点异常、舍入模式等。
与浮点算术相关的 C 风格宏定义,例如 FLT_MAX。
定义了若干可与 printf()、scanf() 及类似函数配合使用的宏。此头文件还提供了一些用于处理 intmax_t 的函数。
C 风格的范围宏定义,例如 INT_MAX。推荐改用 <limits> 中对应的 C++ 版本。
少量本地化相关的宏与函数,例如 LC_ALL 和 setlocale()。另请参见 <locale> 中的 C++ 对应功能。
数学工具,包括三角函数、sqrt()、fabs() 等。
setjmp() 和 longjmp()。在 C++ 中千万不要使用它们!
signal() 和 raise()。在 C++ 中应避免使用。
用于处理可变长度参数列表的宏和类型。
重要常量,例如 NULL;以及重要类型,例如 size_tbyte
定义若干标准整数类型,例如 int8_t、int64_t 等;还包含用于指示这些类型最小值和最大值的宏。
文件操作,包括 fopen() 和 fclose();格式化 I/O:printf()scanf() 及其系列;字符 I/O:getc()putc() 及其系列;文件定位:fseek()ftell()。推荐改用 C++ 流。(参见本附录后文的“I/O 流”一节。)
随机数 rand() 和 srand()(自 C++14 起已弃用;请改用 C++ 的 <random> 功能)。此头文件还包含 abort()exit() 函数——应尽量避免使用;C 风格内存分配函数 calloc()malloc()realloc()free();C 风格查找与排序函数 qsort()bsearch();字符串转数字函数:atof()atoi();以及一组与多字节/宽字符串处理相关的函数。
底层内存管理函数,包括 memcpy() 和 memset()。此头文件还包含 C 风格字符串函数,例如 strcpy()strcmp()
与时间相关的函数,包括 time() 和 localtime()
定义若干与 Unicode 相关的宏,以及 mbrtoc16() 等函数。
面向宽字符的字符串、内存和 I/O 函数版本。
中函数的宽字符版本:iswspace()towlower() 等。

以下 C 标准库头文件自 C++20 起已被移除:

头文件内容
仅包含
在 C 中,<iso646.h> 会定义 andor 等宏;而在 C++ 中,这些本身就是关键字,因此该头文件是空的。
与对齐相关的宏 __alignas_is_defined。
与布尔类型相关的宏 __bool_true_false_are_defined。
仅包含 <cmath>

标准库容器的定义分布在 16 个头文件中:

头文件内容
array 类模板
bitset 类模板
deque 类模板
<flat_map>flat_mapflat_multimap 类模板
<flat_set>flat_setflat_multiset 类模板
<forward_list>forward_list 类模板
list 类模板
mapmultimap 类模板
mdspan 类模板(严格来说它不是容器,而是对存储在其他位置的连续元素序列的多维视图)
queuepriority_queue 类模板
setmultiset 类模板
span 类模板(严格来说它不是容器,而是对存储在其他位置的连续元素序列的视图)
stack 类模板
<unordered_map>unordered_mapunordered_multimap 类模板
<unordered_set>unordered_setunordered_multiset 类模板
vector 类模板,以及 vector<bool> 特化

上述每个头文件都包含使用相应容器所需的全部定义,包括它们的迭代器。第 18 章“标准库容器”会对这些容器做详细介绍。

下列头文件定义了标准库中可用的算法、迭代器、分配器以及范围库:

头文件内容
标准库中大多数算法的声明,以及 min()、max()minmax()clamp()。参见 第 20 章“精通标准库算法”。
定义 endian 类枚举,参见 第 34 章“开发跨平台与跨语言应用程序”;还提供用于对位序列执行底层操作的函数声明,例如 bit_ceil()rotl()countl_zero() 等,参见 第 16 章“C++ 标准库概览”。
定义可与标准库算法配合使用的执行策略类型。参见 第 20 章
定义内建函数对象、否定器、绑定器和适配器。参见 第 19 章“函数指针、函数对象与 Lambda 表达式”。
定义 iterator_traits、迭代器标签、iteratorreverse_iterator、插入迭代器(如 back_insert_iterator)以及流迭代器。参见 第 17 章“理解迭代器与范围库”。
定义默认分配器,以及用于在容器内部处理未初始化内存的函数声明;还提供 unique_ptr、shared_ptrweak_ptrmake_unique()make_shared(),这些内容在 第 7 章“内存管理”中已有介绍。
<memory_resource>定义多态分配器和内存资源。参见 第 25 章“定制与扩展标准库”。
一些数值算法的声明:accumulate()、inner_product()partial_sum()adjacent_difference()gcd()lcm() 以及其他若干算法。参见 第 20 章
提供范围库的全部功能。参见 第 17 章
<scoped_allocator>一种可用于嵌套容器的分配器,例如由 strings 组成的 vector,或由 maps 组成的 vector

标准库在若干不同的头文件中提供了一些通用用途的工具:

头文件内容
定义 any 类。参见 第 24 章“附加词汇类型”。
定义 chars_format 枚举、from_chars()to_chars() 函数,以及相关 struct。参见 第 2 章“字符串与字符串视图”。
定义 chrono 库。参见 第 22 章“日期与时间工具”。
提供针对各种字符编码的代码转换 facet。此头文件自 C++17 起已弃用。
提供支持三路比较的类与函数。参见 第 1 章“C++ 与标准库速成导论”和 第 9 章“精通类与对象”。
提供标准 concept,例如 same_as、convertible_tointegralmovable 等。参见 第 12 章“使用模板编写泛型代码”。
定义 expectedunexpected 类模板、bad_expected_access 异常,以及 unexpect_tunexpect 标记。参见 第 24 章
定义用于操作文件系统的全部类与函数。参见 第 13 章“揭开 C++ I/O 的面纱”。
提供格式化库的全部功能,例如 format()、format_to() 等。参见 第 2 章
<initializer_list>定义 initializer_list 类模板。参见 第 1 章
定义 numeric_limits 类模板,以及针对大多数内建类型的特化。参见 第 1 章
定义 locale 类、use_facet()has_facet() 函数模板,以及各种 facet 家族。参见 第 21 章“字符串本地化与正则表达式”。
定义 bad_alloc 异常和 set_new_handler() 函数。此头文件还声明了全部六种形式的 operator newoperator delete。参见 第 15 章“重载 C++ 运算符”。
定义 optional 类模板。参见 第 1 章
定义 print()println()vprint_unicode()vprint_nonunicode() 函数。参见 第 1 章第 2 章
定义随机数生成库。参见 第 23 章“随机数工具”。
定义用于处理编译期有理数的 ratio 库。参见 第 22 章
定义正则表达式库。参见 第 21 章
<source_location>提供 source_location 类。参见 第 14 章“错误处理”。
提供 stacktrace 类。参见 第 14 章
定义 basic_string 类模板,以及类型别名 stringwstring。参见 第 2 章
<string_view>定义 basic_string_view 类模板,以及类型别名 string_viewwstring_view。参见 第 2 章
<system_error>定义错误类别和错误码。
定义 tuple 类模板,作为 pair 类模板的泛化。参见 第 24 章
<type_traits>定义用于模板元编程的类型特征。参见 第 26 章“高级模板”。
定义 type_info 的一个简单包装器,可用作关联容器中的索引类型。
定义 bad_castbad_typeid 异常;还定义 type_info 类,其对象由 typeid 运算符返回。关于 typeid 的细节,参见 第 10 章“深入继承技巧”。
定义 pair 类模板和 make_pair()(参见 第 1 章)。此头文件还定义了 swap()exchange()move()as_const() 等实用函数。
定义 variant 类模板。参见 第 24 章
提供与你所使用的 C++ 标准库实现相关的信息,并公开全部标准库特性测试宏。参见 第 16 章

C++ 为数值处理提供了一些设施。本书不会对这些能力做详细讲解;如需进一步了解,请参考 附录 B“带注释的参考书目”中列出的标准库参考资料:

头文件内容
定义用于处理复数的 complex 类模板。
提供若干数学常量,例如 pi、philog2e 等。
提供定宽浮点类型 float16_tfloat32_tfloat64_tfloat128_tbfloat16_t。参见 第 1 章
定义 valarray 以及相关类和类模板,用于处理数学向量与矩阵。

异常内容见 第 14 章。两个头文件提供了大部分所需定义,不过某些特定领域的异常则定义在该领域对应的头文件中:

头文件内容
定义 exceptionbad_exception 类,以及 set_terminate()uncaught_exceptions() 函数。
定义未在 中声明的、与具体领域无关的异常。

下表列出了 C++ 中所有与 I/O 流相关的头文件。不过通常来说,你的应用程序只需要包含 <fstream><iomanip><iostream><istream><ostream><sstream>。详情请参见 第 13 章

头文件内容
定义 basic_filebufbasic_ifstreambasic_ofstreambasic_fstream 类。此头文件声明了 filebufwfilebufifstreamwifstreamofstreamwofstreamfstreamwfstream 类型别名。
声明未在其他地方声明的 I/O 操纵符(大多定义于 中)。
定义 ios_basebasic_ios 类。此头文件声明了大多数流操纵符。你很少需要直接包含该头文件。
前向声明其他 I/O 流头文件中的模板和类型别名。你通常很少需要直接包含该头文件。
声明 cin、coutcerrclog 及其宽字符对应版本。包含 <istream><ostream><streambuf><ios>。注意,它并不只是 <istream><ostream> 的简单组合。
定义 basic_istreambasic_iostream 类。此头文件声明了 istreamwistreamiostreamwiostream 类型别名。
定义 basic_ostream 类。此头文件声明了 ostreamwostream 类型别名。
定义 basic_spanbufbasic_ispanstreambasic_ospanstreambasic_spanstream 类。此头文件声明了 spanbufwspanbufispanstreamwispanstreamospanstreamwospanstreamspanstreamwspanstream 类型别名。
定义 basic_stringbufbasic_istringstreambasic_ostringstreambasic_stringstream 类。此头文件声明了 stringbufwstringbufistringstreamwistringstreamostringstreamwostringstreamstringstreamwstringstream 类型别名。
定义 basic_streambuf 类。此头文件声明了 streambufwstreambuf 类型别名。你很少需要直接包含该头文件。
已弃用。
定义与同步输出流相关的全部类,例如 osyncstream 和 wosyncstream。参见 第 27 章“使用 C++ 进行多线程编程”。

C++ 包含一个线程支持库,使你能够编写与平台无关的多线程应用程序。详情请参见 第 27 章。线程支持库由下列头文件组成:

头文件内容
定义原子类型 atomic 以及原子操作。
定义 barrier 类。
<condition_variable>定义 condition_variablecondition_variable_any 类。
定义编写协程所需的全部功能。
定义 future、promisepackaged_taskasync()
定义可等待类 generator
定义 latch 类。
定义 call_once() 以及各种非共享互斥量和锁类。
定义 counting_semaphorebinary_semaphore 类。
<shared_mutex>定义 shared_mutexshared_timed_mutexshared_lock 类。
<stop_token>定义 stop_tokenstop_sourcestop_callback 类。
定义 threadjthread 类,以及 yield()get_id()sleep_for()sleep_until() 函数。