首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Primer 第五版第十七章練習題解析與代碼實現

     編輯:關於C++

第十七章重點回顧

第十七章涵蓋 tuple、bitset、正則表達式、隨機數、I/O 流格式控制、文件操作等進階標準庫組件。以下按練習編號分類整理關鍵知識點與完整可編譯代碼。

17.1-17.3:tuple 基礎與 TextQuery 類設計

tuple 適合快速構建多返回值結構,但難以重構。TextQuery 類演示了如何用 shared_ptr 管理動態資源,實現文本查詢功能。

// 17.3 TextQuery 核心結構
class TextQuery {
public:
    using line_no = vector::size_type;
    using QueryResult = tuple>, shared_ptr>>;
    
    TextQuery(ifstream&);
    QueryResult query(const string&) const;
private:
    shared_ptr> file;
    map>> wm;
};

17.4-17.7:Sales_data 類與多容器查詢

Sales_data 完整實現了複製控制、移動語義、運算符重載、I/O 運算符。findBook 三種版本分別使用 tuple、pair、自定義結構體返回多值,對比了它們的優劣。

// 17.6 結構體版本(推薦:語義清晰)
struct Matches {
    vector::size_type store_idx;
    vector::const_iterator first, last;
    Matches(size_type s, auto f, auto l) : store_idx(s), first(f), last(l) {}
};

17.8-17.13:bitset 操作與自定義 Bit 類模板

  • 17.10:bitset 初始化與位操作(set()、flip()、count())。
  • 17.11-17.13:模板類 Bit<N> 封裝 bitset,提供 update()、友元函數 text() 計算答對題數、輸出運算符重載。

17.14-17.27:正則表達式完整實戰

從基本語法錯誤捕獲(17.14)、"ei" 拼寫規則匹配(17.15-17.16)、文件中查找異常單詞(17.17-17.18)、電話號碼驗證與格式化(17.19-17.26)、郵編格式化(17.27)逐步深入。

// 17.20 電話號碼驗證邏輯
bool valid(const smatch& m) {
    if (m[1].matched)  // 有左括號
        return m[3].matched && (!m[4].matched || m[4].str() == " ");
    else               // 無左括號
        return !m[3].matched && m[4].str() == m[6].str();
}

17.28-17.36:隨機數引擎與 I/O 格式控制

  • default_random_engine + uniform_int_distribution 生成隨機數(17.28-17.30)。
  • 17.31-17.32:引擎對象必須在循環外聲明,否則每次重新構造產生相同序列;do-while 作用域陷阱。
  • 17.33:bernoulli_distribution 實現隨機替換加密。
  • 17.34-17.36:unitbuf、boolalpha、showbase、hexfloat、setfill/setw 等格式化控制實戰。

17.37-17.39:文件流定位與行處理

  • getline() 按行/分隔符讀取(17.37-17.38)。
  • 17.39:fstream 同時讀寫,tellg/seekg/seekp 精確控制文件指針,在每行末尾追加長度統計。

學習建議

  1. 動手敲碼:所有練習代碼務必親自編譯運行,觀察輸出差異。
  2. 對比容器選擇:tuple 適合臨時聚合,長期維護用結構體;pair 限兩值。
  3. 正則調試:先用 regex_error 捕獲語法錯誤,再用 sregex_iterator 逐個匹配檢視上下文。
  4. 隨機數最佳實踐:引擎作為靜態/成員變量持久化,分布對象可臨時構造。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved