【C++】string類的使用①(默認成員函數 || 迭代器接口begin,end,rbegin和rend)

在這里插入圖片描述

🔥個人主頁: Forcible Bug Maker
🔥專欄: STL || C++

目錄

  • 前言
  • 🌈關于string類
  • 🌈string類的成員函數
    • 🔥默認成員函數
      • ==string類對象的構造(constructor)==
      • ==string類對象的析構==
      • ==string類對象的賦值運算符重載==
    • 🔥迭代器接口(iterators)
      • ==begin==
      • ==end==
      • ==rbegin==
      • ==rend==
      • ==cbgin,cend,erbegin和crend==
  • 結語

前言

本篇博客主要內容:STL庫中string類的默認成員函數和各種迭代器接口的介紹和使用

在開始我們string類使用接口的講解之前,想先講講為什么我們要學習string類。在C語言中,字符串是以’\0’結尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函數,但是這些庫函數與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。

簡單說,string就是C++STL標準庫中便于維護和操作字符串的一個類

學習STL過程中,我們主要參考這個網站中的文檔:https://cplusplus.com,雖然里面的內容是全英的,但是不用擔心,我會帶著大家一一去翻譯并講解其中的接口。

🌈關于string類

在這里插入圖片描述
字符串是表示字符序列的類。

標準的字符串提供了此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節字符字符串的設計特性。

string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits和allocator作為basic_string的默認參數(關于模板更多的信息,請參考basic_string)。

請注意,這個類獨立于所使用的編碼來處理字節:如果用來處理多字節或變長字符(如UTF-8)的序列,這個類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(而不是實際編碼的字符)來操作。

對以上文字做一個總結:

  1. string是表示字符串的類
  2. 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。
  3. string類再底層實際是:basic_string模板類的別名,typedef basic_string<char,char_traits,alloctor> string;
  4. 不能操作多字節或變長字節的序列。

在使用string類時,必須包含相應頭文件#include<string>以及using namespace std;

🌈string類的成員函數

C++STL庫的string類中重載的成員函數非常之多,但并不是每個接口都有著其必要性。string類是C++中最先被開發和實驗的類,由于向前兼容等各種原因,其實其中也不免存在一些函數的冗余,在上百個重載的接口中,真正常用的也就是那十幾二十個。對于一些相同道理的重載,我會做簡單解釋而不會展開講,避免文章內容的冗余。

🔥默認成員函數

在這里插入圖片描述

string類對象的構造(constructor)

在這里插入圖片描述
string類提供了七種方式的重載用于構造string類對象。
(1)無參構造(默認構造)
string();
構造出一個空的string,里面存儲0個字符元素。
(2)拷貝構造
string(const string& str);
構造出一個和str對象內容相同的拷貝對象。
(3)字串構造
string (const string& str, size_t pos, size_t len = npos);
拷貝str從pos位置開始跨越len個長度的元素到新創建的對象中(如果字符串太短未提供第三個參數,直接從pos位置拷貝到字符串的末尾)。
(4)通過字符串構造
string (const char* s);
通過s指向的以 空字符(‘\0’) 結尾的字符串創建新的string類型的對象。
(5)通過部分字符串構造
string (const char* s, size_t n);
從s指向的字符串中拷貝前n個字符創建新的string類型的對象。
(6)字符填充構造
string (size_t n, char c);
用連續的n個c構成的串創建string類型的對象。
(7)迭代器區間構造
template <class InputIterator>
string (InputIterator first, InputIterator last);
通過迭代器區間 [first,last) 之間的元素,創建順序相同的新string對象。

你現在可能不知道迭代器是什么,不過你可以先將它理解成是一種指針,指向string中的元素,可以通過++或–來改變這種指針的指向。

使用樣例:

// string類的構造
#include <iostream>
#include <string>
// 由于下面使用了std::,所以此處不用命名空間展開
int main()
{std::string s0("Initial string");// constructors used in the same order as described above:std::string s1;std::string s2(s0);std::string s3(s0, 8, 3);std::string s4("A character sequence");std::string s5("Another character sequence", 12);std::string s6a(10, 'x');std::string s6b(10, 42);      // 42是字符'*'的ASCII碼值std::string s7(s0.begin(), s0.begin() + 7);// 打印構造出來的字符串內容,這里重載了流插入>>和流提取<<運算符。std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';return 0;
}

在這里插入圖片描述

string類對象的析構

在這里插入圖片描述
如你所見,析構只有一種,之前在類和對象篇已經講過了,析構函數是不能重載的。
析構函數編譯器會自動調用,釋放資源,所以就不需要你操心了。

string類對象的賦值運算符重載

在這里插入圖片描述
string類提供了三種賦值運算符重載,用于給已經創建好的對象賦值。
(1)string對象賦值
string& operator=(const string& str);
將str的內容拷貝到被賦值的對象中。
返回值:被賦值對象(*this)的引用。
(2)字符串賦值
string& operator=(const char* s);
通過一個已有的字符串給string賦值,其實不重載此函數也可以達到效果(隱式類型轉換),但是考慮到隱式類型轉換是有效率損耗的,故標準庫中還是重載了此成員函數。
返回值:被賦值對象(*this)的引用。
(3)字符賦值
string& operator=(char c);
將字符直接賦值給串。
返回值:被賦值對象(*this)的引用。

使用樣例:

#include <iostream>
#include <string>
using namespace std;
int main()
{std::string str1, str2, str3;str1 = "Test string. ";   // c-stringstr2 = str1; //stringstr3 = 'x'; //charcout << str1 << endl;cout << str2 << endl;cout << str3 << endl;return 0;
}

在這里插入圖片描述

🔥迭代器接口(iterators)

在這里插入圖片描述
什么是迭代器接口,就是成員函數返回迭代器的接口,也就是獲取迭代器的方法。
我們可以先將迭代器想象成指向容器元素的指針,而這些成員函數的作用就是讓我們獲取這些指針。同時我們可以通過+,-,++或–等運算符調整這種指針的指向。

begin

在這里插入圖片描述
iterator begin();
const_iterator begin() const;
這兩個成員函數都返回一個指向string串中第一個元素的正向迭代器。

end

在這里插入圖片描述
iterator end();
const_iterator end() const;
這兩個成員函數都返回一個指向string串中最后一個元素下一位的正向迭代器。

使用樣例:

// string::begin/end
#include <iostream>
#include <string>
using namespace std;
int main()
{std::string str("Test string");string::iterator it = str.begin();for (; it != str.end(); ++it)cout << *it;cout << endl;return 0;
}

在這里插入圖片描述
在這里插入圖片描述
string的迭代器(iterator)是一個定義在string類內部的一個類型,它能指向string對象的元素,而迭代器的對象可以通過string提供的成員函數獲取。上述代碼案例中的迭代器it被我們稱為正向迭代器,++使其向后移動指向下一元素,–使其向前移動指向上一元素
而接下來我們要講的rbegin和rend,是獲取反向迭代器的兩個接口函數。

rbegin

在這里插入圖片描述
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
這兩個成員函數都返回一個指向string串中最后一個元素的反向迭代器。

rend

在這里插入圖片描述
reverse_iterator rend();
const_reverse_iterator rend() const;

這兩個成員函數都返回一個指向string串中第一個元素上一位的反向迭代器。
使用樣例:

// string::rbegin/rend
#include <iostream>
#include <string>
using namespace std;
int main()
{string str("now step live...");string::reverse_iterator rit = str.rbegin();for (; rit != str.rend(); ++rit)cout << *rit;cout << endl;return 0;
}

在這里插入圖片描述
在這里插入圖片描述
同理,string的反向迭代器(reverse_iterator)是一個定義在string類內部的一個類型,它能指向string對象的元素,而反向迭代器的對象可以通過string提供的成員函數獲取。反向迭代器,++使其向前移動指向上一元素,–使其后前移動指向下一元素

cbgin,cend,erbegin和crend

這幾個作為C++11新增語法,專門提供了獲取const類型的四種迭代器接口,使迭代器可以讀,但不能通過迭代器解引用更改串中的內容。這里就不多做贅述。

結語

本篇博客講了關于string類構造的七種重載,賦值運算符的三種重載,以及各種string迭代器接口的使用。后面博主會繼續分享關于string類的使用以及STL更多的內容,感謝大家的支持。?

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

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

相關文章

NPOI生成word浮動圖標

1、NPOI版本2.7.0, net框架4.8 2、安裝OpenXMLSDKToolV25.msi 3、先創建一個word文檔&#xff0c;并設置圖片為浮于文字之上 4、OpenXML顯示的結果 5、實際代碼如下&#xff1a; public class GenerateWordDemo {public GenerateWordDemo(){}//https://blog.fileformat.co…

js由那三部分組成

JavaScript 主要由三部分組成&#xff1a;ECMAScript、DOM&#xff08;文檔對象模型&#xff09;和 BOM&#xff08;瀏覽器對象模型&#xff09;。 1、ECMAScript ECMAScript 是 JavaScript 的核心&#xff0c;描述了語言的基本語法&#xff08;變量、函數、條件語句、循環、…

前端筆記-day03

文章目錄 01-初始CSS02-CSS引入方式03-標簽選擇器04-類選擇器05-id選擇器06-通配符選擇器07-畫盒子08-字體大小09-文字粗細10-字體傾斜11-行高12-行高垂直居中13-字體族14-font復合屬性15-文本縮進16-文本對齊方式17-圖片對齊方式18-文本修飾線19-文字顏色20-調試工具21-綜合案…

Dual Aggregation Transformer for Image Super-Resolution論文總結

題目&#xff1a;Dual Aggregation Transformer&#xff08;雙聚合Transformer&#xff09; for Image Super-Resolution&#xff08;圖像超分辨&#xff09; 論文&#xff08;ICCV&#xff09;&#xff1a;Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV…

IM 是什么?

在當今數字化的時代&#xff0c;即時通訊&#xff08;IM&#xff09;已經滲透到人們的日常生活和企業的工作環境中。IM技術的快速i發展為人們提供了一種高效、便捷的溝通方式&#xff0c;不僅推動了社會的信息化進程&#xff0c;也提升了企業的協同效率和競爭力。 作為企業級I…

【GD32】01-GPIO通用輸入輸出

GD32 閑話說在前頭 這里又開一個系列啦。 原因就是之前買了立創開發板的9.9的GD32E230C8T6的板子&#xff0c;買都買了就跟著立創開發板學習一下&#xff08;屬于是一次性支持了兩個國產品牌了&#xff0c;立創和兆易創新&#xff09;。并且我還買了GD32F407VET6的板子&…

資金流分析下的企業供貨關系強度模型

圖技術 利用neo4j、networkx、dgl、python做圖分析挖掘 【1】最短路徑算法dijkstra 【2】基于networkx的隱性集團關系識別模型 【3】基于Neo4j的擔保社群型態分析挖掘 【4】基于python求有向無環圖中target到其他節點全路徑 【5】有向圖中任意兩點的路徑 【6】圖基礎入門 【7】…

項目管理中控制質量的工具與技術

項目管理中控制質量的工具與技術 控制質量的工具與技術包括多種方法&#xff0c;旨在確保產品或服務達到既定的質量標準。關于具體的工具格式和樣式&#xff0c;以下是一些示例&#xff1a; 統計技術&#xff1a; 這是一種將質量控制要素的數據轉化為實際控制手段的技術。通…

Visual Studio和Visual Studio Code適用于哪些編程語言

Visual Studio和Visual Studio Code都適用于多種編程語言&#xff0c;它們的適用編程語言如下&#xff1a; Visual Studio適用于&#xff1a; C#Visual Basic .NETF#CJavaScriptTypeScriptPythonHTML/CSSJava&#xff08;通過插件支持&#xff09; Visual Studio Code適用于…

Jtti:哪些方法可以降低美國CN2服務器的延遲?

降低美國CN2服務器的延遲可以采取多種方法&#xff0c;以下是一些常用的方法&#xff1a; 1.選擇優質的網絡提供商和服務商&#xff1a;選擇具有高質量網絡和優質服務的網絡提供商和服務商是降低延遲的關鍵。確保您選擇的網絡提供商具有可靠的基礎設施和優質的網絡連接&#xf…

C++:關于圓形魚眼半全景圖轉為等距圓柱投影圖

C&#xff1a;空間坐標映射到球面坐標/全景圖_如何將球體坐標映射到球面uv-CSDN博客 C&#xff1a;關于360全景圖像和立方體6面全景圖像的相互轉換_彩色全景拆解正方體6個面-CSDN博客 之前記錄了立方體和360全景之間的轉換&#xff0c;這次記錄下魚眼圖與360全景圖之間的轉換…

C++ STL的鎖介紹

在 C Standard Template Library (STL) 中&#xff0c;有幾個鎖的實現&#xff0c;這些都位于 <mutex> 頭文件。以下是一些常見的鎖及其功能&#xff1a; std::mutex&#xff1a;最基本的互斥鎖&#xff0c;不可遞歸使用。該鎖提供了獨占的非公平鎖定能力。 std::mutex…

處理瀏覽器緩存問題

處理瀏覽器緩存問題 main.js router.onError((error) > {hasRefreshed false;console.log("異常" error.message);let ind0 error.message.indexOf(Loading chunk chunk-)let ind2 error.message.indexOf(failed.)if(ind0 ! -1 && ind2 !-1){console.…

spring-boot-starter-validation校驗框架

介紹 Spring Boot Starter Validation是一個Spring Boot模塊&#xff0c;用于簡化應用程序中的驗證功能。它包含以下依賴&#xff1a; Hibernate Validator&#xff1a;Hibernate Validator是JavaBean Validation&#xff08;JSR 380&#xff09;規范的參考實現&#xff0c;提…

信創應用軟件之辦公流版簽

信創應用軟件之辦公流版簽 文章目錄 信創應用軟件之辦公流版簽概述流式文件版式文件電子簽章廠商金山辦公永中-永中Office中標-中標普華Office福昕科技e簽寶法大大 概述 辦公流版簽軟件主要包括辦公中常用到的流式軟件、版式軟件以及電子簽章。 版式文件和流式文件都是文書類…

軟件體系結構總結

文章目錄 一、軟件體系結構概述1.1 基本概念1.1.1 背景1.1.2 定義1.1.3 系統1.1.3.1 定義1.1.3.2 特性1.1.3.3 系統的體系結構 1.1.4 軟件設計的層次性1.1.5 體系結構的類別&#xff08;類型&#xff09;1.1.6 重要性&#xff08;意義&#xff09; 1.2 模塊及其設計1.2.1 定義1…

HTTP超時時間設置

在進行超時時間設置之前我們需要了解一次http請求經歷的過程 瀏覽器進行DNS域名解析&#xff0c;得到對應的IP地址根據這個IP&#xff0c;找到對應的服務器建立連接&#xff08;三次握手&#xff09;建立TCP連接后發起HTTP請求&#xff08;一個完整的http請求報文&#xff09;服…

[單機]完美國際_V155_GM工具_VM虛擬機

[端游] 完美國際單機版V155一鍵端PC電腦網絡游戲完美世界幻海凌云家園 本教程僅限學習使用&#xff0c;禁止商用&#xff0c;一切后果與本人無關&#xff0c;此聲明具有法律效應&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人親自搭建成功的&#xff0c;絕對是…

出海企業哪種組網方案更省事?

對于出海企業而言&#xff0c;建立跨地區的數據傳輸和協同工作至關重要&#xff0c;以提升運營效率。因此&#xff0c;網絡構建變得迫在眉睫。通過構建企業組網&#xff0c;企業能夠加強與海外分支、客戶和合作伙伴之間的聯系&#xff0c;加速海外業務的發展。 然而&#xff0c…

Stable Diffusion教程|圖生圖原理和實戰

Stable Diffusion憑借其卓越的圖生圖功能&#xff0c;極大地提升了圖像生成的可控性與輸出品質&#xff0c;賦予用戶前所未有的個性化創作風格表達能力。這一革新特性使得Stable Diffusion不僅能精準地捕捉用戶的藝術愿景&#xff0c;更能以數字化手段孕育出新穎且極具創意的畫…