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

相關(guān)新聞

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

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

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

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

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

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

2026/7/29 3:36:01 閱讀更多
RAG(檢索增強(qiáng)生成)是什么?為什么很多 AI 產(chǎn)品都用它?

RAG(檢索增強(qiáng)生成)是什么?為什么很多 AI 產(chǎn)品都用它?

近年來(lái),大語(yǔ)言模型(LLM)在各類應(yīng)用中大放異彩:寫文章、代碼輔助、知識(shí)問(wèn)答……但它們也有一個(gè)致命弱點(diǎn):知識(shí)局限。 比如,ChatGPT 的訓(xùn)練數(shù)據(jù)有時(shí)間限制,它無(wú)法直接知道最新的新聞、法律法規(guī)或企…

2026/7/29 3:36:01 閱讀更多
IP地址與子網(wǎng)掩碼計(jì)算:網(wǎng)絡(luò)排錯(cuò)與規(guī)劃的必備基本功

IP地址與子網(wǎng)掩碼計(jì)算:網(wǎng)絡(luò)排錯(cuò)與規(guī)劃的必備基本功

1. 從一次真實(shí)的網(wǎng)絡(luò)故障說(shuō)起:為什么IP計(jì)算是基本功那天下午,整個(gè)辦公室的網(wǎng)絡(luò)突然變得奇慢無(wú)比,部分同事甚至完全無(wú)法訪問(wèn)內(nèi)部的文件服務(wù)器。作為團(tuán)隊(duì)里對(duì)網(wǎng)絡(luò)稍有了解的人,我被叫去幫忙。初步排查,路由器和交換機(jī)指示…

2026/7/29 4:56:04 閱讀更多
AI監(jiān)控濫用已致37起跨國(guó)訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū))

AI監(jiān)控濫用已致37起跨國(guó)訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū))

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:AI監(jiān)控濫用已致37起跨國(guó)訴訟:企業(yè)級(jí)倫理審查清單(含實(shí)時(shí)行為分析、情感識(shí)別、員工監(jiān)工三大禁區(qū)) 全球范圍內(nèi),AI驅(qū)動(dòng)的職場(chǎng)監(jiān)控系統(tǒng)正引發(fā)前所未有的法律與倫理?!?/p>

2026/7/29 4:56:04 閱讀更多
Verilog計(jì)數(shù)器設(shè)計(jì)全解析:從基礎(chǔ)原理到高級(jí)應(yīng)用與避坑指南

Verilog計(jì)數(shù)器設(shè)計(jì)全解析:從基礎(chǔ)原理到高級(jí)應(yīng)用與避坑指南

1. 從“數(shù)數(shù)”到“時(shí)序控制”:計(jì)數(shù)器的核心價(jià)值在數(shù)字電路和FPGA/ASIC設(shè)計(jì)的世界里,計(jì)數(shù)器(Counter)可能是你接觸到的第一個(gè),也是貫穿整個(gè)職業(yè)生涯最基礎(chǔ)、最核心的時(shí)序邏輯電路。它遠(yuǎn)不止是“數(shù)數(shù)”那么簡(jiǎn)單。當(dāng)你需要…

2026/7/29 4:56:04 閱讀更多
CentOS 7 C語(yǔ)言開(kāi)發(fā)環(huán)境搭建:從yum軟件包組到Hello World實(shí)戰(zhàn)

CentOS 7 C語(yǔ)言開(kāi)發(fā)環(huán)境搭建:從yum軟件包組到Hello World實(shí)戰(zhàn)

1. 項(xiàng)目概述:在CentOS 7上構(gòu)建C語(yǔ)言開(kāi)發(fā)環(huán)境很多剛接觸Linux系統(tǒng)編程的朋友,尤其是從Windows環(huán)境轉(zhuǎn)過(guò)來(lái)的,第一個(gè)攔路虎往往不是語(yǔ)法本身,而是“環(huán)境怎么搭”。在Windows下,你可能下載一個(gè)Visual Studio,安…

2026/7/29 4:56:04 閱讀更多
步進(jìn)電機(jī)驅(qū)動(dòng)器核心參數(shù)解析與實(shí)戰(zhàn)選型指南

步進(jìn)電機(jī)驅(qū)動(dòng)器核心參數(shù)解析與實(shí)戰(zhàn)選型指南

1. 項(xiàng)目概述:從“會(huì)轉(zhuǎn)”到“轉(zhuǎn)得好”的必經(jīng)之路提起步進(jìn)電機(jī),很多搞過(guò)單片機(jī)、玩過(guò)3D打印機(jī)或者DIY過(guò)一些小裝置的朋友肯定不陌生。它最大的特點(diǎn)就是“聽(tīng)話”——給一個(gè)脈沖,它就轉(zhuǎn)一個(gè)固定的角度,開(kāi)環(huán)控制,結(jié)構(gòu)簡(jiǎn)單&a…

2026/7/29 4:46:03 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

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

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

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果。…

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