字符串處理是程式設計中最基礎也最複雜的課題之一。從 C 語言的 char* 到 C++ std::string,再到重量級的 rope、StringBuilder 等進階資料結構,每種實作都有其適用場景與權衡。本文系統梳理字符串處理的歷史演進、標準庫缺陷、以及 StdExt 庫的多層次解決方案。
char* 時代strlen、strcpy、strcat、strstrstrcat 效率低 (O(n²) 連接)strecpy 返回結尾指標,啟發 STL std::copystd::basic_string (通稱 std::string)ropestring 的核心缺陷| 問題 | 說明 |
|---|---|
| 介面不一致 | find 返回下標而非迭代器,與其他容器不一致 |
| 記憶體碎片 | 頻繁構造/析構導致堆碎片化 |
| COW 與多線程衝突 | Copy-On-Write 需鎖保護,多線程下鎖開銷大;現代實作 (如 GCC 5+) 已棄用 COW |
| 單一職責違背 | 同時承擔「不可變字符串」與「可變構建器」雙重角色 |
針對不同規模、操作模式、記憶體佈局需求,提供四大類別:
| 類別 | 定位 | 記憶體模型 | 核心操作 | 適用場景 |
|---|---|---|---|---|
std::String | 常字符串 (Immutable) | 線性連續 | 查找、比較、子串、轉換 | 只讀文本、鍵值、識別碼 |
std::StringBuilder | 可變構建器 | 線性連續 | append、set、格式化 | 小/中型字符串構建、日志、SQL 拼裝 |
std::TextPool | 邏輯字符串池 | 非連續 (分塊) | append、改寫、伸縮性優於 StringBuilder | 大型文本累積、流式處理 |
std::Rope | 重量級編輯器 | 樹狀 (平衡樹) | 子串、插入、刪除、複雜編輯 O(log n) | 巨型文本編輯器、IDE、文檔模型 |
「字符串處理的應用環境很複雜,需要因地制宜,指望一個 string 類行遍天下是不可能的。」
std::String (或 std::string)std::StringBuilderstd::TextPoolstd::Rope字符串處理無銀彈。理解各類實作的時間/空間複雜度、記憶體模型、執行緒安全性,根據具體業務場景選擇合適工具,才能寫出高效、穩健的系統。StdExt 的分層設計正是對這一複雜性的工程化回應。