【C++】string基本用法(常用接口介紹)

文章目錄

  • 一、string介紹
  • 二、string類對象的創建(常見構造)
  • 三、string類對象的容量操作
    • 1.size()和length()
    • 2.capacity()
    • 3.empty()
    • 4.clear()
    • 5.reserve()
    • 6.resize()
  • 四、string類對象的遍歷與訪問
    • 1.operator[ ]
    • 2.正向迭代器begin()和end()
    • 3.反向迭代器rbegin()和rend()
    • 4.const正向和反向迭代器
    • 5.范圍for
    • 6.at()
  • 五、string類對象的查找與修改
    • 字符串查找
      • 1.find()與npos
      • 2.rfind()
      • 3.find_first_of()和find_last_of()
      • 4.substr()
    • 字符串修改
      • 1.operator+=
      • 2.push_back()與pop_back()
      • 3.append()
      • 4.insert()
      • 5.erase()
      • 6.replace()
  • 六、string類非成員函數
    • operator+
    • 輸入getline

一、string介紹

string是表示字符串的字符串。它提供了一系列成員函數和操作符,使得字符串的操作更加方便和靈活。它位于標準命名空間std下,因此通常需要使用using namespace std;語句或者前綴std::來引用。

string是C++的STL(standard template libaray-標準模板庫)的容器之一。本篇,我們主要介紹string的基本用法。所有接口用法都可以在cplusplus參考手冊中查閱。下面我們主要介紹string的一些常用接口。

string底層實際是basic_string類模板的實例化,是表示字符串類型的模板類
在這里插入圖片描述

二、string類對象的創建(常見構造)

在這里插入圖片描述string重載了很多構造和拷貝構造函數,其實常用的也就4種。

//常用構造方式
string s1;//無參構造
string s2("interesting");//構造
string s3(s2);//拷貝構造
string s4 = "hello world";//構造

不常用的初始化方式

//函數原型 string (size_t n, char c);
string s5(10, 'x');//10個字符x
//函數原型 string (const string& str, size_t pos, size_t len = npos);
string s6(s2, 8, 3);//打印ing 第8個位置開始拷貝3個字符 
string s7(s2, 8);//打印ing 第8個位置開始拷貝后面所有字符

三、string類對象的容量操作

1.size()和length()

計算有效字符串長度,不包括\0 size()與length()的底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。

int main()
{string s("abcde");cout << s.size() << endl;//5cout << s.length() << endl;//5return 0;
}

2.capacity()

返回string類對象的空間容量大小。同樣的一個字符串在不同編譯器下的容量可能不一樣。

string s("abcde");
cout << s.capacity() << endl;//vs2019:15

3.empty()

字符串為空返回1,非空則返回0。

一般也很少用到。我們也可以用str == ""判斷是否為空。

4.clear()

clear()只是將string中有效字符清空,不改變底層空間大小。 即有效數據size()清零,容量capacity()不變。

string s("abcde");
s.clear();

5.reserve()

提前申請空間,可以避免頻繁擴容。有效數據size不變,容量capacity增大。 且只比指定容量要大,不會小。
在這里插入圖片描述
在Windows環境下(如上圖),reserve實際申請空間一般比我們指定的參數要大;而Linux的擴容空間與指定參數一樣。

不同環境下,string擴容的規律也不同:Windows環境下(PJ版本STL),容量capacity每次以1.5倍的速度擴容;Linux環境下(SGI版本STL),每次以2倍速度擴容;所以頻繁擴容的成本較高。reserve可以提前申請好空間,避免頻繁擴容。

在這里插入圖片描述

reserve可以縮容嗎?

可以,但是如果原始空間有數據,則縮容無效;用clear清空有效數據,即可縮容到指定參數大小的空間。所以,想用reserve縮小空間

6.resize()

調整string容器大小,即有效數據個數size()。

string s("abcde");
s.resize(3);//abc  size=3;
s.resize(5, 'x');//abcxx size=5

n < size相當于尾刪,size()減小到n,底層空間capacity()不變。
n > size則size增加到n,多出的空間用第二個字符參數填充,無參則默認填充’\0’。

四、string類對象的遍歷與訪問

1.operator[ ]

int main()
{string s("interesting");for (size_t i = 0; i < s.size(); i++){cout << s[i];s[i]++;}return 0;
}

2.正向迭代器begin()和end()

begin()返回指向字符串第一個字符的迭代器,end()返回指向字符串末尾字符’\0’的迭代器。

迭代器提供了一種遍歷容器中元素的方法,迭代器是像指針一樣的類型,但可能是指針,也可能不是指針,用法與指針類似。
任何容器都支持迭代器,并且用法是類似的。 迭代器是屬于類域的,所以要加域作用限定符。并且對于迭代器的使用,搭配關鍵字auto使用更簡單。

int main()
{string s("interesting");//auto it = s.begin();//自動識別類型string::iterator it = s.begin();//打印interestingwhile (it != s.end()){cout << *it;it++;}return 0;
}

3.反向迭代器rbegin()和rend()

反向迭代器與正向迭代器用法一樣,可以實現逆序遍歷。注意正向和反向迭代器名字不一樣。

int main()
{string s("interesting");//auto it = s.rbegin();//自動識別類型string::reverse_iterator rit = s.rbegin();//打印gnitseretniwhile (rit != s.rend()){cout << *rit;rit++;}return 0;
}

4.const正向和反向迭代器

對于const修飾的string類對象,就只能用const迭代器,否則會發生權限的放大。

使用auto更方便省事。

const string s("interesting");
//正向
string::const_iterator it = s.begin();
auto it = s.begin();
//反向
string::const_reverse_iterator rit = s.rbegin();
auto it = s.rbegin();

5.范圍for

C++11支持更簡潔的范圍for的新遍歷方式。范圍for的底層就是迭代器,不支持迭代器就不支持范圍for。

int main()
{string s("interesting");for (auto& ch : s)//可讀 加上引用可寫{ch++;cout << ch;}return 0;
}

6.at()

使用與operator[ ]一樣,但一般很少用at()來訪問string。
at()與[ ]的區別是對越界的檢查不一樣:[ ]越界會斷言,比較暴力;at()越界會拋異常,比較溫和。

int main()
{string s("interesting");for (size_t i = 0; i < s.size(); i++){cout << s.at(i);s.at(i)++;}return 0;
}

五、string類對象的查找與修改

字符串查找

1.find()與npos

find是查找字符或字符串函數,返回與字符參數匹配到的第一個字符位置下標,如果找不到則返回npos。

在這里插入圖片描述

npos是string類的靜態成員變量,值為-1(-1的補碼全是1),因為是size_t即無符號整型,所以npos表示的大小為232-1,即整型的最大范圍。
在這里插入圖片描述

2.rfind()

與find()一樣,只不過rfind()是從右往左查找。
在這里插入圖片描述

3.find_first_of()和find_last_of()

find_first_of():只要字符串中找到字符參數中任意一個字符,則返回第一個找到的下標。

例如,下面這段代碼將字符串中的aeiou全部替換成*

在這里插入圖片描述find_last_of()同理,只不過是從右往左查找。

4.substr()

返回獲取到的子串

int main()
{string s1("hello world");//第一種也是最常用的string s2 = s1.substr(2, 3);//截取從下標2開始的3個字符cout << s2 << endl;//llos2 = s1.substr(6);//截取從下標6開始后面的所有字符cout << s2 << endl;//worlds2 = s1.substr();//截取整個字符串cout << s2 << endl;//hello worldreturn 0;
}

字符串修改

1.operator+=

+= 可以尾插字符或者字符串,這個比較常用。+=操作不僅可以連接單個字符,還可以連接字符串。

int main()
{string s("hello ");s += "world";s += '!';cout << s << endl;return 0;
}

2.push_back()與pop_back()

尾插和尾刪單個字符

string s("abcd");
s.pop_back();//abc
s.push_back('x');//abcx

3.append()

尾插n個字符或者尾插指定區間的字符串

string s("hello ");
s.append(10, 'x');//尾插10個x
s.append("world", 3);//尾插字符串world的前3個字符
s.append("world", 1, 3);//尾插從下標1開始往后的3字符即orl

tip:一般push_back()和append()尾插不常用,用+=更方便省事。

4.insert()

在指定位置插入字符或者字符串
在這里插入圖片描述

5.erase()

刪除指定位置的字符或字符串
在這里插入圖片描述

6.replace()

用新的字符或者字符串替換原字符串部分字符
在這里插入圖片描述

六、string類非成員函數

operator+

盡量少用,因為傳值返回,導致深拷貝效率低。

int main()
{string s1("hello");string s2("world");s1 = s1 + " " + s2;cout << s1 << endl;return 0;
}

operator>>和operator<<運算符重載也是string的非成員函數。

輸入getline

cin無法讀取空格和換行,getline可以彌補這個缺陷。需要包含頭文件<string>

不指定分隔符,默認以回車結束,可以讀取空格,常用來讀取一行。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s;getline(cin, s);cout << s;return 0;
}

第三個參數可以指定分隔符,例如指定’\r’可以讀取回車,結束需按下:Ctrl+z 然后再回車

#include <iostream>
#include <string>
using namespace std;
int main()
{string s;getline(cin, s, '\r');cout << s;return 0;
}

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

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

相關文章

QTableView與QSqlQueryModel的簡單使用

測試&#xff1a; 這里有一個sqlite數據庫 存儲了10萬多條數據&#xff0c;col1是1,col2是2. 使用QSqlQueryModel和QTableView來顯示這些數據&#xff0c;也非常非常流暢。 QString aFile QString::fromLocal8Bit("E:/桌面/3.db");if (aFile.isEmpty())return;//打…

關于考摩托車駕照

剛通過了摩托車駕照考試&#xff0c;說兩句。 1、在哪兒考試就要搞清楚當地的規定&#xff0c;不要以為全國要求都一樣。 2、首先是報駕校。雖然至少有些地方允許自學后&#xff08;不報駕校&#xff09;考試&#xff0c;但報駕校聽聽教練說的&#xff0c;還是能提高通過率&a…

計算機圖形學筆記----矩陣

矩陣和標量的運算 ,則 矩陣與矩陣相乘 的矩陣A&#xff0c;的矩陣B。兩矩陣&#xff0c;結果為的矩陣&#xff0c;第一個矩陣的列數必須和第二個矩陣的行數相同&#xff0c;否則不能相乘 &#xff0c;中的每個元素等于A的第i行所對應的矢量和B的第j列所對應的矢量進行矢量點…

Django靚號管理系統:實現用戶列表功能

在本篇博文中,我們將介紹如何在Django靚號管理系統中實現用戶列表功能。這個功能允許管理員查看系統中所有用戶的基本信息。我們將逐步講解如何設置URL路由、創建視圖函數以及設計模板。 1. 設置URL路由 首先,我們需要在??urls.py??文件中添加一個新的URL路徑,以便訪問…

云計算【第一階段(22)】Linux的進程和計劃任務管理

目錄 一、查看進程 1.1、程序和進程的關系 1.2、查看進程 1.2.1、靜態查看進程信息ps ?編輯 1.2.1.1、實驗 1.2.2、動態查看進程信息top 1.2.2.1、實驗 1.2.2.2、top 命令全屏操作界面快捷鍵 1.2.3、pgrep根據特定條件查詢進程pid信息 1.2.4、pstree命令以樹形結構列出…

CentOS系統日志入門

日志清單 系統的引導日志:/var/log/boot.log核心啟動日志:/var/log/dmesg系統報錯日志:/var/log/messages郵件系統日志:/var/log/maillogFTP系統日志:/var/log/xferlog安全信息和系統登錄與網絡連接的信息:/var/log/secureNews日志:/var/log/spoolerRPM軟件包:/var/log/rpmpkg…

Android 常用ADB命令

文章目錄 Android 常用ADB命令概述adb 的工作原理命令adb命令shell命令 使用adb服務器操作設備操作應用文件操作activity操作日志操作 Android 常用ADB命令 概述 Android 調試橋 (adb) 是一種功能多樣的命令行工具&#xff0c;可讓您與設備進行通信。adb 命令可用于執行各種設…

Avue框架學習

Avue框架學習 我們的項目使用的框架是 Avue 在我看來這個框架最大的特點是可以基于JSON配置頁面上的From,Table以及各種各樣的輸入框等,不需要懂前端就可以很快上手,前提是需要多查一下文檔 開發環境搭建 由于我本地的環境全是用docker來搭建的,所以我依然選擇用docker搭建我…

萬字淺析視頻搜索系統中的多模態能力建設

萬字淺析視頻搜索系統中的多模態能力建設 FesianXu 20240331 at Tencent WeChat search team 前言 視頻搜索是天然的富媒體檢索場景&#xff0c;視覺信息占據了視頻的一大部分信息量&#xff0c;在視頻搜索系統中引入多模態能力&#xff0c;對于提高整個系統的能力天花板至關重…

機器人控制系列教程之任務空間運動控制器搭建(1)

任務空間運動控制簡介 任務空間運動控制—位置被指定給控制器作為末端執行器的姿態。然后&#xff0c;控制器驅動機器人的關節配置到使末端執行器移動到指定姿態的值。這有時被稱為操作空間控制。 任務空間運動模型表示機器人在閉環任務空間位置控制下的運動&#xff0c;可使用…

python基礎:高級數據類型:集合

1、集合的定義 集合是一個無序且無重復元素的列表。其定義與數學定義一致。其無序和不重復和字典特征類似&#xff0c;但是無“值”。 2、集合的創建 集合一般由列表創建&#xff0c;在初始化列表時保證其元素唯一性&#xff0c;即為集合。 創建方法&#xff1a;x set(list…

汽車電子工程師入門系列——AUTOSAR通信服務框架(下)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 屏蔽力是信息過載時代一個人的特殊競爭力,任何消耗你的人和事,多看一眼都是你的不對。非必要不費力證明自己,無利益不試圖說服別人,是精神上的節…

GitHub每周最火火火項目(6.24-6.30)

項目名稱&#xff1a;dortania / OpenCore - Legacy - Patcher 項目介紹&#xff1a;該項目旨在讓用戶體驗如同以前一樣的macOS。它可能提供了一種方式來解決在某些情況下&#xff0c;用戶無法正常使用或升級macOS的問題。通過使用OpenCore - Legacy - Patcher&#xff0c;用戶…

python格式文件

python小白考后復習 CSV格式文件ini格式文件我們可以讀取所有節點還可以輸出一個節點下所有鍵值對組成的元組獲取節點下的鍵對應的值判斷節點是否存在添加節點還可以添加鍵值還可以刪除節點 XML格式文件讀取若是文件格式存在的xml若是以字符串形式存在的xml獲取子標簽還有獲取子…

【分布式計算框架 MapReduce】高級編程—搜索日志數據分析

目錄 一、對于 sogou_500w_utf 數據&#xff0c;使用 MapReduce 編程模型完成對以下數據的分析任務 1. 統計 2011-12-30 日搜索記錄&#xff0c;每個時間段的搜索次數 &#xff08;1&#xff09;運行截圖 &#xff08;2&#xff09; 源代碼 2. 統計 2011-12-30 日 3 點至 …

2024最新初級會計職稱題庫來啦!!!

16.根據增值稅法律制度的規定&#xff0c;下列各項中&#xff0c;屬于"提供加工、修理修配勞務"的是&#xff08;&#xff09;。 A.修理小汽車 B.修繕辦公樓 C.爆破 D.礦山穿孔 答案&#xff1a;A 解析&#xff1a;選項AB&#xff1a;修理有形動產&#xff08;…

【PL理論深化】(13) 變量與環境:文法結構 | 真假表達式:isZero E | let 表達式疊放 | 定義的規則 | 條件語句的使用

&#x1f4ac; 寫在前面&#xff1a;從現在開始&#xff0c;讓我們正式設計和實現編程語言。首先&#xff0c;讓我們擴展在之前定義的整數表達式語言&#xff0c;以便可以使用變量和條件表達式。 目錄 0x00 文法結構 0x01 真假表達式&#xff1a;isZero E 0x02 let 表達式疊…

Elasticsearch 第四期:搜索和過濾

序 2024年4月&#xff0c;小組計算建設標簽平臺&#xff0c;使用ES等工具建了一個demo&#xff0c;由于領導變動關系&#xff0c;項目基本夭折。其實這兩年也陸陸續續接觸和使用過ES&#xff0c;兩年前也看過ES的官網&#xff0c;當時剛畢業半年多&#xff0c;由于歷史局限性導…

Java有沒有goto語句

一、技術細節 Java作為一種廣泛使用的編程語言&#xff0c;其設計哲學強調清晰、簡潔和易于維護。在技術細節層面&#xff0c;Java確實支持goto語句作為關鍵字&#xff0c;但在實際編程中&#xff0c;goto語句并不被推薦使用。Java中的goto是保留字&#xff0c;主要用于兩個場…

chrome-base源碼分析(1)macros模塊

Chrome-base源碼分析(2)之Macros模塊 Author&#xff1a;Once Day Date&#xff1a;2024年6月29日 漫漫長路&#xff0c;才剛剛開始… 全系列文章請查看專欄: 源碼分析_Once-Day的博客-CSDN博客 參考文檔: macros - Chromium Code SearchChrome base 庫詳解&#xff1a;工…