第0章 入門 1
0.1 注釋 1
0.2 #include指令 1
0.3 main函數 2
0.4 花括號 2
0.5 使用標準庫來輸出 2
0.6 return語句 3
0.7 稍微深入分析“Hello, world!”程序 3
小結 4
練習 6
第1章 使用字符串 7
1.1 輸入 7
1.2 為名字裝框輸出 9
小結 12
練習 12
第2章 循環(huán)和計數 14
2.1 問題 14
2.2 程序的總體結構 14
2.3 輸出任意多行 15
2.3.1 while語句 16
2.3.2 設計一個while語句 16
2.4 輸出一行 18
2.4.1 輸出邊界字符 19
2.4.2 輸出非邊界字符 21
2.5 完整的框架程序 22
2.5.1 簡化重復的std:: 22
2.5.2 使用for語句來簡化 23
2.5.3 精簡測試 24
2.5.4 整合結果 24
2.6 計數 25
小結 27
練習 29
第3章 使用批量數據 30
3.1 計算學生成績 30
3.1.1 檢測輸入的結束 33
3.1.2 循環(huán)不變式 34
3.2 使用中值取代平均值 35
3.2.1 用vector保存數據集 35
3.2.2 生成輸出 37
3.2.3 值得注意的地方 40
小結 41
練習 42
第4章 組織程序和數據 43
4.1 組織計算 43
4.1.1 查找中值 44
4.1.2 重新實現計算最終成績的方法 45
4.1.3 讀取家庭作業(yè)成績 47
4.1.4 3種函數形參 49
4.1.5 使用函數來計算學生的成績 50
4.2 組織數據 52
4.2.1 把一個學生的所有數據集合起來 52
4.2.2 處理學生記錄 53
4.2.3 生成報表 55
4.3 把各部分程序連接起來 56
4.4 把計算成績程序分塊 58
4.5 修改后的計算成績程序 60
小結 61
練習 62
第5章 使用序列式容器并分析字符串 64
5.1 把學生分類 64
5.1.1 就地刪除元素 65
5.1.2 順序訪問和隨機訪問 67
5.2 迭代器 67
5.2.1 迭代器類型 68
5.2.2 迭代器操作 69
5.2.3 一些語法知識 70
5.2.4 students.erase(students.begin()+i)
的含義 70
5.3 使用迭代器取代索引 70
5.4 重新設計數據結構以獲取更好的性能 72
5.5 list類型 72
5.5.1 重要的區(qū)別 73
5.5.2 為什么要如此麻煩呢 74
5.6 剖析字符串 74
5.7 檢測split函數 77
5.8 連接字符串 78
5.8.1 為一個圖案裝框 78
5.8.2 縱向連接 80
5.8.3 橫向連接 81
小結 82
練習 85
第6章 使用庫算法 87
6.1 分析字符串 87
6.1.1 分割字符串的另一種方式 89
6.1.2 回文 90
6.1.3 查找URL 91
6.2 比較計算學生成績的方案 95
6.2.1 處理學生記錄 95
6.2.2 分析成績 96
6.2.3 基于家庭作業(yè)成績的平均值
來計算最終成績 99
6.2.4 已提交的家庭作業(yè)成績的中值 100
6.3 把學生分類并且重新解決一個問題 101
6.3.1 訪問兩次的解決方案 101
6.3.2 一次訪問的解決方案 103
6.4 算法、容器和迭代器 104
小結 104
練習 106
第7章 使用關聯式容器 107
7.1 支持高效查找的容器 107
7.2 字數統(tǒng)計程序 108
7.3 生成一個交叉引用表 109
7.4 生成句子 112
7.4.1 表示規(guī)則 113
7.4.2 讀取語法 114
7.4.3 生成一個隨機的句子 115
7.4.4 選取一個隨機元素 117
7.5 注意性能 119
小結 119
練習 120
第8章 編寫泛型函數 122
8.1 什么是泛型函數 122
8.1.1 未知類型的中值 123
8.1.2 模板實例化 124
8.1.3 泛型函數和類型 125
8.2 數據結構的獨立 126
8.2.1 算法和迭代器 127
8.2.2 順序只讀訪問 127
8.2.3 順序只寫訪問 128
8.2.4 順序讀寫訪問 129
8.2.5 可逆訪問 130
8.2.6 隨機訪問 130
8.2.7 迭代器區(qū)間和越界值 131
8.3 輸入和輸出迭代器 132
8.4 使用迭代器來提高靈活性 133
小結 134
練習 135
第9章 定義新類型 137
9.1 回顧Student_info 137
9.2 類 138
9.2.1 成員函數 138
9.2.2 非成員函數 141
9.3 保護 141
9.3.1 訪問器函數 142
9.3.2 檢測對象是否為空 144
9.4 Student_info類 144
9.5 構造函數 145
9.5.1 默認構造函數 146
9.5.2 帶有參數的構造函數 147
9.6 使用Student_info類 147
小結 148
練習 149
第10章 管理內存和底層數據結構 150
10.1 指針和數組 150
10.1.1 指針 151
10.1.2 指向函數的指針 152
10.1.3 數組 154
10.1.4 指針的算術運算 155
10.1.5 索引 156
10.1.6 數組初始化 156
10.2 再看字符串直接量 157
10.3 初始化字符指針數組 158
10.4 main函數的參數 159
10.5 讀寫文件 160
10.5.1 標準錯誤流 160
10.5.2 處理多個輸入和輸出文件 160
10.6 3種內存管理 162
10.6.1 為一個對象分配和釋放內存 163
10.6.2 為數組分配并釋放內存 163
小結 165
練習 166
第11章 定義抽象數據類型 167
11.1 Vec類 167
11.2 實現Vec類 167
11.2.1 內存分配 169
11.2.2 構造函數 169
11.2.3 類型定義 170
11.2.4 索引和大小 172
11.2.5 返回迭代器的操作 173
11.3 復制控制 174
11.3.1 復制構造函數 174
11.3.2 賦值 175
11.3.3 賦值不是初始化 177
11.3.4 析構函數 179
11.3.5 默認操作 179
11.3.6 三者缺一不可的規(guī)則 180
11.4 動態(tài)Vec對象 181
11.5 靈活的內存管理 182
小結 187
練習 188
第12章 使類的對象像數值一樣工作 189
12.1 一個簡單的string類 189
12.2 自動轉換 191
12.3 Str類的操作 192
12.3.1 輸入-輸出操作符 192
12.3.2 友元 193
12.3.3 其他二元操作符 195
12.3.4 混合類型的表達式 196
12.3.5 定義二元操作符 197
12.4 某些類型轉換是危險的 198
12.5 類型轉換操作符 199
12.6 類型轉換和內存管理 200
小結 202
練習 202
第13章 使用繼承和動態(tài)綁定 204
13.1 繼承 204
13.1.1 保護標簽 205
13.1.2 操作 206
13.1.3 繼承和構造函數 207
13.2 多態(tài)和虛函數 209
13.2.1 不知道對象類型的情況下
取得對象的值 210
13.2.2 動態(tài)綁定 211
13.2.3 回顧 212
13.3 使用繼承來解決我們的問題 213
13.3.1 包含(實質上)未知類型的容器 215
13.3.2 虛析構函數 217
13.4 一個簡單的句柄類 218
13.4.1 讀取句柄 220
13.4.2 復制句柄對象 221
13.5 使用句柄類 222
13.6 精妙之處 223
13.6.1 繼承和容器 223
13.6.2 我們需要的是哪個函數 224
小結 225
練習 226
第14章 幾乎自動的管理內存 228
14.1 復制所指向的對象的句柄 228
14.1.1 一個泛型句柄類 229
14.1.2 使用一個泛型句柄 232
14.2 引用計數句柄 234
14.3 可以決定何時共享數據的句柄 236
14.4 可控制句柄上的一個改進 238
14.4.1 復制不能控制的類型 239
14.4.2 什么時候需要進行復制 241
小結 241
練習 241
第15章 再看字符圖形問題 242
15.1 設計 242
15.1.1 使用繼承來模擬這種結構 243
15.1.2 Pic_base類 245
15.1.3 派生類 247
15.1.4 復制控制 249
15.2 實現 250
15.2.1 實現用戶接口 250
15.2.2 String_Pic類 252
15.2.3 填充輸出以補齊 254
15.2.4 VCat_Pic類 255
15.2.5 HCat_Pic類 256
15.2.6 Frame_Pic類 256
15.2.7 不要忘記友元聲明 257
小結 259
練習 260
第16章 如何學習C++ 261
16.1 使用已經掌握的知識 261
16.2 學習更多的知識 263
練習 263
附錄A 語言細節(jié) 264
附錄B 標準庫概要 279