探索C++標準模板庫(STL):從容器到底層奧秘-全面解析String類高效技巧(上篇)

前引:在現代軟件開發中,字符串處理是幾乎所有程序的核心需求之一。無論是文本解析、網絡通信,還是用戶交互,高效且安全的字符串操作能力直接決定了代碼的質量與可維護性。而C++標準模板庫(Standard Template Library, STL)中的 string 類,正是為這一需求而生——它既封裝了底層字符數組的復雜性,又通過統一的接口提供了豐富的操作功能,成為C++開發者最常用的工具之一!?

【string其實并沒那么難!簡單來說就是學習各種功能接口,希望此文對佬有所幫助,加油丫!】?

目錄

STL介紹

STL核心模塊

為什么要學習String

String的使用規則

String的常用接口

構造函數

構造空對象

構造字符對象

拷貝構造

構造指定字符數量的對象

成員函數

尾插一個字符

尾插一個字符串

輸入運算符重載

輸出運算符重載

獲取一行字符串

關系操作/比較

獲取pos位置的字符

計算有效字符長度

清楚有效字符

檢測字符串是否為空串

指定調整空間

指定調整空間+初始化

指定位置插入數據

指定位置刪除數據

標記獲取區間數據

迭代器訪問

迭代器順序獲取字符

迭代器逆序獲取字符

迭代器在函數中順序獲取字符

迭代器在函數中逆序獲取字符


STL介紹

STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架

String 是C++標準庫中定義的字符串類的容器,屬于<string>頭文件,通過封裝底層字符數字的復雜性,提供了一套安全、高效且易擴展的字符串操作接口

STL核心模塊

STL包含三大核心模塊:

(1)容器(比如 string、vextor、list、map、set........)

(2)算法(比如排序、查找、遍歷.......)

(3)迭代器:類似指針(可能是指針,可能不是)的抽象工具,提供對容器元素的統一訪問方式

為什么要學習String

首先比較直接的在筆試中對STL知識的運用很廣泛,例如:

https://www.nowcoder.com/share/jump/1747468021126

其次在面試中對STL相關知識也考的比較多,例如:

對于C++程序員、面試者、工程師掌握STL都將顯著提高我們的代碼質量與開發體驗~?

String的使用規則

(1)string是表示字符串的字符串類

(2) 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。

(3)string在底層實際是:basic_string模板類的別名,typedef basic_string string;

(4)不能操作多字節或者變長字符的序列。 在使用string類時,必須包含#include頭文件以及 ? ? ? ? ? ? ? ? using namespace std(或者范圍展開使用)

String的常用接口

構造函數

對于構造函數的功能,小編在之前已經出過文章仔細學習了,大家可以翻小編C++專欄筆記哦!

大家可以打開這個網站,里面詳細介紹了容器里面的各種接口使用!主頁搜索:string

https://legacy.cplusplus.com/

(1)先包含#include<string>頭文件

(2)全局展開/范圍展開C++標準庫

構造空對象

參數:

形式:string ()

例如:

string S1;

構造字符對象

參數:字符串

形式:string?string對象(const char* s)

例如:

string S2("hello word");

拷貝構造

參數:一個存在的string對象

形式:string?string對象(string對象)

例如:

string S3(S2);

構造指定字符數量的對象

參數:字符串、字符個數(有效個數)

形式:string?string對象(const char * s,size_t)

例如:

string S4("how are you", 7);

?如果超過當前字符串個數,后面將是隨機值,例如:

成員函數
尾插/尾刪一個字符

參數:字符

形式:string對象?. push_back(char c)

? ? ? ? ? ?(自動擴容)

尾刪:pop_back

例如:

S2.push_back('*');

尾插一個字符串

參數:字符串

形式:string對象?. append(const char* s)

? ? ? ? ? ?自動擴容

例如:

S2.append("WWWWWW");

輸入運算符重載

參數:string 對象

形式:operator >>?string對象

例如:

cin>>S2;

如果字符串中有空格,會作為結束的標志,例如:

輸出運算符重載

參數:string對象

形式:cout <<?string對象

例如:

cout << S2

獲取一行字符串

參數:輸入運算符重載,string對象

形式:getline(cin,string對象)

例如:

其實就是升級版的“輸入運算符重載”,會獲取當前字符串的所有內容

getline(cin,S2);

關系操作/比較

參數:string對象,string對象
形式:string對象??關系符??string對象

例如:

S2 == S3;
S2 < S3;
S2 > S3;
S2 + S3;
S2 += S3;
S2 = S3; 

獲取pos位置的字符

參數:字符串對象的位置下標(跟操作數組一樣)

形式:string對象??[下標]

例如:

S2[i]

?它是可以直接修改內容的,例如:

如果換成 auto 自動推導類型也是可以的(需要用引用),因為 auto 底層是迭代器,例如:

計算有效字符長度

形式:string對象.size()

例如:

S2.size()

清楚有效字符

形式:string對象.clear()

例如:

S2.clear()

檢測字符串是否為空串

形式:string對象.empty()? ?(是則返回true,否則返回false)

例如:

S2.empty()

指定調整空間

形式:string對象.reserve(size_t)?

? ? ? ? ? ?擴容的大小只大于等于指定大小,不可能小于指定大小

? ? ? ? ? 如果第二次調整的空間小于第一次調整的空間,容量不會減少

例如:

S2.reserve(10)

reserve調容量規則:

如果預調容量之后會影響到原來已經存儲的數據,則不會調小容量,例如:

?如果預調容量之后不影響到原來已經存儲的數據,則會調小容量,例如:

指定調整空間+初始化

形式: ?string對象.resize(size_t)

? ? ? ? ? ? ?string對象.resize(size_t,char c)

? ? ? ? ? ?如果 size_t 大于當前字符串長度,則將剩余的字符初始化為指定的內容,否則轉為空格

? ? ? ? ? ?如果 size_t 小于當前字符串長度,則縮短為其前 n 個字符,并刪除超出第 n 個字符的字符

例如:

S2.resize(10);S2.resize(5,'*')S2.resize(12,'*')

調整規則:

如果給resize的值小于當前空間容量,resize不會去縮小容量,只會刪除數據,例如:

指定位置插入數據

形式:string對象.insert(size_t,const char c) ? ? ? ? ?指定位置插入指定字符串

形式:string對象.insert(size_t,size_t,char c) ? ? ? ? 指定位置插入指定數量的字符

例如:

注意:指定的位置受當前容量的影響

S2.insert(5,"hao are you");S2.insert(10,5,'x');

指定位置刪除數據

形式:string對象.erase(size_t)? ? ? 刪除指定位置之后的所有數據

? ? ? ? ? ?string對象.erase(size_t,size_t)? ? ? ? ?刪除指定位置開始的一定數量的數據

例如:

S2.erase(5);S2.erase(0,1);

標記獲取區間數據

這里通常是將兩個成員函數:find+substr 結合起來用

find:標記一個字符/字符串/string對象,在對象中從頭開始尋找標記地方,沒有找到就返回 npos

substr:給一個區間,可以只寫開始的位置,返回拷貝這個區間的新對象

例如:

用 find 標記一個初始位置,如果找到這個標記的地方,substr 根據區間拷貝構造一個新對象

判斷一個字符是不是字母

形式:isalpha(char c)

? ? ? ? ? ?c是字母返回非0,否則返回0

例如:?

?判斷一個字符是不是字符數字

形式:isdigit(char c)

? ? ? ? ? 返回0表示不是數字,非0表示是字符數字

例如:

?大小寫字符的相互轉化

形式:toupper(char c)tolower(char c)

? ? 小轉大? ? ? ? 大轉小

例如:

刪除指定字符

形式:erase(remove(str.begin(), str.end(), ch), str.end())

例如:

逆置字符串

形式:reverse(string對象.begin()? , string對象.end())

例如:?

整型數字轉字符串

形式:string對象 = to_string(數字)

例如:

迭代器訪問

迭代器:

一種設計模式,用于遍歷集合中的元素,而無需暴露集合的內部結構。它提供了一種統一的方式來訪問集合中的元素,無論集合的具體實現是什么(想象為一種訪問工具)

優勢:

迭代器(iterator)提供一種統一的方式訪問和修改容器的數據(需要注意在函數中的使用只能訪問,且在指定位置加上 const ,否則會報錯)

因此算法就可以通過迭代器,去處理容器中的數據?

迭代器順序獲取字符

如圖:

形式:

迭代器逆序獲取字符

圖示:

例如:

迭代器在函數中順序獲取字符

使用:在迭代器前面加上?const?修飾,只能訪問不能修改數據

例如:

迭代器在函數中逆序獲取字符

使用:在迭代器前面加上?const_?修飾,只能訪問不能修改數據

例如:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【霧非霧】期待與你的下次相遇!

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

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

相關文章

Python爬蟲實戰:抓取百度15天天氣預報數據

&#x1f310; 編程基礎第一期《9-30》–使用python中的第三方模塊requests&#xff0c;和三個內置模塊(re、json、pprint)&#xff0c;實現百度地圖的近15天天氣信息抓取 記得安裝 pip install requests&#x1f4d1; 項目介紹 網絡爬蟲是Python最受歡迎的應用場景之一&…

HTML常見事件詳解:從入門到實戰應用

前言 在Web開發中&#xff0c;事件是用戶與網頁交互的核心機制。HTML事件讓我們能夠響應用戶的各種操作&#xff0c;如點擊、鼠標移動、鍵盤輸入等。掌握HTML事件是前端開發的基礎技能之一&#xff0c;本文將深入探討HTML中的常見事件類型及其實際應用。 HTML事件概覽總結 H…

模具制造業數字化轉型:精密模塑,以數字之力鑄就制造基石

模具被譽為 “工業之母”&#xff0c;是制造業的重要基石&#xff0c;其精度直接決定了工業產品的質量與性能。在工業制造向高精度、智能化發展的當下&#xff0c;《模具制造業數字化轉型&#xff1a;精密模塑&#xff0c;以數字之力鑄就制造基石》這一主題&#xff0c;精準點明…

深度解讀漏洞掃描:原理、類型與應用實踐

在網絡安全領域&#xff0c;漏洞就像隱藏在系統中的定時炸彈&#xff0c;隨時可能被攻擊者利用&#xff0c;導致數據泄露、服務癱瘓等嚴重后果。而漏洞掃描作為發現這些潛在威脅的 “偵察兵”&#xff0c;是保障網絡安全的重要防線。本文將全面介紹漏洞掃描的相關知識&#xff…

[HNCTF 2022 Week1]silly_zip

下載附件 解壓發現需要密碼 用010打開看看&#xff0c;發現是偽加密 改成00點擊保存 解壓后得到圖片 感覺圖片看著怪怪的&#xff0c;修改一下高度看看有沒有其他線索 把47改成78 最后得到flag

Facebook 的隱私保護措施是否足夠?技術觀點

在數字時代&#xff0c;隱私保護成為了公眾關注的焦點&#xff0c;尤其是對于擁有數十億用戶的社交媒體巨頭 Facebook 來說&#xff0c;其隱私保護措施的有效性更是備受矚目。本文將從技術角度探討 Facebook 的隱私保護措施是否足夠。 數據收集與使用 Facebook 收集用戶數據的…

cocosCreator 1.8 升級到 2.4

現在負責的一個運營中的商業項目&#xff0c;使用的是 cocosCreator1.8&#xff0c;之前沒有做好設計&#xff0c;所以東西都是直接加載在內存中的&#xff0c;到了現在性能問題逐漸暴露出來&#xff0c;討論之后想進行引擎升級&#xff0c;升級到cocosCreator 2.4。 官方的升…

ubuntu 制作 ssl 證書

安裝 openssl sudo apt install openssl 生成 SSL 證書 # 生成私鑰 (Private Key) openssl genrsa -out private.key 2048 在當前目錄生成 private.key # 生成證書簽名請求 (CSR - Certificate Signing Request) openssl req -new -key private.key -out certificate.csr -…

【Java基礎-環境搭建-創建項目】IntelliJ IDEA創建Java項目的詳細步驟

在Java開發的世界里&#xff0c;選擇一個強大的集成開發環境&#xff08;IDE&#xff09;是邁向高效編程的第一步。而IntelliJ IDEA無疑是Java開發者中最受歡迎的選擇之一。它以其強大的功能、智能的代碼輔助和簡潔的用戶界面&#xff0c;幫助無數開發者快速構建和部署Java項目…

WEB3——什么是ABI

怎么獲得ABI&#xff1f; 在編譯完合約后&#xff0c;可以在左邊下面點擊復制ABI ABI&#xff08;Application Binary Interface&#xff0c;應用二進制接口&#xff09;是用來讓前端或服務端 JavaScript 代碼與智能合約進行交互的橋梁&#xff0c;它描述了合約的函數、事件和…

移動安全Android——客戶端數據安全

本地文件權限配置 測試流程 &#xff08;1&#xff09;手機運行待測APP應用&#xff0c;adb執行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY &#xff08;2&#xff09;adb shell 進入設備&#xff0c;以Root權限進入/data/data/package包名目錄下 c…

拉普拉斯噪聲

1. 概念 拉普拉斯噪聲是一種連續概率分布生成的隨機噪聲&#xff0c;其核心特點是符合拉普拉斯分布。這種噪聲被特意添加到數據&#xff08;尤其是查詢結果或統計量&#xff09;中&#xff0c;以實現差分隱私這一嚴格的隱私保護框架。 核心目的&#xff1a; 在保護數據集中的個…

django項目開啟debug頁面操作有數據操作記錄

在項目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…

【科研繪圖系列】R語言繪制森林圖(forest plot)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息介紹 本文介紹使用R語言繪制森林圖(forest plot)的方法。首先加載必要的R包(grid、forestploter、openxlsx、stringr),導入并預處…

MySQL-8.0.42 主從延遲常見原因及解決方法

目錄 1 查看從庫延時方法 2 如何分析主從延遲 3 主從延遲的常見原因及解決方法 1 查看從庫延時方法 mysql> show slave status \G *************************** 1. row *************************** Slave_IO_Running: Yes #兩個yes說明主從復制正常 …

Kotlin 活動事件通訊跳轉深度講解

在 Android 開發的浩瀚海洋中,活動(Activity)間的事件通訊與跳轉猶如構建復雜應用程序的橋梁與紐帶,而 Kotlin 語言的加入,更是為這一過程注入了簡潔、優雅與高效的活力。本文將深入剖析 Kotlin 開發中安卓活動事件通訊跳轉的方方面面,從基礎概念到高級技巧,從代碼示例到…

[FreeRTOS- 野火] - - - 臨界段

一、介紹 臨界段最常出現在對一些全局變量進行操作的場景。 1.1 臨界段的定義 臨界段是指在多任務系統中&#xff0c;一段需要獨占訪問共享資源的代碼。在這段代碼執行期間&#xff0c;必須確保沒有任何其他任務或中斷可以訪問或修改相同的共享資源。 臨界段的主要目的是防…

Vad-R1:通過從感知到認知的思維鏈進行視頻異常推理

文章目錄 速覽摘要1 引言2 相關工作視頻異常檢測與數據集視頻多模態大語言模型具備推理能力的多模態大語言模型 3 方法&#xff1a;Vad-R13.1 從感知到認知的思維鏈&#xff08;Perception-to-Cognition Chain-of-Thought&#xff09;3.2 數據集&#xff1a;Vad-Reasoning3.3 A…

CSS Day07

1.搭建項目目錄 2.網頁頭部SEO三大標簽 3.Favicon圖標與版心 &#xff08;1&#xff09;Favicon圖標 &#xff08;2&#xff09;版心 4.快捷導航 5.頭部-布局 6.頭部-logo 7.頭部-導航 8.頭部-搜索 9頭部-購物車 10.底部-布局 11.底部-服務區域 12.底部-幫助中心 13.底部-版權…

Flutter圖片Image、本地圖片、程程圖片、圓片剪切、圓形圖片

目錄 圖片組件的介紹 1.Image.network加載圖片 1.1 Image scale圖片縮小一倍 1.2 Image alignment使用 1.3 Image fit 屬性的取值及說明 1.3.1 Contain 默認效果 1.3.2 Fill 圖片會縮放至完全填滿目標區域&#xff08;寬高&#xff09; 1.3.3 Fill 圖片會縮放至完全填滿目…