我與C++的愛戀:string類的常見接口函數

?

?
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

🔥個人主頁guoguoqiang. 🔥專欄我與C++的愛戀

Alt

朋友們大家好啊,本節我們來到STL內容的第一部分:string類接口函數的介紹

?
?

1.string類的認識

給大家分享一個c++文檔

https://legacy.cplusplus.com/

在這里插入圖片描述

  1. 字符串 string 是表示字符序列的類
  2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作
    單字節字符字符串的設計特性。
  3. string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信
    息,請參閱basic_string)。
  4. string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits
    和allocator作為basic_string的默認參數(根于更多的模板信息請參考basic_string)。
  5. 注意,這個類獨立于所使用的編碼來處理字節:如果用來處理多字節或變長字符(如UTF-8)的序列,這個
    類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(而不是實際編碼的字符)來操作。
    總結:
  6. string是表示字符串的字符串類
  7. 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。
  8. string在底層實際是:basic_string模板類的別名,typedef basic_string<char, char_traits, allocator>string;
  9. 不能操作多字節或者變長字符的序列。
    在使用string類時,必須包含#include頭文件以及using namespace std;

2.常見接口講解

2.1 string類對象的常見構造

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

string() 這個函數的功能是構建一個空字符串,也是默認構造。
string(const char*s) 用c—str來構造string類對象
用法:string s1("hello world");
string(const string&s) 拷貝構造函數
用法:
string s1("hello world"); string s2(s1);
`
string (const string& str, size_t pos, size_t len= npos);
在這里插入圖片描述
拷貝從pos位置開始,向后len長度,如果超過剩余長度,則遍歷到字符串的末尾

注意,這里有個npos的缺省值,如果不給值,默認給npos,會遍歷到字符串末尾。
了解一下npos
在這里插入圖片描述

npos是一個無符號常量整數-1,無符號整數-1即為整形的最大值2^32-1
用法:

string s1("hello world");
string s3(s1, 5, 3);
string s4(s1, 5, 10);
string s5(s1, 5);
cout << s1 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;

輸出結果:

hello worldwoworldworld

string(const char*s,size_t n);
在這里插入圖片描述
函數的功能是拷貝字符串的前n個字符
在這里插入圖片描述
string(size_t n,char c);
在這里插入圖片描述
這個函數的功能就是用n個字符c來構造字符串,用法:
在這里插入圖片描述

2.2 對string對象的遍歷和修改

對于string遍歷使用[]遍歷最為方便
在這里插入圖片描述
函數的功能是返回pos位置的字符

int main() {string s1("hello world");for (int i = 0; i < s1.size(); i++) {cout << s1[i] << " ";}cout << endl;return 0;
}

在這里插入圖片描述
字符串長度通過s.size()來表示。
operator[]是一個重載的操作符,用于直接訪問和修改字符串中特定索引位置的字符
char& operator[] (size_t pos);
返回的為引用,意味著我們還可以對這個位置進行修改。
例如:

int main() {string s1("hello world");for (int i = 0; i < s1.size(); i++) {s1[i]++;cout << s1[i] << " ";}cout << endl;return 0;
}

在這里插入圖片描述
這里我們發現還有第二種重載方式:

const char& operator[] (size_t pos) const;

const定義的對象是只讀的,不能對其進行修改

迭代器iterators
在這里插入圖片描述
迭代器的作用是用來訪問容器(用來保存元素的數據結構)中的元素,所以使用迭代器,我們就可以訪問容器中里面的元素。這和訪問數組這個序列的指針一樣,因為數組范圍內的指針就是迭代器的一種。

int main() {string s1("hello world");string::iterator it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << " ";++it1;}cout << endl;return 0;
}

在這里插入圖片描述
在這里插入圖片描述
begin作用是返回第一個有效位置的迭代器,end是返回最后一個元素的下一個位置,也就是/0的位置。

在這里插入圖片描述

雖然我們習慣使用下標來訪問,但是有時候只能只能使用迭代器來訪問(迭代器的訪問范圍更廣泛),比如后面的list部分。所以迭代器才是最重要的方式。

反向迭代器
在這里插入圖片描述
它返回的是字符串末尾的迭代器,我們用這一組迭代器可以實現逆序遍歷
在這里插入圖片描述
在這里插入圖片描述

int main() {string s1("hello world");string::reverse_iterator it1 = s1.rbegin();while (it1 != s1.rend()) {cout << *it1 << " ";++it1;}cout << endl;return 0;
}

還有const版本

const_iterator begin() const;
int main() {string s1("hello world");string::const_iterator it1 = s1.begin();while (it1 != s1.end()) {//(*it1)++;    //如果修改會編譯報錯cout << *it1 << " ";++it1;}cout<<endl;return 0;
}

對const字符串進行遍歷,const_iterator是只讀的,不可寫
在這里插入圖片描述
范圍for

string s1("hello world");
for (auto e : s1)
{cout << e << " ";
}
cout << endl;

范圍for本質就是迭代器

2.3 string類對象的容量操作

在這里插入圖片描述
size
size的功能是返回字符串長度
在這里插入圖片描述
capacity

在這里插入圖片描述

void func2()
{string s;size_t sz = s.capacity();cout << sz << endl;for (int i = 0; i < 100; i++){s.push_back('a');if (sz != s.capacity()){sz = s.capacity();cout << "容量:" << sz << endl;}}
}

通過上述函數來看一下它的擴容機制
在這里插入圖片描述
我們發現第一次是以2倍擴容,后面都是1.5倍擴容。

clear
clear作用是清空有效字符,但它對capacity沒有影響

void func3() {string s("hello world");size_t sz = s.capacity();cout << s << endl;cout << sz << endl;s.clear();cout << s << endl;cout << s.capacity() << endl;}

在這里插入圖片描述
empty
檢測字符串釋放為空串,是返回true,否則返回false
reserve
reserve(size_t res_arg=0):為string預留空間,不改變有效元素個數,當reserve的參數小于string的底層空間總大小時,reserver不會改變容量大小。
當你知道將要在字符串中存儲具體數量的字符時,使用reserve可以減少因反復增加字符串大小而導致的多次內存分配和數據復制,從而提高性能。(提前開好,減少擴容,提高效率)
擴容可能會開辟新的空間,使用reserve我們就可以減少擴容

string s;
s.reserve(100);
cout << s.capacity() << endl;

在這里插入圖片描述
reserve的調用是一個請求,所以他申請的空間可能大于你要的空間,但不會小于。(g++中是剛好等于你要的空間)
在這里插入圖片描述
reserve不會進行縮容,比當前capacity大才會進行擴容

resize
在這里插入圖片描述
resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數改變到n個,不同的是當字符個數增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。
注意:resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變。
如果個數不變,resize不會對字符串進行任何修改。

void func5() {string str("hello");str.resize(10, 'x');//結果  helloxxxxxstr.resize(2);  //結果  hestr.resize(5);  //結果  hellocout << str << endl;
}

resize直接修改字符串本身,如果你增長字符串并且不指定填充字符則填充空字符’\0’ ,如果減小字符串長度,被移除的字符就被丟棄,而且無法恢復。

2.4 string類對象的修改操作

push_back
在字符串后面尾插字符

string s("abcdef");
s.push_back('e');
cout<<s<<endl;//abcdefe

append
在字符串后追加一個字符串

void test_string10() {string s("hell");s.push_back('o');cout << s << endl;s.append("world");cout << s << endl;
}

在這里插入圖片描述
在這里插入圖片描述
append也可以插入string,或者插入string的部分。還可以插入n個字符

void test_string11() {string s("hell");string s1("o world!");s.append(s1);cout << s << endl;
}

在這里插入圖片描述

void test_string11() {string s("hell");string s1("o world!");s.append(s1,0,2);cout << s << endl;//hello 
}

還可以插入字符串的迭代區間

void test_string12() {string s("hell");string s1("o world!");s.append(s1.begin(),s1.end());cout << s << endl;
}

在這里插入圖片描述
如果在這里我們不想要感嘆號可以這樣追加:

void test_string12() {string s("hell");string s1("o world!");s.append(s1.begin(),--s1.end());cout << s << endl;
}

在這里插入圖片描述
operator+=
在這里插入圖片描述
operator+=十分方便,我們可以直接追加一個string對象,或者一個字符串,或者一個字符

insert和erase
在這里插入圖片描述

insert可以在指定位置插入數據。

void test_string13() {string s("hello");s.insert(0, "xxx");cout << s << endl;
}

在這里插入圖片描述
erase
在這里插入圖片描述
從pos位置開始刪除,這里pos給的缺省值,如果不傳參,則全部刪除,len的缺省值為npos,如果len大于剩余字符長度(_size-pos),也會全部刪除掉
replace
在這里插入圖片描述
對string對象內容進行替換

void test_string14() {string s("hello  ");s.replace(6,1, "world");//把下標為6的那個字符修改為world字符串cout << s << endl;
}

在這里插入圖片描述
find
在這里插入圖片描述
find用于搜索字符串中第一次出現的指定子字符串或字符的位置。如果找到了指定的子字符串或字符,find會返回它開始的位置的索引;如果沒有找到,它會返回一個特殊的常量std::string::npos(這個是無效的位置),表示未找到任何匹配。
find函數的常見用法:

  1. 搜索字符
string str = "Hello, world!";
size_t pos = str.find('w');
if (pos != string::npos) {cout << pos << endl;// 找到了字符 'W'
}
  1. 搜索子字符串
string str = "Hello, world!";
size_t pos = str.find("world");
if (pos != string::npos) {printf("找到了子字符串 \"world\"");
}
  1. 從指定位置開始搜索
string str = "Hello, world! world!";
size_t pos = str.find("world", 8); // 從索引8開始搜索
if (pos != string::npos) {printf("找到了第二個 \"world\"");
}

find函數可以搜索字符串中的內容,是處理字符串時常用的功能之一

本節內容到此結束!感謝大家閱讀!!

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

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

相關文章

Weblogic 管理控制臺未授權遠程命令執行漏洞(CVE-2020-14882,CVE-2020-14883)

1 漏洞概述 Weblogic Pre-Auth Remote Command Execution 漏洞&#xff08;CVE-2020-14882, CVE-2020-14883&#xff09;是針對 Oracle WebLogic Server 的兩個安全漏洞。CVE-2020-14882 允許遠程用戶繞過管理員控制臺組件中的身份驗證&#xff0c;而 CVE-2020-14883 則允許經…

Python3 筆記:Python的函數

函數是編寫好的&#xff0c;可重復調用的&#xff0c;用來實現某一功能的一段代碼。 也可以理解為做某事的方法和步驟。第一次做的時候寫好了方法&#xff0c;下次同類型的事直接拿來就用。 Python 內部有很多功能強大的內置函數供我們使用&#xff0c;除此之外&#xff0c;你…

Nagle算法

Nagle算法簡介 Nagle算法主要是避免發送小的數據包&#xff0c;要求TCP連接上最多只能有一個未被確認的小分組&#xff0c;在該分組的確認到達之前不能發送其他的小分組。 在默認的情況下,Nagle算法是默認開啟的&#xff0c;Nagle算法比較適用于發送方發送大批量的小數據&…

Sam Blackshear談Move語言的起源

Move編程語言作為Sui生態系統的關鍵組成部分&#xff0c;通過可編程交易區塊等機制支持其獨特的對象數據模型&#xff0c;并支持高效的代碼。五年前&#xff0c;Mysten Labs的聯合創始人兼首席技術官Sam Blackshear創建了Move。他專門設計了Move&#xff0c;用于編寫智能合約&a…

數據庫SQL查詢語句匯總詳解

SQL是一種強大的編程語句&#xff0c;可用于操作和提取數據庫中的數據。如果你對編程語句有所讓步&#xff0c;那么你可能對SQL的力量感到難以置信。本文將帶你深入探索SQL查詢的世界&#xff0c;讓你了解SQL語句的各種查詢方式&#xff0c;并以實例進行詳解。 1. SELECT基礎查…

Iterator底層源碼分析

/** * Iterator用于遍歷Collection下的集合&#xff0c;Collection下的每個集合底層實現不一樣&#xff0c;意味著遍歷邏輯也不一樣&#xff0c; * 所以Java的設計者將Iterator設計成了接口&#xff0c;讓Collection下的每個集合實現Iterator */ public interface Iterator<…

英偉達的GPU(1)

又好久沒更新了,一方面是最近事情有點多,另一方面最近也確實有點懶。 之前我說要把硬件部分補完,要寫Nvidia的GPU,我估計一篇寫不完,所以先寫點。 早先的硬件文章可以參考: 上一篇:解讀神秘的華為昇騰910 (qq.com) 上上一篇Microsoft Maia (qq.com) 上上上篇Google的…

sqli-labs靶場第十四關

目錄 1&#xff1a;分析 找閉合符&#xff1a; 2&#xff1a;開始注入 報錯注入&#xff1a; 注入數據庫名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具體值&#xff1a; 1&#xff1a;分析 經過我們的實驗發現當我們輸入的密碼后面存在雙引號時會報…

【C++】學習筆記——多態_1

文章目錄 十二、繼承8. 繼承和組合 十三、多態1. 多態的概念2. 多態的定義和實現虛函數重寫的兩個特殊情況override 和 ?nal 3. 多態的原理1. 虛函數表 未完待續 十二、繼承 8. 繼承和組合 我們已經知道了什么是繼承&#xff0c;那組合又是什么&#xff1f;下面這種情況就是…

英語學習筆記13——A new dress

A new dress 一件新連衣裙 詞匯 Vocabulary colour / color n. 顏色 v. 上色&#xff0c;涂色  英  美 顏色短語&#xff1a;green hand 新手      black tea 紅茶      white house 白宮      black sheep 害群之馬 英文顏色類詞匯&#xff1a; red 紅色…

鴻蒙開發接口Ability框架:【ApplicationContext】

ApplicationContext ApplicationContext模塊提供開發者應用級別的的上下文的能力&#xff0c;包括提供注冊及取消注冊應用內組件生命周期的監聽接口。 說明&#xff1a; 開發前請熟悉鴻蒙開發指導文檔&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.m…

靜態IP代理:網絡世界的隱秘通道

在數字化時代&#xff0c;網絡安全和隱私保護日益受到重視。靜態IP代理作為一種網絡服務&#xff0c;為用戶提供了一個穩定且可預測的網絡連接方式&#xff0c;同時保護了用戶的在線身份。本文將從五個方面深入探討靜態IP代理的概念、優勢、應用場景、技術實現以及選擇時的考量…

C語言學習【printf函數和scanf函數】

C語言學習【printf函數和scanf函數】 printf()函數和scanf()函數可以讓用戶與程序交流&#xff0c;是輸入/輸出函數 printf()函數 請求printf()函數打印數據的指令要與待打印數據的類型相匹配。例如&#xff0c;打印整數時使用%d&#xff0c;打印字符時使用%c。這些符號被稱…

實戰項目技術點(1)

1、什么是REST&#xff1f; REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表述性狀態轉換&#xff0c;它是一種軟件架構風格。傳統URL風格如下&#xff1a; http://localhost:8080/user/getById?id1 GET&#xff1a;查詢id為1的用戶 http://loc…

網絡常識一:常用工具

作為后端開發&#xff0c;特別是網絡游戲后端開發&#xff0c;經常需要處理各種現網問題&#xff0c;其中有不少是網絡相關的。 下面列舉的工具主要是在 linux 下的&#xff0c;診斷線上服務器問題的時候&#xff0c;往往是分秒必爭&#xff0c;所以這些工具都要用得很熟練&am…

程序在銀河麒麟系統下實現開機自啟及創建桌面快捷方式

目錄 1. 機器環境說明 2. 程序開機自啟動設置 2.桌面快捷方式設置 3. 附加說明 1. 機器環境說明 機器安裝的銀河麒麟操作系統屬性如下&#xff1a; 2. 程序開機自啟動設置 第1步&#xff1a;編寫一個腳本,用于自動化啟動&#xff0c;為便于后文描述&#xff0c;該腳本名稱…

干貨教程【軟件篇】| 免費實現游戲加速自由

需要這個游戲加速軟件的小伙伴可以關注一下文章底部公眾號&#xff0c;回復關鍵詞【zdjs】即可獲取。 該軟件可以實現免費的游戲加速&#xff0c;實測延遲低體驗好&#xff01; 建議看到后趕緊保存下來防止丟失&#xff01; 下面講一下該軟件安裝流程~ 通過鏈接可以得到下面…

2.go語言初始(二)

本篇博客涉及到go 的基礎數據類型、 go 語言中的運算符、轉義字符、格式化輸出、字符串操作 go 語言中的運算符 在 go 語言中&#xff0c;基本數據類型主要包括以下幾類&#xff1a;整數類型、浮點數類型、復數類型、布爾類型、字符串類型、字節類型&#xff08;byte&#xf…

Linux進程控制——Linux進程程序替換

前言&#xff1a;Linux進程控制包含了進程終止&#xff0c;進程等待&#xff0c;進程程序替換。走到現在我們也只剩下進程程序替換沒介紹了&#xff0c;那么讓我們來看看進程程序替換到底是什么&#xff01; 本篇主要內容&#xff1a; 替換原理 替換函數 實現簡易shell 我們所創…

【sql】sql中with as 介紹與使用jsqlparser解析sql

文章目錄 一. 定義二. 用法三. 解析 一. 定義 with A as (select * from class) 也就是將重復用到的大批量 的SQL語句&#xff0c;放到with as 中&#xff0c;加一個別名&#xff0c;在后面用到的時候就可以直接用。對于大批量的SQL數據&#xff0c;起到優化的作用。 with子句…