C++ string詳解:從底層原理到常用操作全面掌握std::string
1. 什么是string在C中字符串有兩種表示方式C風格字符串C-style stringC標準庫提供的string類C語言中使用字符數(shù)組表示字符串char str[] hello;本質(zhì)上h e l l o \0字符串末尾需要一個\0表示結(jié)束。但是C風格字符串存在很多問題需要手動管理空間容易發(fā)生越界字符串拼接復雜容易造成內(nèi)存泄漏例如char str1[20] hello; char str2[] world; strcat(str1, str2);程序員必須提前考慮數(shù)組空間是否足夠。C提供了std::string類解決這些問題。使用#include iostream #include string using namespace std; int main() { string s hello; cout s endl; return 0; }輸出hellostring本質(zhì)上是一個管理字符數(shù)組的類。它幫我們完成動態(tài)擴容內(nèi)存釋放字符串拼接查找替換長度管理2. string的底層結(jié)構(gòu)string內(nèi)部大致包含class string { private: char* _str; // 指向字符串空間 size_t _size; // 當前有效字符數(shù)量 size_t _capacity; // 容量 };例如string s hello;內(nèi)存類似_str | v ------------------- | h | e | l | l | o | \0 | ------------------- size 5 capacity 5注意size表示有效字符數(shù)量。capacity表示當前申請的空間大小。例如string shello; couts.size()endl; couts.capacity()endl;可能輸出5 15說明雖然字符串只有5個字符但是內(nèi)部可能提前開辟15個空間。3. string的構(gòu)造函數(shù)3.1 默認構(gòu)造創(chuàng)建空字符串string s;相當于3.2 使用字符串初始化string s(hello);或者string shello;3.3 拷貝構(gòu)造string s1hello; string s2(s1);結(jié)果s1: hello s2: hello兩個對象內(nèi)容一樣。3.4 創(chuàng)建n個相同字符格式string(size_t n,char c);例如string s(5,a); couts;輸出aaaaa4. string容量相關(guān)接口size()返回字符串長度string shello; couts.size();輸出5length()功能和size一樣couts.length();推薦size()因為STL容器統(tǒng)一使用size。capacity()查看容量string shello; couts.capacity();empty()判斷是否為空string s; if(s.empty()) { cout空字符串; }clear()清空字符串string shello; s.clear(); couts;結(jié)果注意clear只是清除內(nèi)容。不會釋放空間。例如string shello; couts.capacity(); s.clear(); couts.capacity();容量通常不變。5. string訪問字符operator[]最常用string shello; couts[0];輸出h修改s[0]H; couts;結(jié)果Helloat()和[]類似couts.at(0);區(qū)別[]越界不會檢查。at():越界會拋異常。例如string shello; couts.at(100);會產(chǎn)生out_of_range異常6. string遍歷方法1for循環(huán)string shello; for(size_t i0;is.size();i) { couts[i] ; }輸出h e l l o方法2范圍forC11支持for(auto ch:s) { coutch; }方法3迭代器string shello; string::iterator its.begin(); while(it!s.end()) { cout*it; it; }7. string拼接operator最簡單string s1hello; string s2world; string s3s1s2; couts3;輸出helloworldappend()追加字符串string shello; s.append( world); couts;輸出hello worldpush_back()尾插一個字符string shello; s.push_back(!); couts;輸出hello!注意push_back只能插入一個字符。錯誤s.push_back(abc);8. string插入insert()格式insert(pos,string)例如string shello; s.insert(5, world); couts;結(jié)果hello world9. string刪除erase()刪除指定位置string shello; s.erase(1,2); couts;過程刪除e l結(jié)果hlo格式erase(pos,len)刪除最后一個字符s.pop_back();例如string shello; s.pop_back(); couts;輸出hell10. string查找find()查找字符串string shello world; size_t poss.find(world); coutpos;輸出6如果找不到返回string::npos例如if(s.find(abc)string::npos) { cout不存在; }rfind()從后往前查找string shello hello; couts.rfind(hello);輸出611. string替換replace()格式replace(pos,len,string)例如string shello; s.replace(0,5,world); couts;結(jié)果world12. string截取子串substr()格式substr(pos,len)例如string shello world; string subs.substr(6,5); coutsub;輸出world13. string和C字符串轉(zhuǎn)換string轉(zhuǎn)char*不能直接string shello; char* ps;錯誤。使用s.c_str();例如string shello; printf(%s,s.c_str());char*轉(zhuǎn)string直接char str[]hello; string sstr;即可。14. string的擴容機制當字符串空間不足時舊空間 | v [hello] 插入: [hello world] 重新申請更大空間 復制數(shù)據(jù) 釋放舊空間類似vector。擴容通常是1.5倍 或者 2倍不同編譯器實現(xiàn)不同。例如string s; for(int i0;i100;i) { s.push_back(a); couts.capacity()endl; }可以觀察容量變化。15. string為什么比char數(shù)組方便char數(shù)組char a[100]; strcpy(a,hello); strcat(a,world);問題容易越界不知道長度需要手動管理stringstring shello; sworld;優(yōu)勢自動管理內(nèi)存接口豐富安全性更高支持STL算法16. string使用注意事項1. size返回unsigned類型例如錯誤for(int is.size()-1;i0;i--)因為size_t是無符號類型可能導致死循環(huán)。推薦for(int i(int)s.size()-1;i0;i--)2. 修改字符串不能越界錯誤string shello; s[10]a;屬于非法訪問。3. 不要頻繁拼接大字符串例如string s; for(int i0;i100000;i) { shello; }可能頻繁擴容。優(yōu)化s.reserve(500000);提前開空間。17. reserve和resize區(qū)別這是string里面非常重要的知識。reserve()改變?nèi)萘縮tring s; s.reserve(100);結(jié)果capacity100 size0不會初始化字符。resize()改變有效字符數(shù)量string s; s.resize(10);結(jié)果size10里面產(chǎn)生10個\0。區(qū)別接口改變是否初始化reserve容量否resize大小是18. string總結(jié)功能接口長度size()容量capacity()清空clear()判斷為空empty()訪問字符[]、at()尾插字符push_back()刪除尾字符pop_back()拼接、append()插入insert()刪除erase()查找find()替換replace()截取substr()預留空間reserve()調(diào)整大小resize()總結(jié)std::string是C中最常用的字符串類它本質(zhì)上是一個動態(tài)管理字符數(shù)組的類。學習string不僅是學習幾個接口更重要的是理解string如何管理內(nèi)存size和capacity區(qū)別擴容機制深淺拷貝問題STL容器設(shè)計思想掌握string以后可以為后續(xù)學習vectorlistmapunordered_mapSTL算法打下非常好的基礎(chǔ)。一句話總結(jié)C語言告訴我們字符串是什么C string告訴我們?nèi)绾蝺?yōu)雅、安全、高效地管理字符串。

相關(guān)新聞

C++實戰(zhàn)指南:從核心價值到現(xiàn)代工具鏈,探索高性能編程的未來

C++實戰(zhàn)指南:從核心價值到現(xiàn)代工具鏈,探索高性能編程的未來

1. 從“老兵”視角看C的當下與未來最近在社區(qū)里,看到不少關(guān)于“C是否過時”、“學C還有沒有前途”的討論。作為一個從大學就開始摸C,在工業(yè)界用它寫過嵌入式驅(qū)動、游戲引擎、高頻交易系統(tǒng),也用它調(diào)過無數(shù)“段錯誤”和“內(nèi)存泄漏”的老兵&…

2026/7/29 3:46:02 閱讀更多
Python中文文本分析實戰(zhàn):從酒店評價挖掘商業(yè)洞察

Python中文文本分析實戰(zhàn):從酒店評價挖掘商業(yè)洞察

1. 項目概述:從酒店評價中挖掘商業(yè)洞察最近在復盤一個挺有意思的數(shù)據(jù)分析小項目,核心任務是對一堆酒店評價文本進行挖掘。這活兒聽起來簡單,不就是看看用戶說了啥嘛,但真做起來,從數(shù)據(jù)清洗到得出有商業(yè)價值的結(jié)論&…

2026/7/29 3:36:01 閱讀更多
共筑國產(chǎn) FPGA 生態(tài)!ALINX 攜車載視頻解決方案亮相 2026 紫光同創(chuàng)開發(fā)者大會

共筑國產(chǎn) FPGA 生態(tài)!ALINX 攜車載視頻解決方案亮相 2026 紫光同創(chuàng)開發(fā)者大會

以“算力重構(gòu)、智創(chuàng)無界”為主題的“2026紫光同創(chuàng)開發(fā)者大會”深圳站與成都站圓滿落幕。本次大會匯聚了來自通信網(wǎng)絡(luò)、工業(yè)控制、汽車電子、數(shù)據(jù)中心、邊緣AI、測試測量等領(lǐng)域的 300 余名工程師、行業(yè)伙伴與生態(tài)開發(fā)者,圍繞國產(chǎn) FPGA 技術(shù)創(chuàng)新、AI 推理系統(tǒng)方案、工…

2026/7/29 9:46:23 閱讀更多
Pinia持久化在UniApp中的實踐與優(yōu)化

Pinia持久化在UniApp中的實踐與優(yōu)化

1. 為什么需要Pinia持久化? 在UniApp和小程序開發(fā)中,狀態(tài)管理一直是開發(fā)者面臨的痛點問題。傳統(tǒng)Vuex在跨平臺兼容性和TypeScript支持上存在明顯短板,而Pinia作為新一代狀態(tài)管理庫,憑借其輕量級、模塊化和完美的TS支持迅速成為主流…

2026/7/29 9:46:23 閱讀更多
視頻孿生三劍客的技術(shù)范式迭代:數(shù)學幾何驅(qū)動空間重構(gòu) VS 傳統(tǒng)多邊形貼圖建模技術(shù)對比解析白皮書 V1.0

視頻孿生三劍客的技術(shù)范式迭代:數(shù)學幾何驅(qū)動空間重構(gòu) VS 傳統(tǒng)多邊形貼圖建模技術(shù)對比解析白皮書 V1.0

視頻孿生三劍客的技術(shù)范式迭代:數(shù)學幾何驅(qū)動空間重構(gòu) VS 傳統(tǒng)多邊形貼圖建模出品單位:鏡像視界(浙江)科技有限公司 學術(shù)支撐:華東師范大學鏡像視界浙江普陀時空大數(shù)據(jù)應用技術(shù)聯(lián)合研究院 版本:V1.0&#xf…

2026/7/29 9:46:23 閱讀更多
從二維監(jiān)控到三維鏡像:鏡像視界攜手三劍客,如何用空間AI推演重塑城市安防新范式?技術(shù)白皮書V1.0

從二維監(jiān)控到三維鏡像:鏡像視界攜手三劍客,如何用空間AI推演重塑城市安防新范式?技術(shù)白皮書V1.0

從二維監(jiān)控到三維鏡像:鏡像視界攜手三劍客,如何用空間AI推演重塑城市安防新范式技術(shù)白皮書V1.0出品單位:鏡像視界(浙江)科技有限公司 學術(shù)支撐:華東師范大學鏡像視界浙江普陀時空大數(shù)據(jù)應用技術(shù)聯(lián)合研究院 …

2026/7/29 9:46:23 閱讀更多
Webhook端點防護實戰(zhàn):基于Nginx的智能限流與IP管理方案

Webhook端點防護實戰(zhàn):基于Nginx的智能限流與IP管理方案

1. 項目概述:為什么你的Webhook端點需要一個“智能門衛(wèi)” 如果你正在使用Webhook.site來調(diào)試、測試或臨時接收來自各種服務的Webhook回調(diào),那你一定遇到過這樣的場景:某個服務因為配置錯誤,在短時間內(nèi)瘋狂地向你的端點發(fā)送了成千上…

2026/7/29 9:36:23 閱讀更多
面試官大笑:“一個任務拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個任務拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個問題:在 Claude Code 里把一個任務拆給 5 個 Subagent 并行跑,結(jié)果可能比 1 個 agent 從頭干到尾還慢? 大多數(shù)人的第一反應是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多