1. C++标准库
C++提供了很多库:
- 标准 ANSI C 库都可以移植到 C++中。不同于 ANSI C 库的是,C++中需要在库名前加上"c"前缀,而且去掉".h",例如
<cmath>对应于 C 语言就是<math.h>,<cstdlib>对应于 C 语言的<stlib.h> - C++新增的库,例如
<iostream>,<iomanip>,<string>,<fstream>,<sstream> - C++STL:包括容器,迭代器,算法和函数对象
- Boost C++库
1.1 C 库和相关头文件
<cstring>:待会解释<cmath>:数学计算相关的库<cstdlib>:通用工具,例如异常(abort, exit, EXIT_SUCCESS, EXIT_FAILURE);环境相关(getenv);动态内存管理(malloc, free, calloc, realloc),字符解析(atoi, atof, atol, strtod), 伪随机序列生成(rand, srand, RAND_MAX);数组搜索和排序(bsearch, qsort)<cctype>:字符类型检测(isalpha, isdigit, isalnum, isspace, isupper, islower, isblank, iscntrl, isgraph, isprint, ispunct, isxdigit)和字符转换(toupper, tolower)<climits>,<cfloat>:Size and limit of integer types (INT_MAX, INT_MIN, UINT_MAX, CHAR_BIT; and SHRT_XXX for short, LONG_XXX for long, LLONG_XXX for long long, CHAR_XXX for char) and floating-point types (DBL_MIN, DBL_MAX, DBL_DIG, DBL_MIN_EXP, DBL_MAX_EXP; and FLT_XXX for float, LDBL_XXX for long double)<ctime>:time, difftime, clock, gmttime, localtime, and etc.<cstdio>: C’s IO operations (scanf, printf, fscanf, fprintf, fopen, fclose, etc)<cassert>,<cerrno>,csignal>: 断言和错误<clocale>:本地化<cstdbool>,<cstdint>,<cstddef>,<cstdarg>:<cuchar>,<cwchar>,<cwcchar>: Unicode 字符
1.2 C++库和相关头文件
<ios>, <iostream>, <istream>, <ostream>, <fstream>, <sstream><iomanip><string><regex><random><limits><stdexception>, <exception><complex>, <tuple>, <valarry><locale><typeinfo><chrono>- 其它:
<codecvt>, <new>, <ratio>, <system_error>, <type_traits>
1.3 C++ STL 和相关头文件
STL 主要由以下头文件提供:
<vector>, <list>, <deque>, <queue>, <stack>, <map>, <set>, <bitset>, <forward_list> (C++11), <unordered_map> (C++11), <unordered_set> (C++11), <array> (C++11):容器和数据结构模板类<iterator>:迭代器<algorithm>, <numeric>, <functional>, <utility>:算法和函数对象<initializer_list> (C++11), <memroy> (C++11)
1.4 Boost C++库
- TODO
2. C++ STL
2.1 初探 C++ STL 中的 vector 类
示例 1:构造vector<>和访问元素
| |
特别说明:
size 是当前 vector 容器真实占用的大小,也就是容器当前拥有多少个容器。
capacity 是指在发生 realloc 前能允许的最大元素数,即预分配的内存空间。
示例 2:使用push_back()和pop_back()来添加和删除元素
| |
示例 3:使用iterator来访问容器元素
| |
说明:
- 每一种容器类都有其对应的迭代器
vector的begin()和end()成员函数分别返回一个指向集合第一个元素的iterator和指向最后一个元素后的iterator- Iterator 很像指针,可以使用
*iter来访问元素,++iter来移动到下一个元素 insert(iter, item),在当前 iter 元素前插入 item,insert(iter, n , item),在当前 iter 前插入 n 个 itemerase(first, last),删除区间$[first, last)$中的所有元素- 在 C++11 中可以使用
auto来作为 iterator 的类型,从而告诉编译器自动匹配类型:
| |
- C++引入了一种 for-each 循环
| |
2.2 vector 模板类
Constructor
| |
Size and Capacity
| |
Accessing Element
| |
Modifying Contents
| |
Non-member Friend Functions
| |
Iterator
| |
Iterator-based Operations
| |
2.3 容器
顺序型容器,关联型容器和容器适配器
STL 提供了以下几种类型的容器:
顺序型容器:元素是线性结构组织的
- vector: dynamically resizable array.
- deque: double-ended queue.
- list: double-linked list.
关联型容器:存储 key-value 对的非线性结构
- set: 没有重复元素,支持快速查找
- multiset: 允许重复元素,支持快速查找
- map: 一对一隐射(关联数组),没有重复元素,支持快速 key 查找
- multimap: 一对一隐射,允许有重复元素,支持快速 key 值查找
容器适配器类:
- Stack: 后进先出
- queue: 先进先出
- priority_queue: 高优先级的位于队列前面