C++中String的語法及常用接口用法

在C語言中,string是一個標準庫類(class),用于處理字符串,它提供了一種更高級、更便捷的字符串操作方式,string?類提供了一系列成員函數和重載運算符,以便于對字符串進行操作和處理。

一、string類

在學習 string 前,我們不妨先來了解一下 string 類到底是什么,有什么用呢?我們先來了解一下基本的概念吧

C++標準庫都是英語解釋。我們也應該試著去適應,不懂的可以查閱。當然,在這里我就直接給出翻譯,主要是以下內容:

字符串是表示字符序列的類;

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

  • string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信息,請參閱basic_string)。

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

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

二、string的常用見用法

2.1 string對象的構造

2.1.1?string對象的構造的使用方法

最為常用的無非就是我們用串string來構造一個對象,也就是存儲一個字符,常用的方法有如下幾點:

  • string()——構造空的?string?類對象,即空字符串;

  • string(const char* s)——用 char*?來構造?string?類對象;

  • string(size_t n, char c)——string類對象中包含n個字符c

  • string(const string&s)——拷貝構造函數

下面是使用方法所對應的實例,幫助更好的理解其用法。

三、string常用結構的底層實現

3.1 初建結構

我們通過上述的構造,不難發現也不難理解string的底層其實就是一個字符指針,該指針指向一個數組。當然,我們還需要兩個變量來維護其有效長度(_size)數組容量(_capacity)

其次,我們自己實現的string類為了區分std命名空間,我們可自己設置一個命名空間。處型的模擬實現如下:

namespace gtm
{class string{public://string()//	:_str(new char[1])//	, _size(0)//	,_capacity(0)//{//}//string(const char* str)//	:_str(new char[strlen(str) + 1])  //三次strlen函數,效率低。//	,_size(strlen(str))//	,_capacity(strlen(str))//{//	strcpy(_str, str);//}// 不再使用strlen函數,初始化列表與變量聲明順序固定string(const char* str = "") //默認空串。注意:空串是以 \0 結尾{_size = strlen(str);_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);}~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}private:char* _str;size_t _size;size_t _capacity;};

3.2 返回大小和容量

這兩個部分,是比較容易實現的兩部分。同時也是較為常用的兩部分。具體如下:

size_t size() const{return _size;}size_t capacity() const{return _capacity;}

3.3 拷貝構造和賦值重載

這兩部分較為復雜的兩部分。其中均需要深拷貝去實現完成,而淺拷貝是不可以的。注意:拷貝構造使用一個已定義變量去初始化另一個變量,賦值重載是兩個已定義變量進行賦值

具體實現如下:

//深拷貝//string(const string& s)//	:_str(new char[s._capacity+1])//	,_size(s._size)//	,_capacity(s._capacity)//{//	strcpy(_str, s._str);//}void swap(string& tmp){//調用全局的swap::swap(_str, tmp._str);::swap(_size, tmp._size);::swap(_capacity, tmp._capacity);}//借助變量tmpstring(const string& s):_str(nullptr) , _size(0), _capacity(0){string tmp(s._str);swap(tmp);}//賦值//string& operator=(const string& s)//{//	if(this == &s)//	{//		return *this;//	}//	//先開空間拷貝數據,以防new失敗銷毀原來的空間//	char* tmp = new char[s._capacity + 1];//	strcpy(tmp, s._str);//	delete[] _str;//	_str = tmp;//	_size = s._size;//	_capacity = s._capacity;//	return *this;//	//delete[] _str;//	//_str = new char[s._capacity + 1];//	//strcpy(_str, s._str);//	//_size = s._size;//	//_capacity = s._capacity;//	return *this;//}//string& operator=(const string& s)//{//	if(this == &s)//	{//		return *this;//	}//	string tmp(s._str);//	swap(tmp);//  return *this;//}string& operator=(string s){if (this == &s){return *this;}swap(s);return *this;}

上述的輔助重載我們巧妙地借助了臨時變量s。當賦值完成后,出了作用域s會自動調用戲后進行銷毀,這里是需要反復理解的。

3.4 擴容(reserve)

我們可簡單的理解reserve為擴容(擴容的前提為要求的容量比原來的大),但是我們要記得把字符數組中原有的內容拷貝過來,并且釋放之前所動態開辟的空間。?具體實現如下:

void reserve(size_t capacity){if (capacity > _capacity){char* tmp = new char[capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = capacity;}}

3.5 插入(push_back、append、operator+=、insert)

插入的實現,主要的點就是是否要進行擴容。其次,當我們實現push_back和append后,其他的均可復用這兩個結構進行實現。具體實現如下:

        void push_back(char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;_size++;_str[_size] = '\0';}void append(const char* str){size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size >= _capacity * 2 ? len + _size : _capacity * 2);}strcpy(_str + _size, str);_size += len;}void append(const string& s){append(s._str);}void append(int n, char ch){reserve(_size + n);for (int i = 0; i < n; i++){push_back(ch);}}string& operator+= (char ch){push_back(ch);return *this;}string& operator+= (const char* str){append(str);return *this;}string& insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}//注意,當運算數一個是有符號,另一個是無符號時,有符號的運算數會強制類型轉換為無符號數。pos等于0的位置插入,end--后為超大數據,會出錯。//int end = _size;//while (end >= (int)pos)//{//	_str[end + 1] = _str[end];//	end--;//}size_t end = _size+1;while (end > pos){_str[end] = _str[end - 1];end--;}_str[pos] = ch;_size++;return *this;}string& insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size >= _capacity * 2 ? len + _size : _capacity * 2);}size_t end = _size + len;while (end >= pos+len){_str[end] = _str[end - len];end--;}for (int i = pos,j=0; j < len;j++, i++){_str[i] = str[j];}_size += len;return *this;}

string 在C++中算是比較重要的了,也是入門時必須所學的容器。在平常中使用的頻率較高,所以我們不僅要掌握其簡單的用法,更應該去了解其底層的實現。這有助于我們后續的使用和理解。本篇文章列舉出了string中常用的語法和接口底層的底層實現,這些都是我們應該熟練掌握的內容。

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

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

相關文章

scala TraversableOnce

scala TraversableOnce 1. 由來 TraversableOnce是Scala中的一個特質&#xff08;trait&#xff09;&#xff0c;它定義了一組操作&#xff0c;用于遍歷和處理集合類型的元素。它是Scala集合層次結構中的基本概念之一。 2. 示例 以下是使用TraversableOnce的簡單示例&#…

Redis高可用:主從復制詳解

目錄 1.什么是主從復制&#xff1f; 2.優勢 3.主從復制的原理 4.全量復制和增量復制 4.1 全量復制 4.2 增量復制 5.相關問題總結 5.1 當主服務器不進行持久化時復制的安全性 5.2 為什么主從全量復制使用RDB而不使用AOF&#xff1f; 5.3 為什么還有無磁盤復制模式&#xff…

C# 一種求平方根的方法 立方根也可以 極大 極小都可以

不知道研究這些干啥&#xff0c;純純的浪費時間。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…

怎么做Tik Tok海外娛樂公會呢?新加坡市場怎么樣?

一、為什么選擇TikTok直播 1. 海外市場潛力巨大 ? 自2016年始&#xff0c;多家直播平臺陸續拓展至東南亞、中東、俄羅斯、日韓、歐美、拉美等地區。 ? 海外市場作為直播發展新藍海&#xff0c;2021年直播行業整申請cmxyci體規模達百億美元&#xff0c;并維持高速增長。 &a…

C++初階語法——內部類

前言&#xff1a;內部類&#xff0c;顧名思義是定義在類中的類&#xff0c;許多人會以為它屬于外部的類&#xff0c;實際上并不是&#xff0c;它們是兩個獨立的類&#xff0c;但是內部類受外部類類域的限制。 目錄 一.概念二.特性1.內部類和外部類相互獨立2.內部類是外部類的友…

10,遍歷任意參

遍歷可變參數 遍歷可變參數獲取可變參數大小通過遞歸方式遍歷可變參數通過可變參數特性來求和 遍歷可變參數 #pragma oncetemplate<class ... ParamTypes> void Func(paramTypes &... param) {}可以看作是有一個結構體里面裝滿了參數&#xff0c;把結構體放到…中。…

Git多版本并行開發實踐

本文目的&#xff1a; 實現多個項目同時進行的git多版本管理工作流。 名詞解釋&#xff1a; feature-XXXX&#xff1a;特性分支指CCS中一個項目或者一個迭代&#xff0c;在該分支上開發&#xff0c;完成后&#xff0c;合并&#xff0c;最后&#xff0c;刪除該分支&#xff0c;…

【廣州虛擬現實開發】VR智能中控系統進一步提高VR教學管理水平

隨著科技的不斷發展&#xff0c;虛擬現實(VR)技術已經逐漸走進了人們的生活。在教育領域&#xff0c;VR技術也得到了廣泛的應用&#xff0c;尤其是在教學終端中控系統方面。那么&#xff0c;廣州華銳互動開發的VR智能中控系統對學校有何益處呢&#xff1f; 首先&#xff0c;VR智…

RocketMQ(模式詳解,安裝)及控制臺安裝

下載 環境 64位操作系統&#xff0c;推薦 Linux/Unix/macOS 64位 JDK 1.8下載地址 https://rocketmq.apache.org/zh/download/ RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。 二進制包是已經編譯完成后可以直接運行的&#xff0c;源碼包是需要編譯后運行的。 單…

LVS負載均衡DR(直接路由)模式

在LVS&#xff08;Linux Virtual Server&#xff09;負載均衡中的DR&#xff08;Direct Routing&#xff09;模式下&#xff0c;數據包的流向如下&#xff1a; 客戶端發送請求到負載均衡器&#xff08;LVS&#xff09;的虛擬IP&#xff08;VIP&#xff09;。負載均衡器&#x…

基于C++ 的OpenCV繪制多邊形,多邊形多條邊用不用的顏色繪制

使用基于C的OpenCV庫來繪制多邊形&#xff0c;并且為多邊形的不同邊使用不同的顏色&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;確保你已經安裝了OpenCV庫并配置好了你的開發環境。 導入必要的頭文件&#xff1a; #include <opencv2/opencv.hpp&g…

Bryntum Scheduler Pro 5.5.1 Crack

BRYNTUM 調度程序專業版,專業的日程安排小部件 Bryntum Scheduler Pro 5.5.1 一個專業有大腦的調度UI組件。Scheduler Pro 可幫助您安排任務&#xff0c;同時考慮資源和任務的可用性。 連接您的任務 讓 Scheduler Pro 處理剩下的事情。它將根據您定義的鏈接安排您的任務并遵守任…

BNC連接器市場分析:全球BNC連接器市場規模不斷增長

產品定義及統計范圍 BNC&#xff08;Bayonet-Neill-Concelman&#xff09;連接器是一種通常用于視頻和音頻信號傳輸的電連接器。它是以其兩位發明者Paul Neill和Carl Concelman的名字命名的&#xff0c;他們在20世紀40年代末開發了這種連接器。BNC連接器是一種設計用于同軸電纜…

ansible 修改遠程主機nginx配置文件

安裝ansible brew install ansible 或者 pip3 install ansible 添加遠程主機 設置秘鑰 mac登錄遠程主機 ssh -p 5700 root192.168.123.211 ssh localhost #設置雙機信任 ssh-kyegen -t rsa #設置主機兩邊的ssh配置文件 vi /etc/ssh/sshd_config/ PermitRootL…

UniApp 制作高德地圖插件

1、下載Uni插件項目 在Uni官網下載Uni插件項目&#xff0c;并參考官網插件項目創建插件項目. 開發者須知 | uni小程序SDK 如果下載下來項目運行不了可以參考下面鏈接進行處理 UniApp原生插件制作_wangdaoyin2010的博客-CSDN博客 2、引入高德SDK 2.1 在高德官網下載對應SD…

207. 課程表

思路 首先要完全理解題意&#xff0c;這道題的[a,b]并不是b滿足了a就可以真正的學習a這門課了&#xff0c;因為a還有可能需要其他選修課的條件。類似下圖。 ??這題的思路在于使用合適的數據結構來存儲&#xff0c;這里用hash表來存儲如果1這門課可以修了之后&#xff0c;可以…

docker pull 設置代理 centos

On CentOS the configuration file for Docker is at: /etc/sysconfig/docker 用 root 權限打開 text editor sudo gedit 注意 加引號 Adding the below line helped me to get the Docker daemon working behind a proxy server: HTTP_PROXY“http://<proxy_host>:&…

linux下shell編寫軟件看門狗

遇到一個問題&#xff0c;就是軟件崩潰&#xff0c;可以讓軟件自動重啟&#xff0c;而且數據庫必須是軟件崩潰之前的 #!/bin/sh while true do /app/app/record -qws cp -pr /msata/db/db_record.db /data/log/db_record.db mv /msata/db/db_record1.db /msata/db/db_record.d…

ubuntu20.04磁盤滿了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

問題 執行 mysql 大文件導入任務&#xff0c;最后快完成了&#xff0c;查看結果發現錯了&#xff01;悲催&#xff01;都執行了 兩天了 The table ‘XXXXXX’ is full &#xff1f; 磁盤滿了&#xff1f; 剛好之前另一個 centos 服務器上也出現過磁盤滿了&#xff0c;因此&a…

神經網絡基礎-神經網絡補充概念-30-搭建神經網絡塊

概念 搭建神經網絡塊是一種常見的做法&#xff0c;它可以幫助你更好地組織和復用網絡結構。神經網絡塊可以是一些相對獨立的模塊&#xff0c;例如卷積塊、全連接塊等&#xff0c;用于構建更復雜的網絡架構。 代碼實現 import numpy as np import tensorflow as tf from tens…