标准库头文件
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_t 和 byte。 | |
定义若干标准整数类型,例如 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> 会定义 and、or 等宏;而在 C++ 中,这些本身就是关键字,因此该头文件是空的。 | |
| 与对齐相关的宏 __alignas_is_defined。 | |
| 与布尔类型相关的宏 __bool_true_false_are_defined。 | |
仅包含 <cmath>。 |
标准库容器的定义分布在 16 个头文件中:
| 头文件 | 内容 |
|---|---|
array 类模板 | |
bitset 类模板 | |
deque 类模板 | |
flat_map 和 flat_multimap 类模板 | |
flat_set 和 flat_multiset 类模板 | |
| <forward_list> | forward_list 类模板 |
list 类模板 | |
map 和 multimap 类模板 | |
mdspan 类模板(严格来说它不是容器,而是对存储在其他位置的连续元素序列的多维视图) | |
queue 和 priority_queue 类模板 | |
set 和 multiset 类模板 | |
span 类模板(严格来说它不是容器,而是对存储在其他位置的连续元素序列的视图) | |
stack 类模板 | |
| <unordered_map> | unordered_map 和 unordered_multimap 类模板 |
| <unordered_set> | unordered_set 和 unordered_multiset 类模板 |
vector 类模板,以及 vector<bool> 特化 |
上述每个头文件都包含使用相应容器所需的全部定义,包括它们的迭代器。第 18 章“标准库容器”会对这些容器做详细介绍。
算法、迭代器、范围与分配器
Section titled “算法、迭代器、范围与分配器”下列头文件定义了标准库中可用的算法、迭代器、分配器以及范围库:
| 头文件 | 内容 |
|---|---|
标准库中大多数算法的声明,以及 min()、max()、minmax() 和 clamp()。参见 第 20 章“精通标准库算法”。 | |
定义 endian 类枚举,参见 第 34 章“开发跨平台与跨语言应用程序”;还提供用于对位序列执行底层操作的函数声明,例如 bit_ceil()、rotl()、countl_zero() 等,参见 第 16 章“C++ 标准库概览”。 | |
| 定义可与标准库算法配合使用的执行策略类型。参见 第 20 章。 | |
| 定义内建函数对象、否定器、绑定器和适配器。参见 第 19 章“函数指针、函数对象与 Lambda 表达式”。 | |
定义 iterator_traits、迭代器标签、iterator、reverse_iterator、插入迭代器(如 back_insert_iterator)以及流迭代器。参见 第 17 章“理解迭代器与范围库”。 | |
定义默认分配器,以及用于在容器内部处理未初始化内存的函数声明;还提供 unique_ptr、shared_ptr、weak_ptr、make_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_to、integral、movable 等。参见 第 12 章“使用模板编写泛型代码”。 | |
定义 expected 和 unexpected 类模板、bad_expected_access 异常,以及 unexpect_t 和 unexpect 标记。参见 第 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 new 和 operator 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 类模板,以及类型别名 string 和 wstring。参见 第 2 章。 | |
| <string_view> | 定义 basic_string_view 类模板,以及类型别名 string_view 和 wstring_view。参见 第 2 章。 |
| <system_error> | 定义错误类别和错误码。 |
定义 tuple 类模板,作为 pair 类模板的泛化。参见 第 24 章。 | |
| <type_traits> | 定义用于模板元编程的类型特征。参见 第 26 章“高级模板”。 |
定义 type_info 的一个简单包装器,可用作关联容器中的索引类型。 | |
定义 bad_cast 和 bad_typeid 异常;还定义 type_info 类,其对象由 typeid 运算符返回。关于 typeid 的细节,参见 第 10 章“深入继承技巧”。 | |
定义 pair 类模板和 make_pair()(参见 第 1 章)。此头文件还定义了 swap()、exchange()、move()、as_const() 等实用函数。 | |
定义 variant 类模板。参见 第 24 章。 | |
| 提供与你所使用的 C++ 标准库实现相关的信息,并公开全部标准库特性测试宏。参见 第 16 章。 |
C++ 为数值处理提供了一些设施。本书不会对这些能力做详细讲解;如需进一步了解,请参考 附录 B“带注释的参考书目”中列出的标准库参考资料:
| 头文件 | 内容 |
|---|---|
定义用于处理复数的 complex 类模板。 | |
提供若干数学常量,例如 pi、phi、log2e 等。 | |
提供定宽浮点类型 float16_t、float32_t、float64_t、float128_t 和 bfloat16_t。参见 第 1 章。 | |
| 定义 valarray 以及相关类和类模板,用于处理数学向量与矩阵。 |
异常内容见 第 14 章。两个头文件提供了大部分所需定义,不过某些特定领域的异常则定义在该领域对应的头文件中:
| 头文件 | 内容 |
|---|---|
定义 exception 和 bad_exception 类,以及 set_terminate() 和 uncaught_exceptions() 函数。 | |
| 定义未在 |
下表列出了 C++ 中所有与 I/O 流相关的头文件。不过通常来说,你的应用程序只需要包含 <fstream>、<iomanip>、<iostream>、<istream>、<ostream> 和 <sstream>。详情请参见 第 13 章:
| 头文件 | 内容 |
|---|---|
定义 basic_filebuf、basic_ifstream、basic_ofstream 和 basic_fstream 类。此头文件声明了 filebuf、wfilebuf、ifstream、wifstream、ofstream、wofstream、fstream 和 wfstream 类型别名。 | |
| 声明未在其他地方声明的 I/O 操纵符(大多定义于 | |
定义 ios_base 和 basic_ios 类。此头文件声明了大多数流操纵符。你很少需要直接包含该头文件。 | |
| 前向声明其他 I/O 流头文件中的模板和类型别名。你通常很少需要直接包含该头文件。 | |
声明 cin、cout、cerr、clog 及其宽字符对应版本。包含 <istream>、<ostream>、<streambuf> 和 <ios>。注意,它并不只是 <istream> 与 <ostream> 的简单组合。 | |
定义 basic_istream 和 basic_iostream 类。此头文件声明了 istream、wistream、iostream 和 wiostream 类型别名。 | |
定义 basic_ostream 类。此头文件声明了 ostream 和 wostream 类型别名。 | |
定义 basic_spanbuf、basic_ispanstream、basic_ospanstream 和 basic_spanstream 类。此头文件声明了 spanbuf、wspanbuf、ispanstream、wispanstream、ospanstream、wospanstream、spanstream 和 wspanstream 类型别名。 | |
定义 basic_stringbuf、basic_istringstream、basic_ostringstream 和 basic_stringstream 类。此头文件声明了 stringbuf、wstringbuf、istringstream、wistringstream、ostringstream、wostringstream、stringstream 和 wstringstream 类型别名。 | |
定义 basic_streambuf 类。此头文件声明了 streambuf 和 wstreambuf 类型别名。你很少需要直接包含该头文件。 | |
| 已弃用。 | |
定义与同步输出流相关的全部类,例如 osyncstream 和 wosyncstream。参见 第 27 章“使用 C++ 进行多线程编程”。 |
C++ 包含一个线程支持库,使你能够编写与平台无关的多线程应用程序。详情请参见 第 27 章。线程支持库由下列头文件组成:
| 头文件 | 内容 |
|---|---|
| 定义原子类型 atomic | |
定义 barrier 类。 | |
| <condition_variable> | 定义 condition_variable 和 condition_variable_any 类。 |
| 定义编写协程所需的全部功能。 | |
定义 future、promise、packaged_task 和 async()。 | |
定义可等待类 generator。 | |
定义 latch 类。 | |
| 定义 call_once() 以及各种非共享互斥量和锁类。 | |
定义 counting_semaphore 和 binary_semaphore 类。 | |
| <shared_mutex> | 定义 shared_mutex、shared_timed_mutex 和 shared_lock 类。 |
| <stop_token> | 定义 stop_token、stop_source 和 stop_callback 类。 |
定义 thread 和 jthread 类,以及 yield()、get_id()、sleep_for() 和 sleep_until() 函数。 |