【C++進階】深入STL之string:掌握高效字符串處理的關鍵

📝個人主頁🌹:Eternity._
?收錄專欄?:C++ “ 登神長階 ”
🤡往期回顧🤡:C++模板入門
🌹🌹期待您的關注 🌹🌹

在這里插入圖片描述

在這里插入圖片描述

?STL之string

  • 📒1. STL基本介紹
    • 🎈STL的版本
    • 🎩STL的缺陷
  • 📒2. string類的基本概念
  • 📒3. string類的常用操作
    • 🌈string類對象的常見構造
    • 🌞string類對象的容量操作
    • 🌙string類對象的訪問及遍歷操作
    • ?string類對象的修改操作
  • 📒4. 總結拓展
    • 🔥拓展:getline
    • 💧總結


前言:STL(Standard Template Library,標準模板庫)是C++標準庫的重要組成部分,它提供了一系列通用的數據結構和算法。在STL中,string類是一個非常重要的容器,用于處理字符串數據。本文將詳細介紹STL中的string類,包括其基本概念、常用操作以及使用示例

STL的六大組件
在這里插入圖片描述

📒1. STL基本介紹

🎈STL的版本

  • 原始版本
    Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版本,本著開源精神,他們聲明允許任何人任意運用、拷貝、修改、傳播、商業使用這些代碼,無需付費。唯一的條件就是也需要向原始版本一樣做開源使用。 HP 版本–所有STL實現版本的始祖。
  • P. J. 版本
    由P. J. Plauger開發,繼承自HP版本,被Windows Visual C++采用,不能公開或修改,缺陷:可讀性比較低,符號命名比較怪異。
  • RW版本
    由Rouge Wage公司開發,繼承自HP版本,被C+ + Builder 采用,不能公開或修改,可讀性一般。
  • SGI版本
    由Silicon Graphics Computer Systems,Inc公司開發,繼承自HP版 本。被GCC(Linux)采用,可移植性好,可公開、修改甚至販賣,從命名風格和編程 風格上看,閱讀性非常高。我們后面學習STL要閱讀部分源代碼,主要參考的就是這個版本

🎩STL的缺陷

  • STL庫的更新太慢了。這個得嚴重吐槽,上一版靠譜是C++98,中間的C++03基本一些修訂。C++11出來已經相隔了13年,STL才進一步更新。
  • STL現在都沒有支持線程安全。并發環境下需要我們自己加鎖。且鎖的粒度是比較大的。
  • STL極度的追求效率,導致內部比較復雜。比如類型萃取,迭代器萃取。
  • STL的使用會有代碼膨脹的問題,比如使用vector/vector/vector這樣會生成多份代碼,當然這是模板語法本身導致的

📒2. string類的基本概念

string類是一個模板類,專門用于處理字符串數據。 在C++中,字符串是由一系列字符組成的序列,而string類則提供了對這些字符序列進行高效操作的功能。與傳統的C語言風格字符串(以\0結尾的字符數組)相比,string類更加安全和易用,因為它會自動管理內存,并提供了豐富的成員函數來操作字符串
在這里插入圖片描述


string類成員函數:

class string
{
private:char* ——str;int _capacity;int _size;
};

在這里插入圖片描述


📒3. string類的常用操作

🌈string類對象的常見構造

函數名稱功能說明
string()構造空的string類對象,即空字符串
string(const char* s)用const對象來構造string類對象
string(size_t n, char c)string類對象中包含n個字符c
string(s.begin(), s.end())用迭代區間構造
string(const string&s)拷貝構造函數
int main()
{string s1(); // 空字符串string s2("hello world"); // const對象構造string類對象string s3(10, 'x'); // n個字符c構造string s4(s2.begin(), s2.end()); // 用迭代區間構造string s5 = s2; // 拷貝構造return 0;
}

注意:在這里迭代器類似于指針!


🌞string類對象的容量操作

函數名稱功能說明
size返回字符串有效字符長度
length返回字符串有效字符長度
capacity返回空間總大小
empty檢測字符串釋放為空串,是返回true,否則返回false
clear清空有效字符
reserve為字符串預留空間
resize將有效字符的個數該成n個,多出的空間用字符c填充
int main()
{string s("hello world");// 返回字符串有效字符長度cout << s.size() << endl;cout << s.length() << endl;// 返回空間總大小cout << s.capacity() << endl;// 檢測字符串釋放為空串,是返回true,否則返回falsecout << s.empty() << endl;// 清空有效字符s.clear();cout << "clear after: " << s << endl;// 為字符串預留空間s.reserve(100); // 一般會多預留空間cout << "reserve(100)after: " << s.size() << endl;cout << "reserve(100)after: " << s.capacity() << endl;cout << endl;// 將有效字符的個數該成n個,多出的空間用字符c填充s.resize(100);cout << "resize(100)after: " << s.size() << endl;cout << "resize(100)after: " << s.capacity() << endl;return 0;
}

在這里插入圖片描述

注意:

  • size()與length()方法底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。
  • clear()只是將string中有效字符清空,不改變釋放空間
  • reserve()只會變大,如果是將元素個數減少,底層空間總大小不變
  • resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變

🌙string類對象的訪問及遍歷操作

函數名稱功能說明
operator[ ]返回pos位置的字符,const string類對象調用
begin+ end begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
rbegin + rend begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭器
范圍forC++11支持更簡潔的范圍for的新遍歷方式
int main()
{string s("hello world");for (int i = 0; i < s.size(); i++){cout << s[i];}cout << endl;// 迭代器string::iterator it = s.begin();while (it != s.end()){cout << *it;it++;}cout << endl;// 范圍forfor (auto ch : s){cout << ch;}cout << endl;return 0;
}

關于迭代器
在這里插入圖片描述
迭代器的用法像指針一樣能夠+–也可以解引用拿到指向的內容


?string類對象的修改操作

函數名稱功能說明
push_back在字符串后尾插字符c
append在字符串后追加一個字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos從字符串pos位置開始往后找字符c,返回該字符在字符串中的位置
rfind從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置
substr在str中從pos位置開始,截取n個字符,然后將其返回

注意:npos是無符號的整形,值為-1,npos是int的最大值
在這里插入圖片描述


int main()
{string s1("h");// 插入字符s1.push_back('e');//插入字符串s1.append("llo ");s1 += "world";// 將s1變成 hello world//c_str函數返回字符串從\0結尾的字符串,但是c++中的字符串不一定s1 += '\0';s1 += "aaa";cout << s1 << endl; // hello worldaaacout << s1.c_str() << endl; // hello world// find  從pos位置開始查找字符并返回其位置// rfind  從pos位置開始往前查找字符并返回其位置int ret = s1.find('l',3);cout << s1[++ret] << endl; // o//substr  從ret位置開始截取pos個字符,如果pos不傳參數將會截取到最后string s2 = s1.substr(0);cout << s2 << endl; // hello worldaaareturn 0;
}

這里要注意的是:

  • c_str,C格式字符串是以’\0’結尾的但是C++里面不一定
  • substr,當我們沒有結束位置時,它會遍歷完整個字符串
  • 關于修改操作其實還有inserterase,但是這兩個涉及挪動數據,效率不高,能不用就不用
string s1("hello world!!!");
// 頭插
s1.insert(0, 1, 'x');
// 刪除
s1.erase(0,5);

我們來查閱一下這三個函數
在這里插入圖片描述
insert可以在pos位置插入一個字符,一個字符串或者一個string類甚至還可以指定插入字符串的長度,insert接口有很多
在這里插入圖片描述
erase可以刪除從pos位置往后len個字符,如果pos不傳參數,則從0位置刪除npos個
在這里插入圖片描述


📒4. 總結拓展

🔥拓展:getline

getline是用于從輸入流中讀取一行字符串并保存到指定的字符串變量中的函數,直到遇到換行符或達到指定的最大字符數

在這里插入圖片描述
代碼演示:

int main()
{string s;getline(cin, s);cout << s << endl;cout << endl;cin >> s;cout << s << endl;return 0;
}

在這里插入圖片描述

💧總結

在深入學習和掌握了STL中string類的運用后,我們可以深刻感受到C++在處理字符串時的靈活性和高效性。通過合理利用string提供的各種成員函數和特性,實現更加高效且易于維護的代碼。對于學習后面的STL容器也有很大幫助!

在這里插入圖片描述
謝謝大家支持本篇到這里就結束了,祝大家天天開心!

在這里插入圖片描述

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

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

相關文章

前端(JS)對URL的編碼和解碼方式以及重要性——IE瀏覽器必須對中文URL進行編碼

工作記錄-前端——前端&#xff08;JS&#xff09;對URL的編碼和解碼方式以及重要性——IE瀏覽器必須對中文URL進行編碼 創作場景前端JS對URL的三種編碼和解碼方式1. escape 和 unescape2. encodeURI 和 decodeURI3. encodeURIComponent 和 decodeURIComponent 本文重點 創作場…

net語言編程:深入探索其奧秘與挑戰

net語言編程&#xff1a;深入探索其奧秘與挑戰 在當今信息化社會&#xff0c;編程語言如同構建數字世界的磚瓦&#xff0c;而net語言編程便是其中的一顆璀璨明珠。它以其獨特的魅力吸引著無數開發者&#xff0c;但同時也伴隨著一系列令人困惑和充滿挑戰的問題。本文將從四個方…

大模型學習資料整理:如何從0到1學習大模型,搭建個人或企業RAG系統,如何評估與優化(更新中...)

通過本文您可以了解到&#xff1a; 學習&#xff1a;從小白如何入手&#xff0c;從0到1開始學習大模型。RAG系統&#xff1a;我想搭建屬于自己或者企業的RAG系統&#xff0c;我該怎么去做&#xff1f;評估&#xff1a;微調后的模型或者RAG系統&#xff0c;如何評估自己的模型和…

windows配置dns訪問git , 加快訪問速度保姆級教程

設置 DNS 訪問 Git 需要修改電腦的 DNS 配置。下面是具體的操作流程&#xff1a; 第一步&#xff1a;打開命令提示符或終端窗口 在 Windows 系統中&#xff0c;可以按下 Win R 組合鍵&#xff0c;然后輸入 “cmd”&#xff0c;按下 Enter 鍵打開命令提示符窗口。在 macOS 或 …

【活動】GPT-4O:AI語言生成技術的新里程碑

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 GPT-4O&#xff1a;AI語言生成技術的新里程碑引言GPT系列簡史回顧GPT-1: 初露鋒…

國際薦酒師(香港)協會亮相香港國際葡萄酒和烈酒展覽會

2024年5月28日至30日&#xff0c;備受矚目的香港國際葡萄酒和烈酒展覽會VINEXPO Hong Kong在香港盛大舉辦。作為亞太區最盛大的葡萄酒展會&#xff0c;本屆展會不僅吸引了全球葡萄酒和烈酒行業的目光&#xff0c;更見證了國際薦酒師&#xff08;香港&#xff09;協會&#xff0…

(2) qml誕生的原因 和Qt Creator開發環境的介紹

文章目錄 qml誕生原因Qt Quick應?程序Qt Creator環境1、MSVC2、MinGWMSVC的優缺點MinGW的優缺點 最后的選擇延伸閱讀 一些常用的快捷鍵統一格式化代碼統一qml 語言的格式Locator 定位器幫助 qml誕生原因 可以在Qt5中開發的不同類型的經典應?程序。桌?應?程 序正在發?著改…

物聯網斷點續傳

斷點續傳是一種在網絡傳輸中斷后&#xff0c;能夠從中斷的位置繼續傳輸的技術。它可以有效地避免因為網絡不穩定、服務器故障、用戶操作等原因導致的傳輸失敗&#xff0c;節省了用戶的時間和流量&#xff0c;提高了傳輸的效率和可靠性。斷點續傳在很多場景中都有廣泛的應用&…

GIS結合物聯網:塑造智慧地球的新篇章

在信息技術飛速發展的今天&#xff0c;地理信息系統&#xff08;GIS&#xff09;與物聯網&#xff08;IoT&#xff09;的深度融合&#xff0c;正以前所未有的方式重塑著我們對世界的認知。本文將深入探討GIS與物聯網結合的原理、應用實踐以及面臨的挑戰與未來展望&#xff0c;共…

鄉村振興與鄉村旅游品牌化:打造具有地方特色的鄉村旅游品牌,提升鄉村旅游吸引力,促進美麗鄉村建設

目錄 一、引言 二、鄉村旅游品牌化的重要性 &#xff08;一&#xff09;增強鄉村旅游的辨識度 &#xff08;二&#xff09;提升鄉村旅游的附加值 &#xff08;三&#xff09;促進鄉村文化的傳承與創新 三、打造具有地方特色的鄉村旅游品牌 &#xff08;一&#xff09;明…

Python知識點6---列表和元組

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的列表和和元組定義方式如下&#xff0c;且注意列表和元組擁有…

【深度強化學習入門:結合直覺與算法的學習之旅】

文章目錄 前言深度強化學習的關鍵要素簡單的深度Q網絡&#xff08;DQN&#xff09;實現分析代碼結論 前言 深度強化學習結合了深度學習的表征學習能力和強化學習的決策制定機制&#xff0c;這使得機器能夠在復雜環境中自我學習并做出合理的行動策略。它在游戲玩耍、自動駕駛、…

Linux實驗報告(二)——Linux系統中的常用命令

目錄 一、實驗名稱&#xff1a; 二、儀器、設備&#xff1a; 三、參考資料&#xff1a; 四、實驗目的&#xff1a; 五、實驗內容&#xff08;步驟&#xff09;&#xff1a; 六、實驗數據&#xff08;程序&#xff09;記錄&#xff1a; ?編輯 ?編輯 七、實驗結果分析…

Python知識點9---推導式

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python提供的推導式&#xff0c;只對列表、字典、集合三種數據類型生…

公司網站模板制作

公司網站模板的制作是一項極其重要的工作&#xff0c;因為網站模板決定了網站的整體風格和用戶體驗。一個漂亮、易用的網站模板將會吸引更多的用戶&#xff0c;而一個糟糕的網站模板則會讓用戶不供選擇。下面就讓我們介紹一下公司網站模板的制作。 首先&#xff0c;一個好的網站…

iCold編程入門:探索未知的編程世界

iCold編程入門&#xff1a;探索未知的編程世界 在浩瀚的數字宇宙中&#xff0c;iCold編程猶如一顆璀璨的新星&#xff0c;吸引著無數好奇而勇敢的探險家。然而&#xff0c;對于初學者來說&#xff0c;這個神秘的世界往往充滿了未知與挑戰。今天&#xff0c;我們就將一同踏入這…

前端 CSS 經典:mac docker 效果

前言&#xff1a;瀏覽器上實現 mac docker 效果&#xff0c;實現思路&#xff0c;1. 布局&#xff0c;方框間距用元素代替&#xff0c;因為有放大縮小功能&#xff0c;不用元素的話&#xff0c;不好控制。2. 定義個 css 變量 i&#xff0c;用來代表放大比例。3. 確定每個元素的…

信息系統項目管理師軟考高級論文教程必過論文分享

很多人提到軟考就會想到信息系統項目管理師和系統集成項目管理工程師&#xff0c;這兩個不同的軟考內容的區別不僅僅在于一個是高級&#xff0c;一個是中級&#xff0c;還有一個區別是它們的考試內容也是不同的&#xff0c;高級的信息系統項目管理師考試多了一項論文的考試&…

K-means 聚類算法和K-means ++聚類算法詳解【5】

1、通俗易懂的講解鏈接 補充鏈接&#xff0c;K- means算法的K值選擇策略&#xff1a;鏈接一&#xff0c;鏈接二???????&#xff1b; 后續關鍵點漸次補充

MySQL入門學習-查詢進階.正則表達式

在 MySQL 中&#xff0c;正則表達式是用于匹配文本模式的工具。正則表達式可以用于在查詢中進行模式匹配&#xff0c;以便更精確地查找和操作數據。 一、以下是一些常見的查詢進階操作和正則表達式的特點、使用方法以及與其他比較和高級應用的示例&#xff1a; 1. LIKE操作符…