C++string類(2)

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

函數名稱功能說明
operator[] (重 點)返回pos位置的字符,const string類對象調用
begin+endbegin獲取第一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
rbegin+rendrbegin獲取最后一個字符的迭代器 + rend獲取第一個字符上一個位置的迭代器
范圍forC++11支持更簡潔的范圍for的新遍歷方式
void test1()
{string s1 = "gxlgxlgxlgxlgxl";cout << s1[0] << s1[1] << s1[2] << endl;
}void test2()
{string s1 = "gxlgxlgxlgxlgxl";//string::iterator it = s1.begin();auto begin = s1.begin();auto end = s1.end();cout << *begin << endl;cout << *(end - 1) << endl;//end指向最后一個字符的下一個位置,這里減1取最后一個位置while (begin != end){cout << *begin << endl;++begin;}}
void test3()
{string s1 = "gxlgxlgxlgxlgxl";auto rbegin = s1.rbegin();auto  rend = s1.rend();cout << *(rend - 1) << endl;//rend指向第一個字符的前一個位置,//但是在這個rend中我們想取第一個位置的字符要減1cout << *rbegin << endl;//rebegin指向最后一個字符while (rbegin != rend){cout << *rbegin << endl;++rbegin;}//輸出為從字符串從后往前訪問,即rbegin+1 是在從后往前走,//這也解釋為何訪問第一個位置要rend-1
}void test4()
{string s1 = "gxlgxlgxlgxlgxl";for (auto ch : s1){cout << ch << endl;}
}
int main()
{test1();test2();test3();test4();return 0;
}

4.string類對象的修改操作

函數名稱功能說明
push_back在字符串后尾插字符c
append在字符串后追加一個字符串
operator+= (重 點)在字符串后追加字符串str
c_str(重點)返回C格式字符串
?nd + npos(重 點)從字符串pos位置開始往后找字符c,返回該字符在字符串中的 位置
r?nd從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置
substr在str中從pos位置開始,截取n個字符,然后將其返回

5.string類非成員函數

函數功能說明
operator>> (重點)輸入運算符重載
operator<< (重點)輸出運算符重載
getline (重點)獲取一行字符串
relational operators (重點)大小比較
operator+盡量少用,因為傳值返回,導致深拷貝效率低

上面的幾個接口大家了解一下,下面的OJ題目中會有一些體現他們的使用。string類中還有一些其他的操作,這里不一一列舉,大家在需要用到時不明白了查文檔即可。

6.vs和g++下string結構的說明

注意:下述結構是在32位平臺下進行驗證,32位平臺下指針占4個字節。

vs下string的結構

string總共占28個字節,內部結構稍微復雜一點,先是有一個聯合體,聯合體用來定義 string中字符串的存儲空間:

當字符串長度小于16時,使用內部固定的字符數組來存放 。

當字符串長度大于等于16時,從堆上開辟空間。

union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

這種設計也是有一定道理的,大多數情況下字符串的長度都小于16,那string對象創建好之后,內部已經有了16個字符數組的固定空間,不需要通過堆創建,效率高。

其次:還有一個size_t字段保存字符串長度,一個size_t字段保存從堆上開辟空間總的容量

最后:還有一個指針做一些其他事情。

故總共占16+4+4+4=28個字節。

在這里插入圖片描述

g++下string的結構

G++下,string是通過寫時拷貝實現的,string對象總共占4個字節,內部只包含了一個指針,該指針將來指向一塊堆空間,內部包含了如下字段:

1)空間總大小

2)字符串有效長度

3)引用計數

struct _Rep_base
{size_type               _M_length;size_type               _M_capacity;_Atomic_word            _M_refcount;
};

指向堆空間的指針,用來存儲字符串。

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

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

相關文章

SQLShift:一款異構數據庫存儲過程遷移工具

SQLShift 是一款專注于解決企業級數據庫遷移難題的智能 SQL 方言轉換平臺&#xff0c;尤其擅長異構數據庫存儲過程的自動化遷移。 SQLShift 工具深度融合了 AI 與 SQL 語法專家模型&#xff0c;可以大幅提升遷移效率并降低人工適配風險。 功能特性 多源多目標&#xff1a;目前…

學習設計模式《十八》——備忘錄模式

一、基礎概念 備忘錄模式的本質是【保存和恢復內部狀態】。 備忘錄模式的思考序號備忘錄模式的思考說明1保存是手段&#xff0c;恢復才是目的標準的備忘錄模式保存數據的手段是通過內存緩存&#xff1b;廣義的備忘錄模式實現的時候&#xff0c;可以采用離線存儲的方式&#xff…

HOT100——排序篇Leetcode215. 數組中的第K個最大元素

文章目錄題目&#xff1a;Leetcode215. 數組中的第K個最大元素原題鏈接思路1代碼1思路2代碼2題目&#xff1a;Leetcode215. 數組中的第K個最大元素 原題鏈接 數組中的第K個最大元素 思路1 排序 排序后返回倒數第k個數 代碼1 思路2 使用priority_queue&#xff0c;大根堆&#x…

三維重建一: 相機幾何

參考這位大佬&#xff1a;https://zhuanlan.zhihu.com/p/458000359 一. 基本的投影模型 正如上面所說&#xff0c;相機是一個將三維物體投影為二維圖像的設備。 對于小孔相機&#xff0c;或者薄透鏡相機來說&#xff0c;基礎投影的數學模型可以表達為 我們把這個過程表達在笛…

mysql 字符集不一致導致索引失效問題

mysql 字符集不一致導致索引失效問題 問題&#xff1a; 兩張表&#xff0c;同一個字段&#xff0c;由于字符集不一致&#xff0c;導致雖然都有索引&#xff0c;在關聯查詢時&#xff0c;索引失效身份表 identity_info &#xff0c;查詢索引信息 show index from identity_info …

Linux內核設計與實現 - 第6章 內核數據結構

目錄1. 鏈表 (Linked Lists)2. 隊列 (Queues)3. 映射 (Maps)4. 二叉樹 (Binary Trees)5. 位圖 (Bitmaps)6. 其他數據結構性能考量1. 鏈表 (Linked Lists) 單向鏈表 vs 雙向鏈表 struct list_head 標準實現內核鏈表API&#xff1a;LIST_HEAD(), list_add(), list_del() 環形鏈表…

十五、K8s可觀測能力:日志收集

十五、K8s可觀測能力&#xff1a;日志收集 文章目錄十五、K8s可觀測能力&#xff1a;日志收集1、云原生日志框架-ECK介紹1.1 什么是ECK&#xff1f;1.2 ECK核心資源&#xff1a;1.3 生產級日志收集架構2、日志收集-ECK2.1 集群規劃2.2 ECK 安裝2.3 一鍵部署高可用 ES 集群2.4 一…

微服務變更?自動化測試利器Parasoft SOAtest修復快、準、穩!

微服務架構憑借靈活和可擴展的優勢越來越普及&#xff0c;但隨之而來的變更也成了開發團隊的“心頭大患”。服務之間依賴復雜&#xff0c;接口改來改去&#xff0c;不僅讓開發更費勁&#xff0c;還容易導致測試用例失效、測試效率下降&#xff0c;甚至埋下系統不穩的隱患。 自…

將Android Studio創建的一個apk工程放到Android15源碼中構建

背景描述&#xff1a;起初Android Studio創建的apk工程&#xff0c;為了方便系統版本發布和后期維護需要同時支持兩種構建方式&#xff1a;Android Studio Gradle構建 IDE界面環境&#xff0c;對習慣java環境變成的友好、UI設計方便看效果Android15系統構建時自動構建 So…

yolo8目標檢測+訓練(識別和平精英人物)

?步驟一&#xff1a;安裝 PyTorch&#xff08;M1 專用&#xff09;# 推薦使用官方 MPS 后端&#xff08;Apple Metal 加速&#xff09; pip install torch torchvision torchaudio確認是否使用了 Apple MPS&#xff1a;import torch print(torch.backends.mps.is_available()…

【ArcGISPro】修改conda虛擬安裝包路徑

問題在ArcGISPro中經常使用克隆&#xff0c;導致C盤默認虛擬安裝包內存越來越大&#xff0c;導致電腦很卡解決方案打開ArcGISPro所在conda文件夾D:\Program Files\ArcGIS\Pro\bin\Python\Scripts打開命令行工具&#xff08;如 CMD 或終端&#xff09;。輸入以下命令&#xff0c…

三格電子—西門子PLC串口轉網口模塊

一、功能概述本文檔是西門子PLC串口轉以太網系列產品&#xff0c;包含SG-S7-200-ETH、S7-200-ETH(2P)&#xff0c;SG-S7-300-ETH&#xff0c;SG-S7-300-ETH(2P)共四個產品。使用框圖如下圖所示意。1.1 產品功能本系列產品用來給西門子S7-200/300 PLC串口擴展出網口來&#xff0…

Python—requests模塊

Python requests 模塊代碼演示 requests 是 Python 中一個簡單易用的 HTTP 庫&#xff0c;用于發送各種 HTTP 請求。下面是一些常見的使用示例&#xff1a; 1. 基本 GET 請求 import requests# 發送 GET 請求 response requests.get(https://api.github.com)# 檢查請求是否成功…

華為倉頡編程語言語法簡介與示例

華為倉頡編程語言語法簡介與示例 倉頡編程語言是華為自主研發的新一代通用編程語言&#xff0c;由南京大學馮新宇教授團隊主導設計&#xff0c;于 2024 年華為開發者大會&#xff08;HDC&#xff09;正式發布&#xff0c;并在 2025 年 7 月推出首個長期支持版本&#xff08;LTS…

觸發器的創建

- 建立product表&#xff0c;操作方式operate表要求1.定義觸發器實現在產品表(product)中每多一個產品,就在操作表(operate)中記錄操作方式和時間以及編號記錄。注&#xff1a;操作說明&#xff1a;標記執行delete 、insert、update2.定義觸發器實現在產品表(product)中每更新一…

論文略讀: RASA: RANK-SHARING LOW-RANK ADAPTATION

ICLR 2025盡管 LoRA 有諸多優勢&#xff0c;但近期研究表明&#xff0c;它在大規模訓練數據集和復雜任務&#xff08;如數學推理和代碼生成&#xff09;中&#xff0c;仍然落后于全參數微調&#xff08;FFT&#xff09;一個合理的解釋是&#xff1a;低秩約束限制了 LoRA 的表達…

VSCode - VSCode 查找中文字符

VSCode 查找中文字符 1、查找中文字符使用快捷鍵 Ctrl F 打開查找框點擊正則表達式按鈕 .*在搜索框中輸入 [\u4e00-\u9fa5]&#xff0c;這個范圍涵蓋了基本的中文字符2、查找中文字符串使用快捷鍵 Ctrl F 打開查找框點擊正則表達式按鈕 .*在搜索框中輸入 [\u4e00-\u9fa5]&a…

SQL基礎操作指南:增刪改查入門

前言 在日常數據庫操作中&#xff0c;掌握增刪查改是每個開發者必備的技能。下面我將通過實例解析SQL的核心操作要點&#xff0c;幫你避開常見陷阱。一、新增數據&#xff08;INSERT&#xff09; 單行插入&#xff1a;明確指定字段和值 INSERT INTO 表名(字段1, 字段2) VALUES …

Linux系統安裝Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南

前言&#xff1a;在應用項目部署中&#xff0c;“環境不一致”往往是開發與運維的痛點——本地能跑的代碼到了服務器就報錯&#xff0c;依賴版本、系統配置差異都可能成為隱患。而Docker的容器化技術恰好能解決這一問題&#xff0c;通過“一次構建&#xff0c;到處運行”的特性…

python的多線程無法并行只能并發,why?

標題python的多線程無法并行只能并發&#xff0c;why&#xff1f;python的多線程無法并行只能并發&#xff0c;why&#xff1f; 在 Python 中&#xff0c;特別是使用 CPython 解釋器時&#xff0c;由于存在 全局解釋器鎖&#xff08;GIL&#xff09;&#xff0c;即使在多核處理…