C++:string類(1)

一.初步了解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循環語法

? ?- 演示了只讀遍歷和通過引用修改的兩種方式

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86651.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何避免靜態變量初始化中的異常

確保初始化表達式的安全性 基本數據類型初始化 對于基本數據類型&#xff08;如int、double、boolean等&#xff09;的靜態變量初始化&#xff0c;要確保賦值的表達式是合法的。例如&#xff0c;在初始化一個int類型的靜態變量時&#xff0c;避免出現除數為零的情況。 class Sa…

【151】基于Springboot+Vue實現的校園訂餐管理系統小程序(有文檔+PPT+視頻)

系統介紹 視頻演示 基于SpringbootVue實現的校園訂餐管理系統小程序&#xff08;有文檔PPT視頻&#xff09; 基于SpringbootVue實現的校園訂餐管理系統小程序采用前后端分離的架構方式&#xff0c;系統設計了管理員、商家、用戶三種角色&#xff0c;系統分為管理端、小程序端&…

從 0 到 1:基于 Qwen3 Embedding 的 RAG 智能問答系統搭建指南

RAGFlow 是一個基于深度文檔理解的開源 RAG&#xff08;檢索增強生成&#xff09;引擎。 與 LLM 集成后&#xff0c;它能夠提供真實的問答功能&#xff0c;并以來自各種復雜格式數據的可靠引用為支撐。 教程鏈接&#xff1a;OpenBayes 控制臺 使用云平臺:OpenBayes signup -…

Prompt Distillation for Efficient LLM-based Recommendation

題目 基于LLM的高效推薦的快速蒸餾 論文地址&#xff1a;https://dl.acm.org/doi/10.1145/3583780.3615017 摘要 大語言模型&#xff08;LLM&#xff09;在各種任務上表現出了無與倫比的建模能力&#xff0c;例如多步推理&#xff0c;但是這些模型的輸入大部分僅限于純文本&am…

JDBC 工具類:1.0到3.0版本

一、引言 在 Java 開發中&#xff0c;與數據庫的交互是一項常見且重要的任務。JDBC&#xff08;Java Database Connectivity&#xff09;作為 Java 語言訪問數據庫的標準 API&#xff0c;為我們提供了統一的接口來操作各種數據庫。然而&#xff0c;每次進行數據庫操作都編寫大…

實驗室建設案例 | 洛陽職業技術學院—人工智能實驗室

院校簡介 洛陽職業技術學院位于千年古都、牡丹花城、絲路起點洛陽&#xff0c;是一所由洛陽市政府舉辦的公辦高職院校&#xff0c;成立于2011年&#xff0c;辦學歷史可追溯到1945年的豫西公學。學校全面貫徹黨的教育方針&#xff0c;圍繞落實立德樹人根本任務&#xff0c;秉承“…

vue2中,修改對象數組中元素對應的屬性,頁面不更新的問題解決

有如下代碼&#xff1a; // 有一個數組 let dataAry [{name: haha, age: 20},{name: hello, age: 21} ] // 這個數組在模板中使用了v-for進行循環 v-for"one of dataAry" :name"one.name" :address"one.address"// 子組件中使用如下&#xff…

代理模式:控制對象訪問的守門員[特殊字符],優雅實現功能增強與訪問控制!

代理模式&#xff1a;控制對象訪問的守門員&#x1f510;&#xff0c;優雅實現功能增強與訪問控制&#xff01; 文章目錄 代理模式&#xff1a;控制對象訪問的守門員&#x1f510;&#xff0c;優雅實現功能增強與訪問控制&#xff01;前言&#xff1a;為什么需要代理&#xff1…

《人間詞話》PPT課件

《人間詞話》簡介 《人間詞話》是王國維所著的一部文學批評著作。《人間詞話》作于1908&#xff5e;1909年&#xff0c;最初發表于《國粹學報》。該作是作者接受了西洋美學思想之洗禮后&#xff0c;以嶄新的眼光對中國舊文學所作的評論。 《人間詞話》PPT課件下載 夸克網盤分享…

解剖智能運維三基石:Metrics/Logs/Traces

3秒知識卡 三基石關系&#xff1a; Metrics&#xff08;指標&#xff09;→ 系統脈搏&#xff08;CPU/錯誤率&#xff09; Logs&#xff08;日志&#xff09;→ 事件日記&#xff08;錯誤堆棧/用戶行為&#xff09; Traces&#xff08;追蹤&#xff09;→ 血緣地圖&#xff08;…

從代碼學習深度學習 - 情感分析:使用卷積神經網絡 PyTorch版

文章目錄 前言加載數據集一維卷積最大時間匯聚層textCNN模型定義模型加載預訓練詞向量訓練和評估模型總結前言 在之前的章節中,我們探討了如何使用循環神經網絡(RNN)來處理序列數據。今天,我們將探索另一種強大的模型——卷積神經網絡(CNN)——并將其應用于自然語言處理…

深入解析分布式訓練基石:ps-lite源碼實現原理

分布式機器學習框架是現代推薦、廣告和搜索系統的核心支撐。面對海量訓練數據和高維稀疏特征&#xff0c;參數服務器&#xff08;Parameter Server, PS&#xff09; 架構應運而生。作為早期經典實現的ps-lite因其簡潔性和完整性&#xff0c;成為理解PS原理的絕佳切入點。本文將…

IDEA 插件開發:Internal Actions 與 UI Inspector 快速定位 PSI

在開發 IntelliJ 平臺插件的過程中&#xff0c;你常常需要搞清楚 某個 IDE 彈框背后是如何操作 PSI&#xff08;Program Structure Interface&#xff09; 的。下面這篇筆記將介紹如何通過 Internal Actions、UI Inspector 以及調試技巧快速定位 PSI 調用鏈。 1. 啟用 Internal…

26考研|數學分析:多元函數微分學

前言 本章我們將進行多元函數微分學的學習&#xff0c;多元函數微分學與一元函數微分學相對應&#xff0c;涉及到可微性、中值定理、泰勒公式等諸多問題的探討與研究&#xff0c;本章難度較大&#xff0c;在學習過程中需要進行深度思考與分析&#xff0c;才能真正掌握這一章的…

數星星--二分

https://www.matiji.net/exam/brushquestion/17/4498/F16DA07A4D99E21DFFEF46BD18FF68AD 二分思路不難&#xff0c;關鍵的區間內個數的確定 #include<bits/stdc.h> using namespace std; #define N 100011 #define inf 0x3f3f3f3f typedef long long ll; typedef pair&…

Oracle/PostgreSQL/MSSQL/MySQL函數實現對照表

函數列表清單 函數作用OraclePOSTGRESQLMSSQLMYSQL求字符串長度LENGTH(str)LENGTH(str)LEN(str)LENGTH(str)字符切割SUBSTR(str,index,length)SUBSTR(str,index,length)SUBSTRING(str,index,length)SUBSTRING(str,index,length)字符串連接str1||str2||str3...strNstr1||str2||…

pycharm客戶端安裝教程

二、 pycharm客戶端安裝 打開pycharm官網&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 選擇其他版本 選擇2018社區版本&#xff0c;點擊下載 雙擊下載的安裝程序(第一個彈框允許)&#xff0c;選擇下一步 更改安裝路徑&#xff0c;在pycah…

博圖SCL語言中用戶自定義數據類型(UDT)使用詳解

博圖SCL語言中用戶自定義數據類型&#xff08;UDT&#xff09;使用詳解 一、UDT概述 用戶自定義數據類型&#xff08;UDT&#xff09;是TIA Portal中強大的結構化工具&#xff0c;允許將多個相關變量組合成單一數據結構。UDT本質是可重用的數據模板&#xff0c;具有以下核心優…

Vscode自定義代碼快捷方式

首選項>配置代碼片段 >新建全局代碼片段 (也可以選擇你的語言 為了避免有的時候不生效 選擇全局代碼) {"console.log": { //名字"prefix": "log",//prefix 快捷鍵 &#xff1a; log"body": ["console.log($1);", //b…

ESP32 008 MicroPython Web框架庫 Microdot 實現的網絡文件服務器

以下是整合了所有功能的完整 main.py(在ESP32 007 MicroPython 適用于 Python 和 MicroPython 的小型 Web 框架庫 Microdot基礎上)&#xff0c;實現了&#xff1a; Wi?Fi 自動連接&#xff08;支持靜態 IP&#xff09;&#xff1b;SD 卡掛載&#xff1b;從 /sd/www/ 讀取 HTML…