C++ - 标准库
本文是阅读 Professional C++, third edition 中文版1的读书笔记.
C++标准库的核心是泛型容器和泛型算法. 包括标准模板库(Standard Template Library, STL).
所有标准库类和函数都在 std
名称空间中声明. 包括如下组件:
- 字符串
- 定义在头文件
<string>
中的string
类. - 正则表达式
- 定义在头文件
<regex>
. - I/O流
- 定义在头文件
<fstream>
,<iomanip>
,<ios>
,<iosfwd>
,<iostream>
,<istream>
,<ostream>
,<sstream>
,<streambuf>
和<strstream>
中. - 智能指针
- 定义在头文件
<memory>
中的unique_ptr
,shared_ptr
,weak_ptr
. - 异常
- 定义在头文件
<exception>
,<stdexcept>
和<system_error>
. - 数学工具
- 定义在头文件
<complex>
中的复数类complex
. - 定义在头文件
<ratio>
中的有理数运算库. - 定义在头文件
<valarray>
中的valarray
类(与vector
类类似, 但是对高性能数值应用做了特别的优化). - 定义在头文件
<limits>
中的numeric_limits
类模板, 如numeric_limits<int>::max()
numeric_limits<int>::min()
numeric_limits<int>::lowest()
numeric_limits<double>::max()
numeric_limits<double>::min()
numeric_limits<double>::lowest()
- 定义在头文件
- 时间工具
- 定义在头文件
<chrono>
中的Chrono
库. - 随机数
- 定义在头文件
<random>
中的随机数库. - 初始化列表
- 定义在头文件
<initializer_list>
中的初始化列表(用于编写参数数目可变的函数). Pair
- 定义在头文件
<utility>
中的pair
模板, 用于存储两种不同类型的元素. 这称为存储异构元素. 每个值的类型都应该在编译时确定. C++14添加了一个功能, 允许根据类型使用std::get<T>()
从tuple中提取元素, 其中T是要提取的元素的类型(而不是索引). 创建tuple的另一种方法是使用std::make_tuple()
工具函数. 这个函数只需要实际值, 在编译时会自动推导出类型(所以不能通过&
来指定引用). 如果需要通过make_tuple()
生成一个包含引用或常量引用的tuple, 那么需要分别使用定义在头文件<functional>
中的ref()
和cref()
. 通过std::tuple_cat()
可将两个tuple串联为一个tuple. Tuple
- 定义在头文件
<tuple>
中的tuple
是pair
的一种泛化, 它是固定大小的序列, 元组的元素可以是异构的, 其实例化的元素数目和类型在编译时固定不变. - 函数对象
- 实现了函数调用运算符的类的对象称为函数对象. 函数对象可以用作某些STL算法的谓词. 头文件
<functional>
定义了一些预定义的函数对象, 支持根据已有的函数对象创建新函数对象. - 多线程
- 单个线程可以用头文件
<thread>
中的thread
类创建. - 定义在头文件
<atomic>
中的原子性提供了对一段数据的线程安全的原子访问. <condition_variable>
和<mutex>
提供了其他线程同步机制.- 如果只需计算某个数据得到结果, 并具有相应的异常处理, 使用定义在头文件
<future>
中的async
和future
要比直接使用thread
类更容易.
- 单个线程可以用头文件
- 类型特质
- 定义在头文件
<type_traits>
中的类型特质提供了编译期间的类型信息. 编写高级模板时可以使用它.
Footnotes:
1
Marc Gregoire著, 张永强译. C++高级编程(第3版), 清华大学出版社, 2015.