【C++初階】--- string類

1.STL簡介

STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架
在這里插入圖片描述

2.string類

2.1什么是string類

std::string 類是 C++ 標準庫中用于處理和操作字符串的一個類,它定義在 頭文件中。相較于 C 語言里以空字符 ‘\0’ 結尾的字符數組(C 風格字符串),std::string 類提供了更便捷、安全且強大的字符串處理功能。

2.2string類和STL的關系

std::string 是 C++ 標準庫中的一個類,它位于 頭文件中,雖然它本身并不嚴格屬于 STL 的核心組件(容器、算法、迭代器等),但它與 STL 緊密相關,具備很多與 STL 容器相似的特性

3.auto和范圍for

3.1auto關鍵字

  1. auto聲明的變量必須由編譯器在編譯時期推導而得。
  2. 用auto聲明指針類型時,用auto和auto*沒有任何區別,但用auto聲明引用類型時則必須加&
  3. 當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量。
  4. auto不能作為函數的參數,可以做返回值,但是建議謹慎使用
  5. auto不能直接用來聲明數組
#include<iostream>
#include<string>
using namespace std;int func1()
{return 10;
}// 不能做參數
//void func2(auto a)
//{}// 可以做返回值,但是建議謹慎使用
auto func3()
{return 3;
}int main()
{int a = 10;auto b = a;auto c = 'a';auto d = func1();// 編譯報錯:rror C3531: “e”: 類型包含“auto”的符號必須具有初始值設定項//auto e;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;int x = 10;auto y = &x;auto* z = &x;auto& m = x;//可以打印類型cout << typeid(x).name() << endl;cout << typeid(y).name() << endl;cout << typeid(z).name() << endl;cout << typeid(m).name() << endl;auto aa = 1, bb = 2;// 編譯報錯:error C3538: 在聲明符列表中,“auto”必須始終推導為同一類型//auto cc = 3, dd = 4.0;// 編譯報錯:error C3318: “auto []”: 數組不能具有其中包含“auto”的元素類型//auto array[] = { 4, 5, 6 };return 0;
}

3.2范圍for

  1. 對于一個有范圍的集合而言,由程序員來說明循環的范圍是多余的,有時候還會容易犯錯誤。因此C++11中引入了基于范圍的for循環。for循環后的括號由冒號“ :”分為兩部分:第一部分是范圍內用于迭代的變量,第二部分則表示被迭代的范圍,自動迭代,自動取數據,自動判斷結束。
  2. 范圍for可以作用到數組容器對象上進行遍歷
  3. 范圍for的底層很簡單,容器遍歷實際就是替換為迭代器
#include<iostream>
#include<string>
using namespace std;int main() 
{//數組的遍歷int arr[] = { 1,2,3,4,5,6,7 };for (auto ch : arr)//不可修改arr的內容{cout << ch << " ";}cout << endl;//可以修改arr的內容for (auto& ch : arr){ch *= 2;cout << ch << " ";}cout << endl;//對象的遍歷string st("hello world");for (auto ch : st){cout << ch << " ";}cout << endl;return 0;
}

4.遍歷數組的三種方式

  1. 下標+[]
  2. 迭代器遍歷
  3. 范圍for

注意:范圍for的ch只是st的一份拷貝,改變ch不會影響st。而迭代器會影響st

#include<iostream>
#include<string>
using namespace std;int main()
{string st("hello world");//1.下標+[]for (size_t i = 0; i < st.size(); i++){cout << st[i] << " ";}cout << endl;//2.迭代器string::iterator it = st.begin();while (it != st.end()){*it += 2;//可以修改內容cout << *it << " ";it++;}cout << endl;//3.范圍forfor (auto ch : st){ch -= 2;//可以修改,但不影響原內容cout << ch << " ";}cout << endl;return 0;
}

5.string類對象的常見構造

在這里插入圖片描述
在這里插入圖片描述

#include<iostream>
using namespace std;int main()
{//(1).無參構造string s1;//(2).拷貝構造string s3 = s1;//(3).從str的pos位置向后拷貝len個字符string s4("hello world", 6, 15);//從s2的第6個位置向后復制n個//string::npos, size_t npos = -1,即max_int//(4).帶參構造string s2("hello world");//(5).拷貝前n個字符string s5("hello world", 7);//拷貝前n個//(6).拷貝n個字符's'string s6(7, 'x');//拷貝n個字符return 0;
}

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

在這里插入圖片描述
在這里插入圖片描述

迭代器分為四種:正向迭代器、正向只讀迭代器、反向迭代器、反向只讀迭代器
在這里插入圖片描述

6.1begin()/end()和rbegin()/rend()

  1. begin()的用途是返回指向容器首元素的迭代器。
  2. end()的用途是返回指向容器末尾元素的下一個位置的迭代器
  3. rbegin()的用途是返回指向容器末尾元素的迭代器
  4. rend()的用途是返回指向容器首元素的前一個位置的迭代器。在這里插入圖片描述
#include<iostream>
#include<string>
using namespace std;int main()
{string st("hello world");//下標+[]遍歷for (size_t i = 0; i < st.size(); i++){cout << st[i] << " ";}cout << endl;//正向遍歷string::iterator it = st.begin();while (it != st.end()){cout << *it << " ";it++;}cout << endl;//反向遍歷string::reverse_iterator rit = st.rbegin();while (rit != st.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

在這里插入圖片描述

7.string類對象的容量操作

在這里插入圖片描述
在這里插入圖片描述

  1. size()和length()返回字符串長度
  2. max_size()返回可存儲的字符串的最大長度
  3. resize()用于調整字符串的大小,即保留多少容量(會刪除字符)
    在這里插入圖片描述
  4. capacity()返回已分配存儲的大小,不包括’\0’
  5. reserve()用于更改容量capacity
    在這里插入圖片描述
  6. clear()用于清除所有數據,一般不清容量
  7. empty()用于測試string是否為空
  8. shrink_to_fit()用于將容量收縮至長度大小
#include<iostream>
#include<string>
using namespace std;int main()
{string st("hello world");//size和length返回字符串的有效字符長度cout << "st字符長度->" << st.size() << endl;cout << "st字符長度->" << st.length() << endl << endl;//capacity()返回總空間大小cout << "st空間大小->" << st.capacity() << endl << endl;//empty()判空,空返回true,否則返回falseif (st.empty() == true){cout << "st字符串為空" << endl << endl;}else{cout << "st字符串不為空" << endl << endl;}//clear()清空有效字符,一般不會清空間st.clear();cout << "st字符長度->" << st.size() << endl;cout << "st空間大小->" << st.capacity() << endl << endl;string st1("xxxxxxxxxxxxxxxxxxx");cout << "str1字符長度->" << st1.size() << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;//reserve(n) 只有n>capacity時才一定改變,空間會變成>=n//其他情況看編譯器自行優化st1.reserve(10);cout << "str1字符長度->" << st1.size() << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;st1.reserve(20);cout << "str1字符長度->" << st1.size() << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;st1.reserve(90);cout << "str1字符長度->" << st1.size() << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;st1.resize(30);cout << "str1字符長度->" << st1.size() << endl;cout << st1 << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;st1.resize(35, 'y');cout << "str1字符長度->" << st1.size() << endl;cout << st1 << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;st1.resize(10);cout << "str1字符長度->" << st1.size() << endl;cout << st1 << endl;cout << "str1空間大小->" << st1.capacity() << endl << endl;return 0;
}

在這里插入圖片描述

8.string類對象的修改操作

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

#include<iostream>
#include<string>
using namespace std;int main()
{string st("hello world");string st1("hello everyone");//operator+=,在尾部追加對象、字符串、字符st += st1;cout << st << endl;st += "XXXXXXXXXXX";cout << st << endl;st += 'y';cout << st << endl;string st2("welcome ");string st3("to here");//append,在尾部追加字符串st2.append(st3);cout << st2 << endl;//push_back將字符 c 追加到字符串的末尾,將其長度增加 1st2.push_back('H');cout << st2 << endl;//assign為字符串分配一個新值,替換其當前內容。st2.assign(st3);cout << st2 << endl;//insert頭插st2.insert(0, st3);cout << st2 << endl;//erase擦除字符串的一部分,減少其長度:st2.erase(0, st3.size());cout << st2 << endl;//replace將字符串中從字符pos開始并跨越len字符的部分替換為新內容:st2.replace(0, 1, "%");cout << st2 << endl;//swapst2.swap(st3);cout << st2 << endl;cout << st3 << endl;swap(st2, st3);cout << st2 << endl;cout << st3 << endl;//pop_back擦除字符串的最后一個字符,從而有效地將其長度減少 1。st2.pop_back();cout << st2 << endl;return 0;
}
#include<iostream>
#include<string>
using namespace std;int main()
{string st("hello world");//c_str()獲取等效字符串cout << st.c_str() << endl;//data獲取字符串數據cout << st.data() << endl;//copy將字符串對象當前值的子字符串復制到 s 指向的數組中。此子字符串包含從位置 pos 開始的 len 字符。char buff[20];//copy(s,len,pos)st.copy(buff, 5, 0);buff[6] = '\0';cout << buff << endl;//find返回找到的位置下標int ret = st.find(' ');cout << ret << endl;//沒找到返回-1string st1("worlddx");ret = st.find(st1, 0);cout << ret << endl;//rfind,反著找ret = st.rfind('d');cout << ret << endl;//find_first_of在字符串中搜索與其參數中指定的任何字符匹配的第一個字符。ret = st.find_first_of("whcasuy");cout << ret << endl;//find_last_of在字符串中搜索與參數中指定的任何字符匹配的最后一個字符。ret = st.find_last_of("whcasuy");cout << ret << endl;//find_first_not_of在字符串中搜索與參數中指定的任何字符都不匹配的第一個字符。ret = st.find_first_not_of("hello ");cout << ret << endl;//find_last_not_of在字符串中搜索與參數中指定的任何字符都不匹配的最后一個字符。ret = st.find_last_not_of("heo word");cout << ret << endl;//substr返回一個新構造的對象,其值初始化為此對象的子字符串的副本。cout << st.substr(0) << endl;cout << st.substr(0, 5) << endl;//compare將字符串對象(或子字符串)的值與其參數指定的字符序列進行比較。ret = st.compare(0, 5,"hello");cout << ret << endl;return 0;
}

9.string類非成員函數

在這里插入圖片描述

在這里插入圖片描述

#include<iostream>
#include<string>
using namespace std;int main()
{//operator+連接兩對象,或者對象和字符串string st("hello");string st1(" world");cout << st + " world" << endl;cout << st + st1 << endl;swap(st, st1);cout << st << endl;cout << st1 << endl;//operator>>從流中提取字符串//opsrator<<將字符串插入流中string st2;cin >> st2;cout << st2 << endl;//getline從istream中提取字符并將其存儲到str中,直到找到分隔符string st3;//遇到換行停下getline(cin, st3, '\n');cout << "st3:" << st3 << endl;return 0;
}

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

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

相關文章

Ubuntu 20.04 中 Git 的安裝、配置和基本操作指南

本文為經驗 所談 使用版本為ubuntu20.04 1 ubuntu的git初始化 1.安裝git sudo apt-get install git 可通過git --version 命令查看&#xff0c;正常輸出git版本號即安裝成功。 2.配置用戶名和郵箱名 git config --global user.name "Your Name" git config --globa…

conda 激活環境vscode的Bash窗口

多份conda環境注意事項&#xff0c;當時安裝了兩個conda環境&#xff0c;miniconda和conda&#xff0c;導致環境總是沖突矛盾。初始化時需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能夠顯示用哪里的conda環境命令執行。 然后直接conda activate…

Mac下小智AI本地環境部署

可以進行聊天、編寫程序、播放歌曲等等的小智語音聊天小助手&#xff0c;在Mac環境下修改源代碼&#xff0c;值得擁有。本篇內容主要講解Mac下環境的搭建&#xff0c;WebSocket的修改。注&#xff1a;環境python3.12.0、ESP-IDF5.4.0、開發板ESP32S3。 目錄 1.Git安裝2.Python…

Linux安裝Cmake (Centos 7.9)

cmake安裝 這個雖然已經更新到了4.0.0版本了&#xff0c;但是我們要用3.5版本的&#xff0c;因為這個比較穩定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;選擇那個cmake-3.5.0-Linux-x86_64.tar.gz下載&#xff0c; 首先解壓文…

基于 SpringBoot 的舊物置換網站

收藏關注不迷路&#xff01;&#xff01; &#x1f31f;文末獲取源碼數據庫&#x1f31f; 感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff08;免費咨詢指導選題&#xff09;&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;希望幫助更多…

ELK 通過 logstash 收集單個/多個日志文件

一、收集單個日志文件 注意事項&#xff1a; logstah 服務默認啟動用戶和組是 logstash被收集的日志文件有讀的權限并對寫入的文件有寫權限而 logstash 是普通用戶 1.1 編輯 logstash 配置文件 vim /etc/logstash/conf.d/test.conf input {file {path > "/var/log/…

分享一個Drools規則引擎微服務Docker部署

通常我們都是把Drools作為嵌入式使用&#xff0c;但在微服務泛濫時代&#xff0c;還在老套的嵌入式顯然不符合微服務架構要求&#xff0c;本文分享一個把Drools作為微服務獨立部署的方案。 本方案基于Drools引擎微服務&#xff0c;提供REST接口。 1、可以動態部署Drools規則2…

Mac 本地化部署 dify

Macbook 本地化部署 dify 目錄 Macbook 本地化部署 dify安裝dockerdocker下載地址 安裝dify下載dify到本地github可能遇到的問題: github打開超時在本地解壓dify.zip文件本地化部署docker部署可能遇到的問題: 部署超時登錄體驗 dify 安裝docker docker下載地址 根據電腦芯片選…

串口中斷接收與環形緩沖實例(apollo3 blue plus)

#define DEV_UART1 1 #define GPS_POWER_PIN 13 #define GPS_LOG_ENABLE 1 #define MAX_UART1_SIZE 1024 #define AM_BSP_GPIO_COM_UART1_TX 8 #define AM_BSP_GPIO_COM_UART1_RX 9 // 定義環形緩沖區結構 typed…

操作系統高頻(五)linux命令

操作系統高頻&#xff08;五&#xff09;linux命令 1.Linux中查看進程運行狀態的指令、tar解壓文件的參數。??? 在Linux中&#xff0c;可以使用以下指令查看進程的運行狀態&#xff1a; top&#xff1a; 用于實時監視系統的進程活動和系統資源使用情況。在終端中運行top…

Spring Boot 快速入手

前言&#xff1a;為什么選擇 Spring Boot&#xff1f; &#x1f680; 在現代 Java 開發中&#xff0c;Spring Boot 已成為最流行的后端框架之一。無論是小型 Web 應用、企業級系統&#xff0c;還是微服務架構&#xff0c;Spring Boot 都能提供快速開發、自動配置、輕量級部署的…

oracle-blob導出,在ob導入失敗

導出&#xff1a; [oraclelncs dmp]$ /home/oracle/sqluldr2 gistar/res#pwd192.168.205.58:1521/lndb query"select * from an_odn_picture where length(PIC_CONTENT)<25000" filean_odn_picture.csv Charsetutf8 textCSV 0 rows exported at 2025-…

RK3568 pinctrl內容講解

文章目錄 一、pinctrl的概念`pinctrl` 的作用設備樹中的 `pinctrl` 節點典型的 `pinctrl` 節點結構例子`pinctrl` 的重要性總結二、RK3568的pinctrl講解1. `pinctrl` 節點2. `gpio0` 至 `gpio4` 子節點每個 `gpioX` 子節點的結構和作用3. `gpio1` 到 `gpio4` 子節點總結1. `aco…

北京南文觀點:后糖酒會營銷,以戰略傳播重構品牌信心坐標

第112屆全國糖酒會落下帷幕&#xff0c;參展品牌面臨一個關鍵命題。如何在流量洪流中沉淀品牌價值&#xff1f;北京南文&#xff08;全稱&#xff1a;南文樂園科技文化&#xff08;北京&#xff09;有限公司&#xff09;認為&#xff0c;糖酒會的結束恰是算法時代品牌認知戰的真…

html5時鐘升級!支持切換深淺模式 Canvas實現現代化動態時鐘

HTML5 Canvas實現現代化動態時鐘 這里寫目錄標題 HTML5 Canvas實現現代化動態時鐘項目介紹技術實現1. 項目架構2. Canvas繪圖實現2.1 表盤繪制2.2 刻度繪制2.3 指針繪制 3. 動畫效果4. 主題切換 項目亮點技術要點總結項目收獲改進方向結語 項目介紹 本項目使用HTML5 Canvas技術…

《SRv6 網絡編程:開啟IP網絡新時代》第2章、第3章:SRv6基本原理和基礎協議

背景 根據工作要求、本人掌握的知識情況&#xff0c;僅針對《SRv6 網絡編程&#xff1a;開啟IP網絡新時代》書籍中涉及的部分知識點進行總結梳理&#xff0c;并與工作小組進行分享&#xff0c;不涉及對原作的逐字搬運。 問題 組內同事提出的問題&#xff1a;本文缺擴展頭描述…

衛星電話究竟是“錦上添花”?還是“剛需之選”?

在萬物互聯的時代浪潮中&#xff0c;衛星電話究竟是可有可無的“錦上添花”&#xff0c;還是至關重要的“剛需之選”&#xff1f;隨著通信技術的持續進步與應用場景的日益拓展&#xff0c;這一問題的答案正逐漸明晰。 在5G基站覆蓋99%行政村的今天&#xff0c;人類依然要直面自…

C語言復習筆記--指針(1)

今天我們進入指針的復習了.這部分有很多知識,話不多說,讓我們進入指針的世界吧. 內存和地址 要想學指針就不能不學內存和地址. 內存 其中&#xff0c;每個內存單元&#xff0c;相當于?個學?宿舍&#xff0c;? 個字節空間??能放8個?特位&#xff0c;就好?同學們 住的??…

【藍橋杯每日一題】4.1

&#x1f3dd;?專欄&#xff1a; 【藍橋杯備篇】 &#x1f305;主頁&#xff1a; f狐o貍x "今日禿頭刷題&#xff0c;明日榮耀加冕&#xff01;" 今天我們來練習二分算法 不熟悉二分算法的朋友可以看&#xff1a;【C語言刷怪篇】二分法_編程解決算術問題-CSDN博客 …

【設計模式】過濾器模式

過濾器顧名思義&#xff0c;定義一些過濾規則&#xff0c;將符合要求的內容篩選&#xff0c;就比如過濾不同大小或者不同顏色的水果&#xff0c;需要顏色和大小過濾器&#xff0c;篩選條件獨立為對象&#xff0c;可以通過靈活組合形成過濾鏈條。避免大量使用判斷語句。 案例代…