C++ string詳解:從底層原理到常用操作全面掌握std::string
1. 什么是string在C中字符串有兩種表示方式C風(fēng)格字符串C-style stringC標(biāo)準(zhǔn)庫提供的string類C語言中使用字符數(shù)組表示字符串char str[] hello;本質(zhì)上h e l l o \0字符串末尾需要一個(gè)\0表示結(jié)束。但是C風(fēng)格字符串存在很多問題需要手動(dòng)管理空間容易發(fā)生越界字符串拼接復(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ì)上是一個(gè)管理字符數(shù)組的類。它幫我們完成動(dòng)態(tài)擴(kuò)容內(nèi)存釋放字符串拼接查找替換長度管理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說明雖然字符串只有5個(gè)字符但是內(nè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()返回字符串長度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訪問字符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最簡單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;過程刪除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);問題容易越界不知道長度需要手動(dòng)管理stringstring shello; sworld;優(yōu)勢自動(dòng)管理內(nèi)存接口豐富安全性更高支持STL算法16. string使用注意事項(xiàng)1. size返回unsigned類型例如錯(cuò)誤for(int is.size()-1;i0;i--)因?yàn)閟ize_t是無符號(hào)類型可能導(dǎo)致死循環(huán)。推薦for(int i(int)s.size()-1;i0;i--)2. 修改字符串不能越界錯(cuò)誤string shello; s[10]a;屬于非法訪問。3. 不要頻繁拼接大字符串例如string s; for(int i0;i100000;i) { shello; }可能頻繁擴(kuò)容。優(yōu)化s.reserve(500000);提前開空間。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é)功能接口長度size()容量capacity()清空clear()判斷為空empty()訪問字符[]、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ī)制深淺拷貝問題STL容器設(shè)計(jì)思想掌握string以后可以為后續(xù)學(xué)習(xí)vectorlistmapunordered_mapSTL算法打下非常好的基礎(chǔ)。一句話總結(jié)C語言告訴我們字符串是什么C string告訴我們?nèi)绾蝺?yōu)雅、安全、高效地管理字符串。

相關(guān)新聞

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

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

1. 從“老兵”視角看C的當(dāng)下與未來最近在社區(qū)里,看到不少關(guān)于“C是否過時(shí)”、“學(xué)C還有沒有前途”的討論。作為一個(gè)從大學(xué)就開始摸C,在工業(yè)界用它寫過嵌入式驅(qū)動(dòng)、游戲引擎、高頻交易系統(tǒng),也用它調(diào)過無數(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)行挖掘。這活兒聽起來簡單,不就是看看用戶說了啥嘛,但真做起來,從數(shù)據(jù)清洗到得出有商業(yè)價(jià)值的結(jié)論&…

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

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

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

2026/7/29 3:36:01 閱讀更多
基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

隨著金稅四期全面上線,傳統(tǒng)財(cái)稅系統(tǒng)在面對(duì)海量高頻風(fēng)險(xiǎn)預(yù)警指標(biāo)時(shí),常因數(shù)據(jù)孤島和規(guī)則硬編碼導(dǎo)致合規(guī)響應(yīng)滯后。企業(yè)在進(jìn)行IPO財(cái)務(wù)規(guī)范或高企申報(bào)時(shí),業(yè)財(cái)數(shù)據(jù)不一致往往成為致命瓶頸。本文將結(jié)合高頓咨詢?cè)贐端財(cái)稅數(shù)字化領(lǐng)域的工程實(shí)踐&#…

2026/7/29 9:26:11 閱讀更多
Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

1. 項(xiàng)目概述:為什么Flexx應(yīng)用需要特別的安全關(guān)注? 最近在社區(qū)里看到不少朋友開始用Flexx來開發(fā)桌面應(yīng)用,尤其是那些想把Web應(yīng)用打包成獨(dú)立桌面程序的項(xiàng)目。Flexx這個(gè)框架確實(shí)挺有意思,它讓你能用純Python寫前端界面,然…

2026/7/29 9:26:11 閱讀更多
Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

1. 項(xiàng)目概述:當(dāng)Go遇上C,兩種“類”思維的碰撞在編程語言的演進(jìn)長河中,面向?qū)ο缶幊?amp;#xff08;OOP)無疑是一座重要的里程碑。當(dāng)我們談?wù)摗邦悺睍r(shí),腦海中首先浮現(xiàn)的可能是Java、C這類以類為第一公民的語言。但今天&…

2026/7/29 9:26:11 閱讀更多
Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

1. 從旋鈕到光暈:一個(gè)燈光調(diào)節(jié)器的誕生 最近在整理工作室的舊物,翻出來一塊吃灰已久的Arduino Edison開發(fā)板??粗?amp;#xff0c;我忽然想起很多朋友,包括當(dāng)年的我自己,在入門嵌入式開發(fā)時(shí),常常會(huì)卡在一個(gè)看似簡單卻至…

2026/7/29 9:26:11 閱讀更多
國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

一、2026 網(wǎng)站建設(shè)行業(yè)現(xiàn)狀深度解析生成式 AI、GEO 搜索優(yōu)化、llms 協(xié)議規(guī)范、多系統(tǒng)數(shù)據(jù)互通等新技術(shù)落地,市場對(duì)網(wǎng)站建設(shè)服務(wù)商的能力要求發(fā)生根本性分層。中大型企業(yè)、上市公司、出海品牌更青睞兼具行業(yè)深耕、定制開發(fā)、AI 營銷配套、長期運(yùn)維迭代能力的綜合服務(wù)…

2026/7/29 9:26:11 閱讀更多
Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn) 一、從"一個(gè) Agent 一個(gè)項(xiàng)目"到"Agent 平臺(tái)":工程化必經(jīng)之路 2026 年初,某 SaaS 公司面臨一個(gè)困境:過去一年,他們?yōu)椴煌蛻粜枨箝_發(fā)了…

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

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

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

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

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

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

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