C++ Primer:3.2 標準庫類型string

其他章節:C++ Primer 學習心得

標準庫類型string表示可變長的字符序列,使用string類型必須首先頭文件,string定義在命名空間std

#include <string>
using std::string

定義和初始化string對象

初始化類的對象是由類本身決定的,一個類可以定義很多種初始化對象的方式。

string s1               // 默認初始化,s1是一個空串   
string s2(sl)           // s2是s1的副本
string s2 = s1          // 等價于s2(s1),s2是s1的副本
string s3("value")      // s3 是字面值"value"的副本,除了字面值最后的那個空字符外
string s3 = "value"     // 等價于s3("value"),s3是字面值"value"的副本
string s4(n, 'c')       // 把s4初始化為由連續n個字符c組成的字符串

直接初始化和拷貝初始化

  • 使用等號(=)初始化一個變量,執行拷貝初始化,把等號右側的初始值拷貝到新創建的對象中去。
  • 不使用等號(=),執行直接初始化
    初始值只有一個時,使用直接初始化或拷貝初始化都行;s4樣式的初始化用到的值有多個,一般只能使用直接初始化。
string s5 = "hiya"; // 拷貝
string s6("hiya");  // 直接
string s7(10, 'c'); // 直接

多個值進行初始化的情況,也可以采用拷貝初始化,需要創建一個臨時對象用于拷貝:

string s8 = string(10, 'c'); // 拷貝

string對象上的操作

os << s        // 將s寫到輸出流os當中,返回os
is >> s        // 從is中讀取字符串賦給s,字符串以空白分隔,返回is
getline(is,s)  // 從is中讀取一行賦給s,返回is
s.empty()      // s為空返回true,否則返回false
s.size()       // 返回s中字符的個數
s[n]           // 返回s中第n個字符的引用,位置n從0計起
s1 + s2        // 返回s1和s2連接后的結果
s1 = s2        // 用s2的副本代替s1中原來的字符
s1 == s2
s1 != s2       // 如果s1和s2中所含的字符完全一樣,則它們相等:string對象的相等性判斷對字母的大小寫敏感
<, <=, >, >=   // 利用字符在字典中的順序進行比較,且對字母的大小寫敏感

讀寫string對象

cin >> s;:執行讀取操作時,string對象自動忽略開頭的空白(空格符、換行符、制表符等),從第一個真正的字符讀起,直到遇見下一處空白。
string對象的輸入輸出操作返回運算符左側的運算對象作為結果,多個輸入或輸出可以連寫在一起。

讀取未知數量的string對象

while (cin >> word){}
條件負責檢測流的情況,流有效執行while語句內部的操作;遇到文件結束標記或非法輸入,循環結束。

使用getline讀取一整行

getline:保留輸入時的空白符,參數是輸入流和一個string對象,從輸入流中讀入內容,直到遇到換行符為止(換行符也讀入),將所讀內容存入string對象(不保存換行符)。

  • getline一遇到換行符就結束讀取并返回結果。
  • getline返回流參數,可以使用getline的結果作為while條件。

stringemptysize操作

emptystring的成員函數,返回string對象是否為空的一個對應的bool值。
size:返回string對象的長度(字符的個數)。

string::size_type類型

  • size函數返回值的類型,使用時通過作用域操作符表明是在string中定義的。
  • 無符號整數類型,足夠放下任何string對象的大小。表達式中避免混用帶符號數和無符號數,有size函數就不要再使用int

比較string對象

string對象相等意味著他們的長度相同且包含的字符也完全相同。
運算符==,!=,<,<=,>,>=依照在大小寫敏感的字典順序。

  1. 如果兩個string 對象的長度不同,而且較短 string 對象的每個字符都與較長string對象對應位置上的字符相同,就說較短string對象小于較長string對象。
  2. 如果兩個string對象在某些對應的位置上不一致,則string 對象比較的結果其實是string對象中第一對相異字符比較的結果。

string對象賦值

對于string,允許把一個對象的值賦給另外一個對象:

string stl(10'c'),st2; // st1的內容是cccccccccc;st2是一個空字符串
stl = st2;               // 賦值:用st2的副本替換st1的內容,此時st1和st2都是空字符串

兩個string對象相加

+:得到新的string對象,前半部分是+左側string對象所含字符,后半部分是+右側string對象所含字符。
+=:復合賦值運算符,右側string對象追加到左側string對象的后面。

string sl = "hello, ", s2 = "world\n";
string s3 = sl + s2;  //s3的內容是hello,world\n
s1 += s2;             //等價于s1 = s1 + s2

字面值和string對象相加

標準庫允許將字符和字符串的字面值轉換為string對象,需要string對象的地方可以使用這兩種字面值來替代。
當把string對象和字符及字符串字面值混在一條語句中使用時,必須確保每個加法運算符+的兩側的運算對象至少一個是string

  • C++中字符串字面值并不是標準庫類型string的對象。

處理string對象中的字符

cctype頭文件中定義了一組標準庫函數處理字符。

alnum(c)     // 當c是字母或數字時為真
isalpha(c)   // 當c是字母時為真
iscntrl(c)   // 當c是控制字符時為真
isdigit(c)   // 當c是數字時為真
isgraph(c)   // 當c不是空格但可打印時為真
islower(c)   // 當c是小寫字母時為真
isprint(c)   // 當c是可打印字符時為真(即c是空格或c具有可視形式)
ispunct(c)   // 當c是標點符號時為真(即c不是控制字符、數字、字母、可打印空白中的一種)
isspace(c)   // 當c是空白時為真(即c是空格、橫向制表符、縱向制表符、回車符、換行符、進紙符中的一種)
isupper(c)   // 當c是大寫字母時為真
isxdigit(c)  // 當c是十六進制數字時為真
tolower(c)   // 如果c是大寫字母,輸出對應的小寫字母;否則原樣輸出c
toupper(c)   // 如果c是小寫字母,輸出對應的大寫字母;否則原樣輸出c

使用C++版本的C標準庫頭文件

  • C語言的頭文件形如name.h,C++將這些文件命名為cname
  • 在名為cname的頭文件中定義的名字從屬于命名空間std

使用基于范圍的for語句處理每個字符

范圍for語句:遍歷給定序列中的每個元素并對序列中的每個值執行某種操作。

for (declaration: expression)statement
  • expression部分是一個對象,用于表示一個序列
  • declaration 部分負責定義一個變量,該變量將被用于訪問序列中的基礎元素。每次迭代,declaration部分的變量會被初始化為expression部分的下一個元素值。
string str("Some string");
for (auto c: str) // 對于str中的每個字符
  • 使用auto關鍵字讓編譯器來決定變量c的類型,每次迭代,str的下一個字符拷貝給c

使用范圍for語句改變字符串中的字符

改變string對象中的字符的值,必須把循環變量定義為引用類型。

string str("Some string");
for (auto &c: str) // 對于str中的每個字符

處理一部分字符

訪問string對象中的單個字符,使用下標,使用迭代器。
下標運算符([])接受的輸入參數是string::size_type類型的值,表示要訪問的字符的位置;返回值是該位置上字符的引用。

  • string對象的下標從0記起,s[s.size() - 1]是最后一個字符。
  • string對對象的下標必須大于等于0而小于s.size()
  • 下標的值稱作“下標”或“索引”,任何表達式只要它的值是一個整形就能作為索引。如果某個索引是帶符號類型的值將自動轉換為無符號類型string::size_type
  • 訪問字符之前,首先檢查字符串是否為空。

使用下標執行迭代

for (decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)

使用下標執行隨機訪問

通過某個下標值,直接獲取對應位置的字符,并不是每次都需要從前往后依次訪問。

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

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

相關文章

借力Jersey,鑄就卓越RESTful API體驗

目錄 maven 創建 jersey 項目 運行 支持返回 json 數據對象 1. 引言 在當今數字化時代&#xff0c;API&#xff08;應用程序編程接口&#xff09;已成為連接不同軟件系統和服務的橋梁。RESTful API以其簡潔、輕量級和易于理解的特點&#xff0c;成為了API設計的首選標準。本…

Hive函數之-posexplode()

1、概念描述&#xff1a; posexplode() 是一個內建函數&#xff0c;用于處理數組數據&#xff0c;并將數組的每個元素及其索引&#xff08;位置&#xff09;轉換為兩列的表格式數據。posexplode() 函數對于處理需要元素位置信息的數組特別有用。pos就是postion的縮寫&#xff…

Windows雙網卡上網原理以及配置方法

目錄 1. 背景 2. IP路由原理 3. windows雙網卡上網解決方案 3.1. 基礎配置解決方案 3.2. 高階配置解決方案 1. 背景 在windwos上使用多網卡在工作和生活中是一個常見的操作&#xff0c;比如為了獲取內部消息將有線連接到內部局域網中&#xff0c;為而了訪問外網又將電腦的…

華為云GaussDB部署指南:主備架構的常見問題與解決方案

文章目錄 華為云GaussDB部署指南&#xff1a;主備架構的常見問題與解決方案背景介紹部署步驟1.修改主機名2.軟件安裝檢查3.禁用交換內存4.創建數據目錄并掛載5.配置NTP時鐘同步6.添加資源限制參數7.修改網卡的MTU8.上傳安裝工具包9.編輯集群配置文件10.修改集群安裝模板11.安裝…

木舟0基礎學習Java的第二十天(線程,實現,匿名有名,休眠,守護,加入,設計,計時器,通信)

多線程 并發執行的技術 并發和并行 并發&#xff1a;同一時間 有多個指令 在單個CPU上 交替執行 并行&#xff1a;同一時間 有多個指令 在多個CPU上 執行 進程和線程 進程&#xff1a;獨立運行 任何進程 都可以同其他進程一起 并發執行 線程&#xff1a;是進程中的單個順…

【.NET全棧】ASP.NET開發Web應用——站點導航技術

文章目錄 前言一、站點地圖1、定義站點地圖文件2、使用SiteMapPath控件3、SiteMap類4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以編程的方式添加節點3、使用TreeView控件導航4、綁定到XML文件5、按需加載節點6、帶復選框的TreeView控件 三、Menu控件1、使用Menu控…

Hutool-Guava

目錄 一、Guava 二、Hutool 三、區別與聯系 四、使用場景 五、Guava工具類 1.集合工具類 2.字符串工具類 3.并發工具類 六、Hutool 1.字符串工具類 2.文件工具類 Hutool 和 Guava 都是 Java 開發中非常實用的工具庫&#xff0c;它們提供了許多方便的工具類和方法&am…

字節抖音電商 后端開發崗位 一面

筆者整理答案&#xff0c;以供參考 自我介紹 項目&#xff08;20分鐘&#xff09; RocketMQ延時消息的底層實現 回答&#xff1a; 延時消息的實現主要依賴于RocketMQ中的定時任務機制。消息被發送到Broker時&#xff0c;會先存儲在一個特定的延時消息隊列中。Broker會定時掃…

c++ extern 關鍵字

C中的extern關鍵字和跨語言互操作 變量的聲明與定義 extern關鍵字用于聲明在另一個翻譯單元&#xff08;文件&#xff09;中定義的變量或函數。通過extern關鍵字&#xff0c;可以在多個文件中訪問全局變量或函數。 變量聲明示例 文件&#xff1a;main.cpp #include <io…

chatglm2-6b-prompt嘗試

參考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通過prompt來實現zero-shot/fewshot的自然語言處理任務 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…

再議擴散模型

目錄 一、基礎知識 1、數學期望 2、概率表示 3、KL散度 二、擴散過程 三、理想的去噪過程 四、真實的去噪過程 五、噪聲生成 導言 筆者早些時候曾粗略看過擴散模型的流程&#xff0c;但對于底層算法&#xff08;尤其是概率論方面&#xff09;&#xff0c;理解不夠透徹…

pytorch學習(五)tensorboard使用

1. 創建環境 首先創建一個環境: conda create -n pytorch conda activate pytorch 然后安裝tensorboard pip install tensorboard 安裝opencv pip install opencv-python 2. 簡單的案例 標量和圖像的顯示&#xff1a; 2.1標量實現的方法是add_scalar,第一個參數是給顯…

探索Puppeteer的強大功能:抓取隱藏內容

背景/引言 在現代網頁設計中&#xff0c;動態內容和隱藏元素的使用越來越普遍&#xff0c;這些內容往往只有在特定的用戶交互或條件下才會顯示出來。為了有效地獲取這些隱藏內容&#xff0c;傳統的靜態爬蟲技術往往力不從心。Puppeteer&#xff0c;作為一個強大的無頭瀏覽器工…

印尼語翻譯通:AI驅動的智能翻譯與語言學習助手

在這個多元文化交織的世界中&#xff0c;語言是連接我們的橋梁。印尼語翻譯通&#xff0c;一款專為打破語言障礙而生的智能翻譯軟件&#xff0c;讓您與印尼語的世界輕松接軌。無論是商務出差、學術研究&#xff0c;還是探索印尼豐富的文化遺產&#xff0c;印尼語翻譯通都是您的…

代碼隨想錄算法訓練營第三十六天|1049. 最后一塊石頭的重量 II 、 494. 目標和 、 474.一和零

1049. 最后一塊石頭的重量 II 分成兩堆石頭&#xff0c;一堆石頭的總重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在計算target的時候&#xff0c;target sum / 2 因為是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目錄 .NET C# 使用 iText 生成PDF1 安裝 iText 7 庫&#xff1a;2 變量定義3 創建一個PDF4 段落5 旋轉文本6 代碼塊7 外部鏈接8 內部鏈接9 表格10 注釋11 線條12 二維碼13 嵌入圖像14 列表15 設置背景16 頁眉17 頁腳18 事件19 水印20 分欄21 源…

老古董Lisp(1):粗魯先生Lisp再出發

粗魯先生Lisp再出發 開始的原因 目標和夢想是最近考慮的一個問題。什么是目標&#xff1f;什么是夢想&#xff1f;夢想可以激勵改變&#xff0c;目標才能實現改變。 開始這個部分的時候&#xff0c;我的夢想是什么&#xff1f;我的目標是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip連接fS 環境部署tips

//運行FS服務器 sudo ./freeswitch -nc -nonat //公網sudo ./freeswitch //運行客戶端 sudo ./fs_cli //加載模塊 load mod_av load mod_verto0.Invite交互過程 1.fs碼率設置 2.用戶密碼改動 3.數字簽名的摘要 4.FS收不到ACK 5.公網部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---棧的使用和模擬實現

文章目錄 前言1.什么是棧(Stack)?2. 棧的模擬實現3.stack的使用![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.關于棧的oj題4.1.有效的括號4.2.逆波蘭表達式4.3.棧的壓入、彈出序列4.4.最小棧 前言 前面幾篇我們學習了順序…

Vue--Router(路由)

目錄 一 Router(路由) 1.作用 2.實現步驟 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;簡單來說&#xff0c;就是用來實現vue的頁面之間跳轉的。 我們都知道&#xff0c;使用vue必然會涉及到很多個組件&#xff0c;也就是頁面&#xff0c;而頁面之間肯定需…