前引:在現代軟件開發中,字符串處理是幾乎所有程序的核心需求之一。無論是文本解析、網絡通信,還是用戶交互,高效且安全的字符串操作能力直接決定了代碼的質量與可維護性。而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_?修飾,只能訪問不能修改數據
例如:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【霧非霧】期待與你的下次相遇!