一.初步了解STL
STL是Standard Template Library的縮寫,中文譯為標準模板庫,是C++標準庫的重要組成部分。它本質上是一套基于模板的通用編程工具,通過模板技術實現了數據結構和算法的抽象與復用,讓開發者無需重復編寫基礎功能,直接使用標準化的組件來處理數據。
其核心設計思想是泛型編程(Generic Programming),即通過模板讓代碼不依賴于具體數據類型,從而適用于多種場景。
?
?以上是C++標準模板庫(STL)的核心架構圖,清晰呈現其六大組件:
- 容器:如?vector?(動態數組)、?map?(鍵值映射 ),提供多樣數據存儲結構。
- 算法:涵蓋?sort?(排序)、?find?(查找)等,借迭代器操作容器數據。
- 迭代器:像?iterator?(普通迭代)、?reverse_iterator?(反向迭代 ),是容器與算法的“橋梁”。
- 仿函數:以?greater?、?less?為代表,自定義操作邏輯,輔助算法執行。
- 空間配置器:?allocator?負責內存分配與釋放,優化容器內存管理。
- 配接器:如?stack?(棧)、?queue?(隊列),基于基礎容器封裝特定接口,適配不同使用場景。
這些組件相互配合,讓STL成為高效、通用的編程工具,助力開發者快速實現復雜數據處理邏輯。
?
二.初識string
1.STL中的string類
C++ 里的 ?string? 是處理字符串的核心工具,本質是 ?basic_string<char>? 類模板的特化,定義在 ?<string>? 頭文件,位于 ?std? 命名空間。
它解決了 C 語言字符數組(以 ?\0? 結尾)的諸多痛點:無需手動管理內存,自動分配、釋放空間,規避緩沖區溢出等問題;還封裝豐富成員函數,像 ?append?(拼接)、?find?(查找子串 )、?substr?(提取子串)等,操作便捷。
使用時,需包含頭文件,可通過 ?using namespace std;? 或 ?std::string? 方式引入。構造靈活,支持默認構造(空串)、用 C 風格字符串/其他 ?string? 對象構造,還能指定字符范圍、重復字符構造。
日常開發中,?string? 常用于處理 ASCII 或 UTF - 8 編碼文本,能輕松實現輸入輸出、拼接、查找替換等操作,是高效、安全的字符串處理方案,大幅簡化文本相關編程工作。
?
2.auto和范圍for
早期 C/C++ 中,?auto? 用于修飾具自動存儲的局部變量,后意義弱化。C++11 起,?auto? 變為類型指示符,讓編譯器編譯期推導變量類型 :
- 指針用 ?auto? 或 ?auto*? 無區別,引用需顯式加 ?&?;
- 同行聲明多變量,類型需一致,因僅推導首個變量類型;
- 可作函數返回值,慎用作參數;
- 無法直接聲明數組 。
使用 auto 有這些注意點:聲明變量必須有初始化值,保證編譯期能明確推導類型;默認推導會忽略引用、const/volatile 修飾,若需保留要顯式寫 auto&、const auto& 等;簡單類型(如 int、double )直接聲明類型更清晰,復雜場景(模板、迭代器 )用 auto 提升可讀性。
對于一個有范圍的集合而言,由程序員來說明循環的范圍是多余的,有時候還會容易犯錯誤。因此C++11中引入了基于范圍的for循環。for循環后的括號由冒號“ :”分為兩部分:第一部分是范圍內用于迭代的變量,第二部分則表示被迭代的范圍,自動迭代,自動取數據,自動判斷結束。
范圍for可以作用到數組和容器對象上進行遍歷
范圍for的底層很簡單,容器遍歷實際就是替換為迭代器。
示例代碼如下:
?以上這段代碼通過 ?Test_String03? 函數演示 C++ 中 ?auto? 類型推導與范圍 for 循環的用法。先利用 ?auto? 推導 ?x?(int 型)、?y?(double 型)并輸出;接著用范圍 for 遍歷數組 ?a?,分別以值傳遞(?auto e? ,輸出原數組元素)、引用傳遞(?auto& e? ,修改元素為 0 后輸出 );最后用范圍 for 遍歷 ?string? 對象 ?str? ,逐個輸出字符。右側 VS 調試控制臺呈現各步驟輸出結果,清晰展現 ?auto? 簡化類型聲明、范圍 for 便捷遍歷容器的特性 。
?
3.string類的常用借口
3.1string類對象的常用構造
?以上是?C++ ?string? 類的構造函數說明,展示 7 種初始化方式:
①從默認空串、
②拷貝已有 ?string?,
③到截取子串、
④轉換 C 風格字符串,
⑤還支持用字符填充、
⑥迭代器范圍構造 。
不同構造函數適配多樣場景,幫開發者靈活創建 ?string? 對象。
示例代碼如下:
?以上?C++ 代碼聚焦 ?string? 類構造與賦值操作 。通過 ?Test_String01? 函數,演示多種初始化方式:默認構造 ?s1? 、用字符串字面量構造 ?s2? ,還有拷貝構造(?s3? 拷貝 ?s2? 、?s4? 按范圍拷貝 ?s2? 、?s5? 從指定下標拷貝 ?s2? 子串 )、基于 C 風格字符串構造(?s6? 拷貝 ?str? 、?s7? 取 ?str? 前 6 字符 )、用字符填充構造 ?s8? 。輸出驗證構造結果后,展示賦值操作:?s1? 先賦 ?s2? 值,再賦字符串字面量 ?"xyz"? ,最后賦字符 ?'c'? ,完整呈現 ?string? 類靈活的初始化與賦值能力,借助 VS 調試窗口輸出結果,直觀體現代碼邏輯執行效果 。
?
3.2string類對象的容量操作
對于字符串結構的簡單理解:可以認為字符串是存儲字符數組的順序表。
如下圖所示
?定義了 ?my_string? 類,私有成員包含動態字符指針 ?a?,以及記錄長度的 ?size? 和容量的 ?capacity?,為后續實現字符串的動態管理(如內存分配、擴容等)奠定基礎,這些成員是構建自定義字符串類的核心要素 。
string容量操作相關的函數
注意:
?1.?size()與length()方法底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。
2.?clear()只是將string中有效字符清空,不改變底層空間大小。
3.?resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到n個,不同的是當字符個數增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。注意:resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變。
4.?reserve(size_t res_arg=0): 為string預留空間,不改變有效元素個數,當reserve的參數小于string的底層空間總大小時,reserve不會改變容量大小。
以下是代碼示例 展示:
?以上代碼聚焦 ?std::string? 的基礎方法實踐。?Test_String04? 函數里,先初始化 ?s1? 為 ?"hello world"? ,通過 ?length?、?size? 確認有效字符數(結果均為 11 ),?capacity? 查看總空間(初始 15 )。調用 ?resize(20, 'b')? 擴展有效字符到 20 ,多余位置用 ?'b'? 填充,遍歷輸出驗證。接著用 ?s1? 拷貝構造 ?s2? ,?s2.clear()? 清空有效字符(?size? 歸 0 ,但 ?capacity? 保留原空間 31 ),再次輸出 ?size? 和 ?capacity? 體現變化。整個過程清晰展示 ?string? 類管理長度、空間的核心邏輯,借助 VS 調試控制臺輸出,直觀呈現函數調用后的狀態 。
?
3.3string類對象的訪問以及遍歷操作
?示例代碼:?以上代碼展示了C++中字符串(`std::string`)的幾種常見操作方式,包括訪問、修改和遍歷。
1. operator[] 示例:
? ?- 展示了如何使用`[]`運算符訪問和修改字符串中的字符
? ?- 演示了const字符串只能讀取不能修改的特性
?
2. begin + end 示例:
? ?- 使用正向迭代器遍歷字符串
? ?- 通過解引用迭代器修改字符串內容
? ?- 將字符串轉換為大寫
?
3. rbegin + rend 示例:
? ?- 使用反向迭代器遍歷字符串
? ?- 將字符串轉換為小寫
? ?- (注意:代碼中有拼寫錯誤`rand()`應為`rend()`)
?
4. 范圍for循環示例:
? ?- 展示了C++11的范圍for循環語法
? ?- 演示了只讀遍歷和通過引用修改的兩種方式
?
?