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.