【C++ 】string類操作全解析

1. 為什么學習 string 類?

1.1 C 語言中的字符串

C 語言中,字符串是以'\0'結尾的一些字符的集合,為了操作方便,C 標準庫中提供了一些 str 系列的庫函數,

但是這些庫函數與字符串是分離開的,不太符合 OOP (面向對象程序設計)的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問

2.標準庫中的 string 類

2.1 string 類的常用接口說明(注意下面只講解最常用的接口)

(constructor)函數名稱

功能說明

string() (重點)

構造空的 string 類對象,即空字符串

string(const char* s) (重點)

用 C-string 來構造 string 類對象

string(size_t n, char c)

string 類對象中包含 n 個字符 c

string(const string&s) (重點)

拷貝構造函數

void Teststring() 
{  string s1; // 構造空的string類對象s1  string s2("hello bit"); // 用C格式字符串構造string類對象s2  string s3(s2); // 拷貝構造s3 
}

2.2string 類對象的容量操作

函數名稱功能說明
size(重點)返回字符串有效字符的長度
length返回字符串有效字符的長度(與 size 功能一致)
capacity返回字符串當前分配的總空間大小(包括未使用的預留空間)
empty(重點)檢測字符串是否為空串,若是則返回 true,否則返回 false
clear(重點)清空字符串中的有效字符(不改變空間總大小,僅將 size 置為 0)
reserve(重點)為字符串預留指定大小的空間,用于減少后續插入操作的內存分配次數
resize(重點)將有效字符的個數調整為 n 個:
- 若 n 小于當前 size,則截斷字符串;
- 若 n 大于當前 size,則用指定字符 c(默認 '\0')填充多出的部分

示例:

#include <iostream>
#include <string>
using namespace std;int main() {// 初始化一個字符串string str = "Hello";cout << "初始字符串: " << str << endl;// 1. size() 和 length():返回有效字符長度(功能一致)cout << "\n1. size() = " << str.size() << endl;cout << "   length() = " << str.length() << endl;// 2. capacity():返回當前總空間大小(包括預留空間)cout << "\n2. 初始 capacity = " << str.capacity() << endl;// 3. reserve(n):預留空間(不改變有效字符數)str.reserve(20);  // 預留至少20個字符的空間cout << "   調用 reserve(20) 后,capacity = " << str.capacity() << endl;cout << "   此時 size = " << str.size() << "(reserve不改變有效字符數)" << endl;// 4. resize(n):調整有效字符數(截斷或填充)cout << "\n3. 原字符串: " << str << endl;str.resize(8, '!');  // 擴展到8個字符,新增部分用'!'填充cout << "   調用 resize(8, '!') 后: " << str << endl;cout << "   此時 size = " << str.size() << ", capacity = " << str.capacity() << endl;str.resize(3);  // 截斷到3個字符cout << "   調用 resize(3) 后: " << str << endl;cout << "   此時 size = " << str.size() << ", capacity = " << str.capacity() << endl;// 5. empty():檢測是否為空串cout << "\n4. 字符串是否為空? " << (str.empty() ? "是" : "否") << endl;// 6. clear():清空有效字符(size置0,capacity不變)str.clear();cout << "   調用 clear() 后,字符串: \"" << str << "\"" << endl;cout << "   此時 size = " << str.size() << ", capacity = " << str.capacity() << endl;cout << "   清空后是否為空? " << (str.empty() ? "是" : "否") << endl;return 0;
}

注意:

1. size()與 length()方法底層實現原理完全相同,引入 size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用 size()。

2. clear()只是將 string 中有效字符清空,不改變底層空間大小。

3.resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到 n 個,不同的是當字符個數增多時:resize(n)用 0 來填充多出的元素空間,resize(size_t n, char c)用字符 c 來填充多出的元素空間。注意:resize 在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變。

4.reserve(size_t res_arg=0):為 string 預留空間,不改變有效元素個數,當 reserve 的參數小于 string 的底層空間總大小時,reserver 不會改變容量大小。

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

函數 / 特性名稱功能說明
operator[](重點)返回字符串中 pos 位置的字符。其中,const string 類對象調用時返回不可修改的字符(const char&),非 const 對象調用時返回可修改的字符(char&)。
begin() + end()begin() 獲取指向字符串第一個字符的迭代器;end() 獲取指向字符串最后一個字符下一個位置的迭代器(作為遍歷結束標志)。兩者配合可遍歷整個字符串。
rbegin() + rend()rbegin() 獲取指向字符串最后一個字符的反向迭代器(用于逆向遍歷的起始);rend() 獲取指向字符串第一個字符前一個位置的反向迭代器(作為逆向遍歷結束標志)。兩者配合可逆向遍歷整個字符串。
范圍 for 循環C++11 新增的簡潔遍歷方式,可自動遍歷字符串中的每個字符(語法:for (char c : str) { ... }),本質是迭代器的語法糖,遍歷過程中會自動處理迭代器的移動和邊界判斷。

這份代碼展示了 C++ string的多種元素訪問和遍歷方式:

  1. operator[]訪問:

    1. 最常用的訪問方式,通過索引直接訪問字符

    2. 支持讀寫操作,但不進行邊界檢查,訪問越界會導致未定義行為

  2. at()方法訪問:

    1. operator[]類似,但會進行邊界檢查

    2. 訪問越界時會拋出out_of_range異常,更安全

  3. 迭代器遍歷:

    1. begin()end()提供正向迭代器,用于從前往后遍歷

    2. rbegin()rend()提供反向迭代器,用于從后往前遍歷

  4. const 迭代器:

    1. 用于const string對象的遍歷

    2. 保證不會修改字符串內容

  5. 范圍 for 循環:

    1. C++11 引入的簡潔遍歷方式

    2. 通過引用 (char&) 可以修改元素,否則只能讀取

#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {string str = "Hello, String!";cout << "原始字符串: " << str << endl;cout << "字符串長度: " << str.size() << endl << endl;// 1. 使用operator[]訪問單個元素cout << "1. 使用operator[]訪問:" << endl;if (!str.empty()) {cout << "第一個字符: " << str[0] << endl;cout << "最后一個字符: " << str[str.size() - 1] << endl;// 修改元素str[0] = 'h';cout << "修改后第一個字符: " << str[0] << endl;}cout << endl;// 2. 使用at()方法訪問單個元素(帶邊界檢查)cout << "2. 使用at()訪問:" << endl;try {cout << "索引為7的字符: " << str.at(7) << endl;// 嘗試訪問超出范圍的索引,會拋出out_of_range異常// cout << str.at(100) << endl;} catch (const out_of_range& e) {cout << "訪問異常: " << e.what() << endl;}cout << endl;// 3. 使用迭代器遍歷cout << "3. 使用迭代器遍歷:" << endl;cout << "正向遍歷: ";for (string::iterator it = str.begin(); it != str.end(); ++it) {cout << *it;}cout << endl;// 4. 使用反向迭代器遍歷cout << "4. 使用反向迭代器遍歷:" << endl;cout << "反向遍歷: ";for (string::reverse_iterator rit = str.rbegin(); rit != str.rend(); ++rit) {cout << *rit;}cout << endl << endl;// 5. 使用const迭代器遍歷(用于const string)cout << "5. 使用const迭代器遍歷:" << endl;const string const_str = "Const String";cout << "const字符串正向遍歷: ";for (string::const_iterator cit = const_str.begin(); cit != const_str.end(); ++cit) {cout << *cit;}cout << endl;cout << "const字符串反向遍歷: ";for (string::const_reverse_iterator crit = const_str.rbegin(); crit != const_str.rend(); ++crit) {cout << *crit;}cout << endl << endl;// 6. 使用范圍for循環遍歷(C++11及以上)cout << "6. 使用范圍for循環遍歷:" << endl;cout << "范圍for遍歷: ";for (auto c : str) {cout << c;}cout << endl;// 范圍for修改元素for (char& c : str) {  // 注意使用引用才能修改if (c == ',') {c = ';';}}cout << "修改后的字符串: " << str << endl;return 0;
}

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

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

相關文章

DAY15-新世紀DL(DeepLearning/深度學習)戰士:破(超參數調試、Batch正則化和程序框架)3

本文參考文章0.0 目錄-深度學習第一課《神經網絡與深度學習》-Stanford吳恩達教授-CSDN博客 1.調試處理 神經網絡的改變會涉及到許多不同的超參數設置&#xff0c;現在&#xff0c;對于超參數而言&#xff0c;如何找到一套比較好的設定&#xff1f; 訓練深度最難的事之一是你…

Android 14 PMS源碼分析

源碼參考&#xff1a;Search (aospxref.com) 一、簡介 PackageManagerService&#xff08;簡稱 PMS&#xff09;&#xff0c;是 Android 系統核心服務之一&#xff0c;處理包管理相關的工作&#xff0c;常見的比如安裝、卸載應用等。本章針對SyetemServer、PMS構造方法重點模…

內省排序:相對最迅速的通用排序算法

&#x1f50d; 內省排序&#xff1a;相對最迅速的通用排序算法 &#x1f680; 前言&#xff1a;排序算法的演進之路 排序算法是計算機科學的核心基礎之一&#xff0c;其性能直接影響著數據庫系統、科學計算、圖形渲染等領域的效率。隨著硬件架構的發展&#xff0c;排序算法經歷…

Linux驅動開發重要操作匯總

本文主要記錄imx6ull的linux驅動開發過程中常用的一些操作。 uboot編譯 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean make ARCHarm CROSS_COMPILEarm-linux-gnueabihf mx6ull_14x14_evk_emmc_defconfig make V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- …

【Java后端】MySQL 常見 SQL 語句優化指南

在 MySQL 中&#xff0c;SQL 優化是性能調優的核心環節&#xff0c;尤其是在數據量大、并發高的情況下。這里整理一份 MySQL 常見 SQL 語句優化指南&#xff0c;從查詢寫法、索引使用到執行計劃分析&#xff0c;涵蓋實用技巧&#xff1a;1. 查詢語句層面的優化 ? 避免 SELECT …

Golang 面試題「高級」

以下是 100 道 Golang 高級面試題及答案&#xff0c;聚焦語言底層實現、并發深度優化、性能調優、源碼級理解等核心方向&#xff0c;適合資深開發者或架構師級別的面試場景&#xff1a; 一、GPM 調度模型與并發深度 問題&#xff1a;Goroutine 的棧空間初始大小是多少&#xff…

WebGIS視角:體感溫度實證,哪座“火爐”火力全開?

目錄 前言 一、火爐城市空間分布及特點 1、空間分布 2、氣候特點 二、數據來源及技術實現 1、數據來源介紹 2、技術路線簡介 三、WebGIS系統實現 1、后端設計與實現 2、前端程序實現 四、成果展示 1、整體展示 2、蒸烤模式城市 3、舒適城市 五、總結 前言 “火爐…

《數據結構入門:順序表的結構設計與核心操作(C 語言版)》

目錄 一. 線性表 二. 順序表的概念與結構 2.1 核心概念 2.2 兩種常見結構 靜態順序表 動態順序表 2.3 核心區別對比 四. 順序表的實現 4.1 順序表的定義 4.2 順序表初始化 4.3 動態順序表容量檢查與擴容 4.4 動態順序表插入數據 4.4.1 頭插 4.4.2 尾插 4.4.3 指…

[Maven 基礎課程]Maven 是什么

Maven 的官方網站&#xff1a;https://maven.apache.org/ 來自 Maven 官網的對于 Maven 是什么的描述&#xff1a; Apache Maven is a build tool for Java projects. Using a project object model (POM), Maven manages a project’s compilation, testing, and documentat…

【MATLAB例程】三維組合導航,濾波使用EKF,帶嚴格的慣導推算、雅克比求解函數,圖像對比濾波前后的速度、位置、姿態

文章目錄程序介紹系統建模濾波框架仿真設置性能對比代碼優點運行結果MATLAB源代碼程序介紹 本程序實現了 三維狀態量的擴展卡爾曼濾波&#xff08;EKF&#xff09;組合導航仿真&#xff0c;采用嚴格的15維誤差狀態模型&#xff0c;狀態向量包括&#xff1a; x[pxpypzvxvyvz?θ…

港資企業在大陸,如何靠 SD-WAN 專線暢連香港?

在當前市場形勢下&#xff0c;港資企業在大陸的業務布局不斷拓展&#xff0c;企業間訪問香港總部系統以及香港員工到內陸出差時訪問相關系統&#xff0c;成為日常運營的高頻需求。然而&#xff0c;網絡問題卻常常阻礙業務的順暢開展&#xff0c;基于 SD-WAN 專線的到香港加速網…

并發編程——08 Semaphore源碼分析

1 概述Semaphore 是基于 AQS CAS 實現的&#xff0c;可根據構造參數的布爾值&#xff0c;選擇使用公平鎖&#xff0c;還是非公平鎖。Semaphore 默認使用非公平鎖&#xff1b;2 構造函數 // AQS的實現 private final Sync sync;// 默認使用非公平鎖 public Semaphore(int permi…

Java全棧開發面試實戰:從基礎到微服務的深度解析

Java全棧開發面試實戰&#xff1a;從基礎到微服務的深度解析 一、面試開場 面試官&#xff08;中年工程師&#xff0c;穿著休閑但專業&#xff09;&#xff1a;你好&#xff0c;我是李工&#xff0c;今天來聊一下你的技術背景。你之前在XX科技做全棧開發&#xff0c;對吧&#…

CVPR深度學習論文創新合集拆解:模型訓練速度算提升

關注gongzhonghao【CVPR頂會精選】大語言模型擴散Transformer的深度融合&#xff0c;讓文本到圖像生成更精準、細節更豐富&#xff1b;同時&#xff0c;專家軌跡正則化深度強化學習在自動對焦中的穩定加速表現&#xff0c;也展示了深度學習與軌跡建模結合的潛力。這樣的組合正在…

【智能體】零代碼學習 Coze 智能體(2)創建智能體的完整步驟

歡迎關注【AGI使用教程】 專欄 【智能體】零代碼學習 Coze 智能體&#xff08;1&#xff09; 【智能體】零代碼學習 Coze 智能體&#xff08;2&#xff09; 【智能體】零代碼學習 Coze 智能體&#xff08;1&#xff09;1、登錄 Coze 平臺2、創建智能體3、智能體編排頁面4、編寫…

WPF和WinFrom區別

WPF 總結Windows Presentation Foundation (WPF) 是微軟開發的一個用于構建 Windows 桌面應用程序的用戶界面框架。它基于 .NET Framework&#xff0c;提供豐富的圖形、動畫和數據綁定功能&#xff0c;幫助開發者創建現代化、高性能的應用程序。以下是其核心要點總結&#xff1…

數據庫原理及應用_數據庫基礎_第3章數據庫編程_常用系統函數

前言 "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中3.1.2節內容 引入 數據庫常用系統函數的分析.上一篇帖子分析了,數據庫函數需要看看能否被C語言函數替代 1.字符串函數 1)計算字符串字符數的函數和字符串長度的函數 語法: CHAR_LENGTH(str)…

回歸問題的損失函數

簡單來說&#xff0c;?在回歸問題中&#xff0c;最常用的損失函數是均方誤差&#xff08;MSE, Mean Squared Error&#xff09;和平均絕對誤差&#xff08;MAE, Mean Absolute Error&#xff09;?。它們衡量的都是模型預測值&#xff08;?&#xff09;與真實值&#xff08;y…

吳恩達機器學習(四)

一、神經網絡神經元模擬邏輯單元&#xff1a;神經網絡簡單模型&#xff1a;神經網絡中的前向傳播過程&#xff1a;依次計算激活項&#xff0c;從輸入層到隱藏層再到輸出層的過程。樣例&#xff1a;多元分類&#xff1a;

【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解

【重學 MySQL】九十三、MySQL的字符集的修改與底層原理詳解一、字符集修改方法1. **配置文件修改**2. **SQL命令修改**3. **數據遷移方案**二、底層原理與注意事項1. **字符集與排序規則**2. **存儲與性能影響**3. **數據一致性風險**三、常見問題解決1. **亂碼問題**2. **性能…