## [1]一.C++內置順序容器
| 容器類型 | 位置 | 名稱 | 訪問 | 頭部插入 | 尾部插入 | 中部插入 | 存儲結構 |
| -------------------- | ---------------- | -------------- | ------------ | -------- | -------- | -------- | ------------------------------ |
| `vector` | `<vector>` | 向量 | 快速隨機訪問 | 慢 | 快 | 慢 | 動態數組 |
| `deque` | `<deque>` | 雙端隊列 | 快速隨機訪問 | 快 | 快 | 慢 | 通過指針數組連接的多個動態數組 |
| `list` | `<list>` | 雙向鏈表 | 雙向順序訪問 | 快 | 快 | 快 | 雙向鏈表 |
| [11+] `forward_list` | `<forward_list>` | 單向鏈表 | 單向順序訪問 | 快 | 快 | 快 | 雙向鏈表 |
| [11+] `array` | `<array>` | 固定大小的數組 | 快速隨機訪問 | 不支持 | 不支持 | 不支持 | 數組 |
| `string` | `<string>` | 字符串 | 快速隨機訪問 | 慢 | 快 | 慢 | 動態數組 |
## [$]二.順序容器選擇原則
1. 一般使用 `vector`.
2. 如果你的程序有很多小的元素,且空間的額外開銷很重要,則不要使用 `list` 或 `forward list` 。
3. 如果程序要求隨機訪問元素,應使用 `vector` 或 `deque` .
4. 如果程序要求在容器的中間插入或刪除元素,應使用 `list` 或 `forward_list`.
5. 如果程序需要在頭尾位置插入或刪除元素,但不會在中間位置進行插入或刪除操作,則使用 `deque`。
## [$]三.順序容器的特色操作
### 1.插入操作
+ 插入操作會使迭代器失效。
+ 將元素插入到 `vector` 、`deque` 和 `string` 中的任何位置可能會耗費較多時間。
+ C++11之前, `insert` 函數的返回值為 `void` 。
| 函數 | 不適用容器 | 含義 |
| ------------------------------------------------ | -------------- | ------------------------------------------------------ |
| `void c.push_back(const T &el);` | `forward_list`、`array` | 在末尾插入元素。 |
| [11+]`void c.emplace_back(const T &el1,const T &el2,...);` | `forward_list`、`array` | 在末尾插入多個元素。 |
| `void c.push_front(const T &el);` | `array`、`vector`、`string` | 在頭部插入元素。 |
| [11+]`void c.emplace_front(const T &el1,const T &el2,...);` | `array`、`vector`、`string` | 在頭部插入多個元素。 |
| `c.insert(p,const T &el);`| `array` | 在迭代器 `p` 指向的元素之前插入一個元素。返回指向新添加的元素的迭代器。 |
| `c.insert(p,size_type n,const T &el);`| `array` | 在迭代器 `p` 指向的元素之前插入`n`個元素,每個元素的值為 `t`。返回指向新添加的元素的迭代器。 |
| `c.insert(p,b,e);`| `array` | 在迭代器 `p` 指向的元素之前插入`b` 和 `e`之間的元素。`b`和`e`不能指向`c`中的元素。 |
| [11+]`c.insert(p,{a,b,c,...});`| `array` | 在迭代器 `p` 指向的元素之前插入花括號中的元素。返回指向新添加的元素的迭代器。 |
| [11+]`c.emplace(p,const T &el1,const T &el2,...);`| `array` | 在迭代器 `p` 指向的元素之前插入多個元素。返回指向新添加的元素的迭代器。 |
### 2.訪問操作
+ 只有 `at` 越界訪問時,才會拋出 `out_ of_ range` 的異常。
| 函數或語句| 不適用容器 | 含義|
| ------------------------------------------------ | -------------- | ------------------------------------------------------ |
| `c.at(n);` | `forward_list`、`list` | 返回下標為 `n`的元素的引用。|
| `c[n];` | `forward_list`、`list` | 返回下標為 `n`的元素的引用。|
| `c.back();` | `forward_list` | 返回尾元素的引用。|
| `c.front();` | 無 | 返回首元素的引用。|
### 3.刪除操作
+ 刪除操作會使迭代器失效。
+ 刪除一個指向不存在的元素的迭代器是未定義的。
+ 刪除空容器中的元素是未定義的。
| 函數 | 不適用容器 | 含義 |
| ------------------------------------------------ | -------------- | ------------------------------------------------------ |
| `void c.pop_back(const T &el);` | `forward_list`、`array` | 刪除末尾元素。 |
| `void c.pop_front(const T &el);` | `array`、`vector`、`string` | 刪除第一個元素。 |
| `c.erase(p);`| `forward_list`、`array` | 刪除迭代器 `p` 指向的元素。返回下一個元素的迭代器。 |
| `c.erase(b,e);`| `forward_list`、`array` | 刪除迭代器 [`b`,`e`] 之間的元素。返回下一個元素的迭代器。 |
- 閱讀說明
- 1.1 概述
- C++基礎
- 1.2 變量與常量
- 1.2.1 變量
- 1.2.2 字面值常量
- 字符型常量
- 數值型常量
- 1.2.3 cv限定符
- 1.3 作用域
- 1.3.1 標識符
- 1.3.2 *命名空間
- 1.3.3 作用域
- 1.3.4 可見性
- 1.4 數據類型
- 1.4.1 概述
- 1.4.2 處理類型
- 類型別名
- * auto說明符
- * decltype說明符
- 1.4.3 數組
- 1.4.4 指針
- 1.4.5 引用
- 1.5 表達式
- 1.5.1 概述
- 1.5.2 值的類別
- 1.5.3 *初始化
- 1.5.4 運算符
- 算術運算符
- 邏輯和關系運算符
- 賦值運算符
- 遞增遞減運算符
- 成員訪問運算符
- 位運算符
- 其他運算符
- 1.5.5 *常量表達式
- 1.5.6 類型轉換
- 第2章 面向過程編程
- 2.1 流程語句
- 2.1.1 條件語句
- 2.1.2 循環語句
- 2.1.3 跳轉語句
- 2.1.4 *異常處理
- 2.2 函數
- 2.2.1 概述
- 2.2.2 函數參數
- 2.2.3 內置函數
- 2.2.4 函數重載
- 2.2.5 * 匿名函數
- 2.3 存儲和生命期
- 2.3.1 生命周期與存儲區域
- 2.3.2 動態內存
- 2.4 *預處理命令
- 第3章 面向對象編程
- 3.1 概述
- 3.2 類和對象
- 3.3 成員
- 3.3.1 訪問限制
- 3.3.2 常成員
- 3.3.3 靜態成員
- 3.3.4 成員指針
- 3.3.5 this指針
- 3.4 特殊的成員函數
- 3.4.1 概述
- 3.4.2 構造函數
- 3.4.3 析構函數
- 3.4.4 拷貝語義
- 3.4.5 * 移動語義
- 3.5 友元
- 3.6 運算符重載與類型轉換
- 3.6.1 概述
- 3.6.2 重載方法
- 3.6.3 類型轉換
- 3.7 繼承與多態性
- 3.7.1 概述
- 3.7.2 派生類
- 3.7.3 子類型
- 3.7.4 虛基類
- 3.7.5 虛函數
- 3.7.6 抽象類
- 3.8 模板與泛型
- 3.8.1 概述
- 3.8.2 模板類型
- 3.8.3 *模板參數
- 3.8.4 *模板編譯
- 3.8.5 *模板推斷
- 3.8.6 *實例化與特例化
- 第4章 C++標準庫
- 4.1 概述
- 4.2 輸入輸出流
- 4.2.1 概述
- 4.2.2 *流的狀態
- 4.2.3 *常用流
- 4.2.4 *格式化I/O
- 4.2.5 *低級I/O
- 4.2.6 *隨機訪問
- 4.3 *C輸入輸出
- 4.3.1 *字符輸入輸出
- 4.3.2 *格式化輸入輸出
- 4.4 * 容器
- 4.4.1 * 概述
- 4.4.2 * 基本操作
- 4.4.3 * 順序容器
- 4.4.4 * 迭代器
- 4.4.5 * 容器適配器
- 4.5 * 泛型算法
- 4.6 * 內存管理
- 4.6.1 * 自動指針
- 4.7 * 其他設施