【C++】string類常用函數用法總結

目錄

常用函數一覽

默認成員函數

與容量有關的函數

part 1

part 2

part 3

與訪問和遍歷有關的函數

與修改有關的函數

npos

與string相關的其它常用函數

常用非成員函數

getline和cin的區別


常用函數一覽

//默認成員函數
string();string(const char* s);string(size_t n, char c);string(const string& str);//與容量有關的函數
size_t size() const;size_t capacity() const;void reserve(size_t n);void resize(size_t n, char c);void reserve(size_t n = 0);bool empty() const;void clear();//與訪問及遍歷有關的操作
char& operator[] (size_t pos);const char& operator[] (size_t pos) const;iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;// 與修改有關的操作
string& operator+= (const string& str);string& operator+= (const char* s);string& operator+= (char c);string& append(const char* s);void push_back(char c);string& insert(size_t pos, const char* s);string& insert(size_t pos, size_t n, char c);string& erase(size_t pos = 0, size_t len = npos);//與string相關的其他常用函數
const char* c_str() const;size_t find(char c, size_t pos = 0) const;size_t rfind(char c, size_t pos = npos) const;string substr(size_t pos = 0, size_t len = npos) const;//常用非成員函數
istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);istream& getline(istream& is, string& str);

默認成員函數

1)string();//構造空的string類對象,即空的字符串

2)string(const char* s);//用C語言形式的字符串來構造string類對象

3)string(size_t n, char c);//用n個字符c來構造string類對象

4)string(const string& str); //用已有對象去構造新的對象

5)string& operator= (const string& str);//賦值重載

#include <iostream>
#include <string>
using namespace std;void test()
{string s1;string s2("hello world!");string s3(10, 'x');cout << "s1:" << s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;string s4(s2);cout << "s4:" << s4 << endl;s1 = s2;cout << "s1:" << s1 << endl;
}int main()
{test();return 0;
}

運行結果:?

與容量有關的函數

part 1

1)size_t size() const;

2)size_t capacity() const;

3)bool empty() const;

4)void clear();

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");cout << "size:" << s1.size() << endl;cout << "capacity:" << s1.capacity() << endl;cout << "empty:" << s1.empty() << endl;s1.clear();cout << "After clear check empty:" << s1.empty() << endl;
}int main()
{test();return 0;
}

運行結果:

part 2

1)void resize(size_t n);

2)void resize(size_t n, char c);

?resize(size_t n)和resize(size_t n, char c)都是將字符串的有效個數改變到n個,不同的是,當使用?std::string::resize(size_t n)?來增加字符串的大小時,新增加的字符默認是用空字符(null character,即?\0)來填充,resize(size_t n, char c)則用字符c來填充多出來的元素空間。

當n小于原來字符串的個數時,相當于刪除操作,字符串將保留n個字符。

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");s1.resize(20);cout << "s1:" << s1 << endl;string s2("welcom to C++");s2.resize(20, 'x');cout << "s2:" << s2 << endl;s1.resize(5);cout << "s1:" << s1 << endl;
}int main()
{test();return 0;
}

運行結果:

part 3

void reserve(size_t n = 0);

?std::string::reserve(size_t n)函數用于請求字符串分配足夠的內存空間來存儲至少n個字符(不包括終止的空字符'\0')。這并不意味著字符串的大小(即其中包含的字符數)會增加,它僅僅是預先分配了內存,以避免在未來添加字符時頻繁地重新分配內存。這樣做可以提高性能,因為內存分配通常是一個昂貴的操作。

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello");cout << "s1.size:" << s1.size() << endl;cout << "s1.capacity:" << s1.capacity() << endl;s1.reserve(20);cout << "After reserve s1.size:" << s1.size() << endl;cout << "After reserve s1.capacity:" << s1.capacity() << endl;
}int main()
{test();return 0;
}

運行結果:

reserve之后的capacity為31,是因為vs自己的機制導致的,不同的編譯器結果可能會不一樣。

與訪問和遍歷有關的函數

1)char& operator[] (size_t pos);

2)const char& operator[] (size_t pos) const;

3)iterator begin();

4)const_iterator begin() const;

5)iterator end();

6)const_iterator end() const;

?const char& operator[] (size_t pos) const,const_iterator begin() const,const_iterator end() const,const修飾*this,即this指針指向的內容,所以this指針指向的內容不可修改,用法上和其他函數是一樣的。

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");cout << s1[2] << endl;//類似數組的下標訪問string::iterator it = s1.begin();while (it != s1.end()){cout << *it << ' ';++it;}cout << endl;
}
int main()
{test();return 0;
}

運行結果:?

與修改有關的函數

1)string& operator+= (const string& str);

2)string& operator+= (const char* s);

3)string& operator+= (char c);

4)string& append(const char* s);

5)void push_back(char c);

6)string& insert(size_t pos, const char* s);

7)string& insert(size_t pos, size_t n, char c);

8)string& erase(size_t pos = 0, size_t len = npos);

這里列舉了較多的函數,但其實用法都大致相同,很容易做到舉一反三,所以這里就不一一舉例了。

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello ");cout << "s1:" << s1 << endl;s1 += "world";cout << "s1 after +=: " << s1 << endl;cout << endl;string s2("Urspeacil");cout << "s2: " << s2 << endl;s2.append("chenyilan");cout << "s2 after append: " << s2 << endl;cout << endl;string s3("yyds");cout << "s3: " << s3 << endl;s3.push_back('y');cout << "s3 after push_back: " << s3 << endl;cout << endl;string s4("world peace");cout << "s4: " << s4 << endl;s4.insert(0, "I hope ");cout << "s4 after insert: " << s4 << endl;cout << endl;string s5("boy");cout << "s5: " << s5 << endl;s5.insert(1, 1, 'o');cout << "s5 after insert: " << s5 << endl;cout << endl;string s6("I love you!");cout << "s6: " << s6 << endl;s6.erase(6);cout << "s6 after erase: " << s6 << endl;
}
int main()
{test();return 0;
}

?運行結果:

npos

npos是一個靜態成員常量,表示一個不可能的位置。

#include <iostream>
#include <string>
using namespace std;int main()
{cout << "npos: " << string::npos << endl;return 0;
}

?運行結果:

string& erase(size_t pos = 0, size_t len = npos)上面講的的這個函數,形參len就給了npos為缺省值(默認值),表示如果不指定形參len,那么將刪除pos位置到字符串結尾的字符。

與string相關的其它常用函數

1)const char* c_str() const;

2)size_t find(char c, size_t pos = 0) const;

3)size_t rfind(char c, size_t pos = npos) const;

4)string substr(size_t pos = 0, size_t len = npos) const;

c_str() ,它主要用于將字符串類型的字符數組(包括C++字符串和C字符數組)轉換為C類型字符串,即以'\0'結尾的字符數組。

substr(),用于從字符串中提取子串。其函數原型為:std::string substr (size_t pos = 0, size_t len = npos) const;,其中pos是子串的起始位置,len是子串的長度。如果len為std::string::npos或省略該參數,則子串將延續到原始字符串的末尾。

#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world");cout << "c_str: " << s1.c_str() << endl;//找s1中的第一次出現的o并返回下標,可以用find()正著遍歷s1cout << "find: " << s1.find('o') << endl;//找s1中的最后出現的o并返回下標,可以用rfind()反著遍歷s1cout << "rfind: " << s1.rfind('o') << endl;string s2 = s1.substr(0, 5);cout << "s2: " << s2 << endl;
}int main()
{test();return 0;
}

運行結果:

常用非成員函數

1)istream& operator>> (istream& is, string& str);//流提取

2)ostream& operator<< (ostream& os, const string& str);//流插入

3)istream& getline(istream& is, string& str);

?流插入和流提取的使用很簡單,這里就不贅述了,討論getline和cin的區別更有意義。

getline和cin的區別

#include <iostream>
#include <string>
using namespace std;void test()
{string str;cin >> str;//輸入world peacecout << str;
}
int main()
{test();return 0;
}

運行結果:

可以看到,peace并未被讀取。原因在于:cin在遇到空白字符(空格、制表符、換行符)時會停止讀取,導致空白字符后面的內容無法讀取。

下面看看getline的表現:

#include <iostream>
#include <string>
using namespace std;void test()
{string str;getline(cin, str);//輸入world peacecout << str;
}
int main()
{test();return 0;
}

運行結果:

可以看到,getline可以讀取到空格后面的內容,原因在于getline一次從輸入流中讀取一行,直到遇到換行符(\n)才停止讀取。


完~?

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

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

相關文章

貓狗分類識別②圖像歸一化-位置和重心歸一化處理

一、導入庫 glob 和 os 都是Python的標準庫模塊&#xff0c;也就是說它們隨Python一起安裝&#xff0c;無需額外安裝即可使用。 glob 模塊提供了一個在目錄中使用通配符搜索創建文件列表的函數&#xff0c;例如&#xff0c;可以使用 glob.glob(*.txt) 來查找當前目錄下所有的…

Android OpenMAX(七)OMX Service

上一篇文章我們分析了Android使用OMXStore來管理平臺上的軟件和硬件編解碼組件,這一篇我們再向上一層了解應用層是如何獲取調用OMXStore管理組件的。本篇文章代碼參考自: frameworks/av/services/mediacodec/main_codecservice.cpp frameworks/av/media/libstagefright/omx/1…

Mybatis Plus ActiveRecord 模式

Mybatis Plus ActiveRecord 模式 使用 DEMO源碼地址 https://gitee.com/JackSong2019/demo-mybatis3.git 前言 ActiveRecord 模式 簡介 ActiveRecord 是一種設計模式&#xff0c;它是一種在軟件開發中用于管理關系數據庫的模式&#xff0c;他簡化了數據庫操作的流程&#xf…

docker八大架構之應用服務集群架構

應用服務集群架構 在之前&#xff0c;一個應用層要負責所有的用戶操作&#xff0c;但是有時用戶增加后就會導致供不應求的現象&#xff08;單個應用不足以支持海量的并發請求&#xff0c;高并發的時候站點響應變慢&#xff09;&#xff0c;這時就需要增加應用層服務器&#xf…

【STM32 |GPIO】GPIO結構、GPIO輸出

目錄 GPIO簡介 GPIO的基本結構 GPIO位結構&#xff08;每一位的具體電路結構&#xff09; 輸入 上拉和下拉電阻 斯密特觸發器 ?編輯 輸出 GPIO模式 ?編輯 浮空輸入、上拉輸入、下拉輸入 模擬輸入 開漏輸出和推挽輸出 復用開漏輸出和復用推挽輸出 LED和蜂鳴器…

簡述線程同步和線程通信及如何實現線程間的同步

一、線程同步和線程通信是多線程編程中的兩個重要概念。 線程同步&#xff1a; 線程同步是指當有一個線程在對內存進行操作時&#xff08;如讀取、寫入等&#xff09;&#xff0c;其他線程都不可以對該內存地址進行操作&#xff0c;直到該線程完成操作&#xff0c;其他線程才…

FFmpeg開發筆記(二十七)APP無法訪問ZLMediaKit的HLS直播地址

上一篇文章介紹了如何通過ZLMediaKit實現視頻推拉流&#xff0c;并使用VLC播放器驗證視頻直播地址。即使不用VLC播放器&#xff0c;直接在Qt工程的C代碼中調用FFmpeg的API&#xff0c;也能訪問ZLMediaKit的直播地址&#xff0c;并正常渲染視頻畫面。關于如何在Qt工程中引入FFmp…

【資源分享】完勝谷歌翻譯的Deepl翻譯

::: block-1 “時問桫欏”是一個致力于為本科生到研究生教育階段提供幫助的不太正式的公眾號。我們旨在在大家感到困惑、痛苦或面臨困難時伸出援手。通過總結廣大研究生的經驗&#xff0c;幫助大家盡早適應研究生生活&#xff0c;盡快了解科研的本質。祝一切順利&#xff01;—…

【數據結構與算法】力扣 111. 二叉樹的最小深度

題目描述 給定一個二叉樹&#xff0c;找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明&#xff1a; 葉子節點是指沒有子節點的節點。 示例 1&#xff1a; 輸入&#xff1a; root [3,9,20,null,null,15,7] 輸出&#xff1a; 2示例 2&#…

長事務的理解和預防

我們常常聽說數據庫發生了“長事務”而導致很嚴重的后果。那么何為長事務&#xff1f;長事務是如何產生的&#xff1f;長事務對數據庫有什么影響&#xff1f;如何防止長事務的產生&#xff1f;以下對這幾方面進行闡述和說明&#xff0c;以加深對SinoDB長事務的理解。 1&#x…

Python-VBA函數之旅-super函數

目錄 一、super函數的常見應用場景 二、super函數使用注意事項 三、如何用好super函數&#xff1f; 1、super函數&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推薦閱讀&#xff1a; 個人主頁&#xff1a; https://myelsa1024.blog.csdn.net/ 一、su…

AI代理和AgentOps生態系統的剖析

1、AI代理的構成&#xff1a;AI代理能夠根據用戶的一般性指令自行做出決策和采取行動。 主要包含四個部分&#xff1a; &#xff08;1&#xff09;大模型&#xff08;LLM&#xff09; &#xff08;2&#xff09;工具&#xff1a;如網絡搜索、代碼執行等 &#xff08;3&#x…

探索未來:IT行業的革新脈動與明日圖景

你眼中的IT行業現狀與未來趨勢 隨著技術的不斷進步&#xff0c;IT行業已成為推動全球經濟和社會發展的關鍵力量。從云計算、大數據、人工智能到物聯網、5G通信和區塊鏈&#xff0c;這些技術正在重塑我們的生活和工作方式。你眼中IT行業的現狀及未來發展趨勢是怎么樣的&#xf…

開散列哈希桶

通過上面這幅圖&#xff0c;讀者應該能較為直觀地理解何為開散列&#xff0c;以及閉散列與開散列的區別在哪里 —— 數據的存儲形式不同&#xff0c;至于其他的&#xff0c;如確定每個元素的哈希地址等一概相同。 與閉散列相比&#xff0c;開散列能夠更好地處理發生沖突的元素 …

Taro + React + Tailwind 開發微信小程序問題匯總(持續更新中...)

搞小程序也有兩周了&#xff0c;踩了很多坑&#xff0c;有些問題很難搜索到&#xff0c;在這里記錄一下問題和自己的解決方案&#xff0c;希望能幫助到需要的小伙伴&#xff5e; 1. 真機調試報錯&#xff1a;Error: module ‘babel/runtime/helpers/Arrayincludes.js’ is not …

Transformers 加速的一些常用技巧

Transformers 是一個強大的架構&#xff0c;但模型因其采用的自注意力機制&#xff0c;雖然能夠有效地處理序列數據并捕獲長距離依賴關系&#xff0c;但同時也容易導致在訓練過程中出現OOM&#xff08;Out of Memory&#xff0c;內存不足&#xff09;或者達到GPU的運行時限制。…

AI大模型探索之路-訓練篇22: ChatGLM3微調實戰-從原理到應用的LoRA技術全解

系列篇章&#x1f4a5; AI大模型探索之路-訓練篇1&#xff1a;大語言模型微調基礎認知 AI大模型探索之路-訓練篇2&#xff1a;大語言模型預訓練基礎認知 AI大模型探索之路-訓練篇3&#xff1a;大語言模型全景解讀 AI大模型探索之路-訓練篇4&#xff1a;大語言模型訓練數據集概…

MPLAB X IDE編譯attiny1616工程報錯卻無報錯信息

MPLAB X IDE(XC-8編譯器)編譯報錯&#xff0c;無具體錯誤內容&#xff0c;僅顯示需要xc-8 pro的警告。 內存占用率顯示為81%&#xff0c;未超標。 原因&#xff1a;軟件使用了microchip的bootloader功能。應用程序起始地址&#xff08;也是bootloader結束地址&#xff09;設置錯…

社交巨頭:探索Facebook的震撼力量

Facebook作為社交媒體領域的巨頭&#xff0c;不僅在數字化社會中占據著重要地位&#xff0c;更是影響了人們的生活、工作和社交方式。本文將深入探索Facebook的震撼力量&#xff0c;從多個角度解讀其在當今社會中的重要性和影響。 1. 全球用戶覆蓋的壯觀規模 Facebook作為全球…