CD34.【C++ Dev】STL庫的string的使用 (上)

目錄

1.知識回顧

2.串聯類和對象的知識重新理解

構造函數

string();

string (const string& str);

string (const string& str, size_t pos, size_t len = npos);

string (const char* s);

string (size_t n, char c);

append和push_back

string& append (const string& str);?

string& append (const string& str, size_t subpos, size_t sublen);

string& append (const char* s);?

string& append (const char* s, size_t n);

template string& append (InputIterator first, InputIterator last);

operator+=

operator[ ]

理解[ ]本質是解引用

上方代碼能否訪問到\0?

方法1:下條件斷點后監視

方法2:反匯編后看內存,手動查找

方法3:直接監視窗口看封裝好的string類的str

缺點


1.知識回顧

之前在C++ Contest專欄提到過string的使用

CC12.【C++ Cont】string類字符串的創建、輸入、訪問和size函數

CC13.【C++ Cont】初識string類字符串的迭代器

CC14.【C++ Cont】string類字符串的push_back、pop_back、字符串+=與+運算和insert

CC15.【C++ Cont】string類字符串的find和substr函數

CC16.【C++ Cont】string類字符串的關系運算和與string有關的函數

2.串聯類和對象的知識重新理解

上方提到的文章講的比較淺,只是介紹了怎么用,本文將用類和對象的思想來理解

以https://legacy.cplusplus.com/reference/string/string/?kw=string網為線索:

構造函數

?下面只講常用的

string();

無參數傳遞,即默認構造,也稱無參構造

string (const string& str);

傳參的類型為const string,為拷貝構造

string (const string& str, size_t pos, size_t len = npos);

傳參的類型為const string,為拷貝構造,只不過是拷貝構造str的子串,顯然第3個參數是缺省參數,如果不寫,默認從pos位置一直截取的string風格的字符串的結尾

string (const char* s);

const char*為C語言風格的字符串類型,因此為使用C風格的字符串構造

string (size_t n, char c);

使用n個字符c來構造

append和push_back

https://legacy.cplusplus.com/reference/string/string/append/

append v.追加 即向原string類字符串后追加字符串,作用類似push_back,只不過push_back只能追加字符

有關push_back成員函數的簡單使用參見CC14.【C++ Cont】string類字符串的push_back、pop_back、字符串+=與+運算和insert文章

此外:如果string的空間不夠,append或push_back會自動擴容,(具體的擴容策略和編譯器的處理有關,沒有統一的規定),C語言strcat,不能自動擴容且找\0耗時

string& append (const string& str);?

向原string類字符串后追加string類字符串(類似push_back)

string& append (const string& str, size_t subpos, size_t sublen);

向原string類字符串后追加string類字符串str的子字符串

string& append (const char* s);?

向原string類字符串后追加C語言風格的字符串

string& append (const char* s, size_t n);

向原string類字符串后追加C語言風格的字符串的前n個字符

代碼示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("teststring");str.append("abcdef", 3);cout << str << endl;return 0;
}

運行結果:

template <class InputIterator>
?? string& append (InputIterator first, InputIterator last);

?向原string類字符串后追加范圍為[first,last)的一串字符

代碼示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1("teststring");string str2("000abc111");str1.append(str2.begin()+3,str2.begin()+6);cout << str1 << endl;return 0;
}

運行結果:

operator+=

參見CC14.【C++ Cont】string類字符串的push_back、pop_back、字符串+=與+運算和insert文章

operator[ ]

https://legacy.cplusplus.com/reference/string/string/operator[]/

給了兩種重載形式,一個可以修改字符串,一個不能修改字符串

可做如下測試:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1("helloworld");const string str2("teststring");str1[1];str2[1];return 0;
}

寫法等價為:使用點操作符調用成員函數

str1.operator[](1);
str2.operator[](2);

從地址上看,調用operator[]的地址不同,因此是不同的重載函數:

如果從operator[]函數的定義上來看:

str1[1]的operator[]沒有有const修飾:

str2[1]的operator[]有const修飾:

理解[ ]本質是解引用

代碼示例:可以像數組一樣訪問

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("helloworld");for (size_t i = 0; i < str.size(); i++)cout << str[i];return 0;
}

運行結果:

上方代碼能否訪問到\0?
方法1:下條件斷點后監視

監視窗口查看:

str[i]解引用后是最后一個字母d,不是\0

方法2:反匯編后看內存,手動查找

Debug+x86環境下,for循環的反匯編代碼:

發現ebp-3Ch和ebp-30h高頻出現,由mov dword ptr [ebp-3Ch],0 猜測這是為變量i賦初值,因此[ebp-3Ch]存的是i的值,?由cmp dword ptr [ebp-3Ch],eaxjae 00540BDD猜測這是i < str.size()的條件判斷,因此猜測eax臨時存儲的是str.size的值,可以看看寄存器:

0x0000000A=十進制的10,不帶\0的helloworld恰好占10個字節,因此不會訪問到\0

方法3:直接監視窗口看封裝好的string類的str

備注:如果想強制打印\0可以將i < str.size()改成i <= str.size()

循環后再打印一個#檢測\0有沒有占位:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str("helloworld");for (size_t i = 0; i <= str.size(); i++)cout << str[i];cout << "#";return 0;
}

Visual Studio 2022查看控制臺窗口:

發現\0不顯示,且不占位,因為VS認為str[i]超出界限,因此沒有為\0占位

Dev C++查看控制臺窗口:

發現\0不顯示,且占位

Ubuntu Linux g++運行結果:

發現\0不顯示,且不占位

發現不同平臺的處理方法不同

缺點

Operator[ ]只有連續的空間才能使用,即非線性結構不能使用[ ]訪問,但一些線性結構和非線性結構都可以使用迭代器訪問,例如鏈表:

#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{ list<int> ls;ls.push_back(1);ls.push_back(3);ls.push_back(13);ls.push_back(0);ls.push_back(43);ls.push_back(546);ls.push_back(9);for (auto i = ls.begin(); i != ls.end(); i++){cout << *i << "-->";}cout << "NULL";return 0;
}

運行結果:

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

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

相關文章

Git常用指令速查

Git常用指令速查 基本操作類&#xff1a; git init &#xff1a;初始化倉庫git log&#xff1a;查看日志&#xff0c;這個命令很重要&#xff01;git add <文件名|.>&#xff1a;添加到暫存區git commit -m 注釋&#xff1a;提交到倉庫git merge <分支名>&#xf…

探索無人機模擬環境的多元景象及AI拓展

無人駕駛飛行器&#xff08;UAVs&#xff09;在各行各業的迅速普及&#xff0c;從農業和檢測到空中操作和人機交互等令人興奮的前沿領域&#xff0c;都引發了一個關鍵需求&#xff1a;強大而逼真的模擬環境。直接在物理硬件上測試尖端算法存在固有的風險——成本高昂的墜機、中…

AI Agent開源技術棧

構建和編排Agent的框架 如果您是從頭開始構建&#xff0c;請從這里開始。這些工具可以幫助您構建Agent的邏輯——做什么、何時做以及如何處理工具。您可以將其視為將原始語言模型轉化為更自主的模型的核心大腦。 2. 計算機和瀏覽器的使用 一旦你的Agent能夠規劃&#xff0c…

jspm老年體檢信息管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 信息化時代&#xff0c;各行各業都以網絡為基礎飛速發展&#xff0c;而醫療服務行業的發展卻進展緩慢&#xff0c;傳統的醫療服務行業已經逐漸不滿足民眾的需求&#xff0c;有些還在以線下預約的方式接待病人&#xff0c;特別是針對于老年體檢的服務&#xff0c;是少之又…

ESP32- 開發筆記- 軟件開發 4 - GPIO 口

1 背景介紹 GPIO&#xff08;General Purpose Input/Output&#xff09; ——通用輸入輸出口&#xff0c;就是能由軟件自由控制輸入&#xff08;接收外界信號&#xff09;或輸出&#xff08;發出電平信號&#xff09;的引腳。 ESP32 最核心的功能之一&#xff0c;能被用來控制…

格式工廠:多媒體轉換工具

格式工廠&#xff08;FormatFactory&#xff09;是一款免費且功能全面的多媒體格式轉換工具&#xff0c;支持視頻、音頻、圖片及文檔等多種格式的轉換&#xff0c;覆蓋超過70種語言&#xff0c;并兼容Windows XP至Win10/11系統。軟件基于FFmpeg解碼庫開發&#xff0c;支持高效轉…

在Anolis OS 8上部署Elasticsearch 7.16.1與JDK 11的完整指南

目錄 1. 環境與版本選擇 1.1 操作系統選擇:Anolis OS 8 1.2 版本匹配說明 1.3 前置條件檢查 2. JDK 11安裝與配置 2.1 安裝流程 2.2 配置詳解 3. Elasticsearch 7.16.1安裝與優化 3.1 基礎安裝 3.2 目錄規劃與權限 3.3 核心配置文件詳解 3.4 JVM調優 4. 用戶權限管…

Java中final關鍵字的作用?

在Java中&#xff0c;final 關鍵字用于表示不可變性&#xff0c;具體作用取決于它修飾的目標&#xff08;變量、方法或類&#xff09;。以下是其核心作用&#xff1a; 1. 修飾變量&#xff08;常量&#xff09; 基本類型變量&#xff1a;值不可更改&#xff08;常量&#xff09…

自動伴隨無人機說明文檔

自動伴隨無人機說明文檔 一、無人機參數二、能力說明三、操作流程3.1 模式定義3.2 啟動流程3.3 可調參數&#xff08;建議默認&#xff09; 四、特別注意五、最后 一、無人機參數 型號&#xff1a;S400視覺pro版軸距&#xff1a;400mm起飛重量&#xff1a;1300g額外載重&#…

53.[前端開發-JS實戰框架應用]Day04-Bootstrap入門到項目實戰

Bootstrap入門到實戰 1 認識Bootstrap 認識Bootstrap Bootstrap起源和歷史 Bootstrap3-5版本的區別 Bootstrap優缺點 學習Bootstrap的理由 2 Bootstrap安裝 Bootstrap4的安裝 方式一 : CDN <!DOCTYPE html> <html lang"en"> <head><meta cha…

C#:創建變量和類的實例

在 C# 編程中&#xff0c;類作為引用類型&#xff0c;創建其變量和實例涉及到內存分配等重要概念。以下為你詳細介紹創建類實例的步驟和相關操作。 類的聲明與變量聲明 類的聲明就像是創建類實例的藍圖。當我們聲明一個類后&#xff0c;就能夠創建該類的實例。類屬于引用類型…

<el-date-picker 設置記錄時間早于當前時間 (包含時分秒)

<el-date-picker 設置記錄時間早于當前時間 &#xff08;包含時分秒&#xff09; <el-date-pickerv-else-if"item.type datetime"v-model"state.ruleForm[item.key]"type"datetime":placeholder"item.title"format"YYYY-M…

Tailwind CSS 響應式設計解析(含示例)

本文內容&#xff1a; Tailwindcss V4 中如何使用響應式設計功能&#xff0c;包括默認斷點、自定義斷點、斷點范圍控制以及容器查詢的各種技巧&#xff0c;幫助你在不離開 HTML 的前提下優雅構建響應式頁面。 &#x1f31f; 默認斷點用法&#xff08;移動優先&#xff09; Tail…

生態修復項目管理軟件

在“雙碳”目標與生態文明建設的雙重驅動下&#xff0c;生態修復項目正成為全球環境治理的核心戰場。然而&#xff0c;礦山復綠、濕地修復、水土保持等工程往往面臨跨地域、多主體、長周期的管理難題——從數據分散到進度失控&#xff0c;從成本超支到風險頻發&#xff0c;傳統…

基于PyTorch的圖像分類特征提取與模型訓練文檔

概述 本代碼實現了一個基于PyTorch的圖像特征提取與分類模型訓練流程。核心功能包括&#xff1a; 使用預訓練ResNet18模型進行圖像特征提取 將提取的特征保存為標準化格式 基于提取的特征訓練分類模型 代碼結構詳解 1. 庫導入 import torch import torch.nn as nn import…

寫一個 Java 程序,用于將字符串中的指定子串替換為另一個子串

以下是一個 Java 程序&#xff0c;它可以將字符串中的指定子串替換為另一個子串。 public class SubstringReplacement {public static String replaceSubstring(String original, String oldSubstring, String newSubstring) {return original.replace(oldSubstring, newSubs…

Docker 容器雙網卡訪問物理雷達網絡教程

作者&#xff1a; 陳梓洋 環境&#xff1a; ubuntu 22.04lts 時間&#xff1a; 2025年4月29日 Docker 容器雙網卡訪問物理雷達網絡教程 這個教程適用于這樣的場景&#xff1a;容器保留原有 ROS 通信網絡&#xff08;如 bridge 網絡&#xff09;&#xff0c;同時需要訪問一個物…

AWS創建多塊盤并創建RAID0以及后增加空間

創建硬盤并掛載到EC2上,后查詢如下 [rootip-127-0-0-1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 40G 0 disk ├─nvme0n1p1 259:1 0 40G 0 part / ├─nvme0n1p127 259:2 0 1M 0 part └─nvme0n1p128 259:3 …

數據結構---單鏈表的增刪查改

前言&#xff1a; 經過了幾個月的漫長歲月&#xff0c;回頭時年邁的小編發現&#xff0c;數據結構的內容還沒有寫博客&#xff0c;于是小編趕緊停下手頭的活動&#xff0c;補上博客以洗清身上的罪孽 目錄 前言 概念&#xff1a; 單鏈表的結構 我們設定一個哨兵位頭節點給鏈…

XSS靶場實戰(工作wuwuwu)

knoxss knoxss Single Reflection Using QUERY of URL ——01 測試標簽 <script>alert(666666)</script>——02: " <h1>test</h1>沒有反應&#xff0c;查看源碼 現在需要閉合雙引號&#xff0c;我計劃還是先搞標簽 "><h1>tes…