MyString:string類的模擬實現 1

MyString:string類的模擬實現

前言:

為了區分標準庫中的string,避免編譯沖突,使用命名空間 MyString。

namespace MyString
{class string{private:char* _str;size_t _size;size_t _capacity;const static size_t npos = -1;// C++標準庫支持的特殊用法};

在這里插入圖片描述

以下都在 MyString 內實現!

一、構造函數,析構函數,拷貝構造

1.1 構造函數

標準庫中,構造string類的常見寫法:

string s1; // 1
string s2("hello world"); // 2
public:string():_str(new char[1])// 給一個字節的空間作為標識,_size(0),_capacity(0){_str[_size] = '\0';}string(const char* str){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];// 多給一個空間,存'\0'strcpy(_str, str);}

實際上,對第二個構造函數的參數進行缺省,可以實現兩種寫法的完美統一。

    string(const char* str = "") // 字符串末尾有隱藏的'\0',不需要我們在缺省值加上'\0'{_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}
1.2 析構函數
public:~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}
1.3 拷貝構造(重點)

string類的拷貝構造需要實現深拷貝否則會造成資源的二次釋放

public:string(const string& s){_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}

二、迭代器

public:typedef char* iterator;typedf const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}

范圍for 本質是對迭代器的“傻瓜式”替換,一旦對 begin() end() 的函數名做修改,則無法調用,如:begin() ——> Begin() 。

三、reserve() 與 尾插(重點)

3.1 reserve()

【1】 reserve() 是對 _capacity 進行操作 (不對 _str 操作),而 _capacity 只計算有效字符個數不包括字符串末尾的 ‘\0’

【2】 在設計 reserve() 時,要考慮多開一個空間,用于存 ‘\0’ ;要對 _capacity 校正

【3】 在使用 reserve() 進行擴容時,只需要考慮 有效字符個數 即可。

public:void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];// strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}
  • n > _capacity 時,才需要調整
  • char* tmp = new char[n + 1] 多開一個空間,用于存 ‘\0’ 。
3.2 尾插一個字符:push_back()
public:void push_back(const char ch){if (_size == _capacity){size_t newCapacity = _capacity == 0 ? 4 : 2 * _capacity;reserve(newCapacity);// _capacity = newCapacity;// reserve中 已經對 _capacity 做過調整了}_str[_size] = ch;++_size;_str[_size] = '\0';}
  • 插入字符后,應在字符串末尾加上 ‘\0’否則通過 _str 訪問字符串元素時會出現異常
3.3 尾插字符串:append()
public:void append(const char* str){int len = strlen(str);if (_size + len > _capacity){reserve(_size + len);// reserve(_size + len + 1); // reserve中 已考慮在字符串末尾加上'\0'}strcpy(_str + _size, str);// str 末尾有隱藏的 '\0'_size += len;}
  • str 末尾有隱藏的 ‘\0’
3.4 += 重載
  • s1 += “x”;
public:string& operator+=(const char ch){push_back(ch);return *this;}
  • s1 += “xxxx”;
public:string& operator+=(const char* str){append(str);return *this;}

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

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

相關文章

2023年 - 我的程序員之旅和成長故事

2023年 - 我的程序員之旅和成長故事 🔥 1.前言 大家好,我是Leo哥🫣🫣🫣,今天咱們不聊技術,聊聊我自己,聊聊我從2023年年初到現在的一些經歷和故事,我也很愿意我的故事分…

TS學習——快速入門

TypeScript簡介 TypeScript是JavaScript的超集。它對JS進行了擴展,向JS中引入了類型的概念,并添加了許多新的特性。TS代碼需要通過編譯器編譯為JS,然后再交由JS解析器執行。TS完全兼容JS,換言之,任何的JS代碼都可以直…

Android 樣式小結

關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 ,擅長java后端、移動開發、商業變現、人工智能等,希望大家多多支持。 目錄 一、導讀二、概覽三、使用3.1 創建并應用樣式3.2 創建并…

DJI ONBOARD SDK—— 基礎控制功能 Joystick的講解,使用和擴展

DJI ONBOARD SDK/DJI OSDK ROS—— 基礎控制功能 Joystick的使用 概述 使用OSDK/OSDK_ROS 的無人機飛行控制功能,能夠設置并獲取無人機各項基礎參數,控制無人機執行基礎飛行動作,通過Joystick 功能控制無人機執行復雜的飛行動作。 Joystic…

【精彩回顧】恒拓高科亮相第十一屆深圳軍博會

2023年12月6日-8日,由中國和平利用軍工技術協會、全國工商聯科技裝備業商會、深圳市國防科技工業協會等單位主辦以及政府相關部門支持,深圳企發展覽有限公司承的“2023第11屆中國(深圳)軍民兩用科技裝備博覽會(深圳軍博…

02 CSS基礎入門

文章目錄 一、CSS介紹1. 簡介2. 相關網站3. HTML引入方式 二、選擇器1. 標簽選擇器2. 類選擇器3. ID選擇器4. 群組選擇器 四、樣式1. 字體樣式2. 文本樣式3. 邊框樣式4. 表格樣式 五、模型和布局1. 盒子模型2. 網頁布局 一、CSS介紹 1. 簡介 CSS主要用于控制網頁的外觀&#…

C#如何使用SqlSugar操作MySQL/SQL Server數據庫

一. SqlSugar 連接MySQL數據庫 public class MySqlCNHelper : Singleton<MySqlCNHelper>{public static SqlSugarClient CnDB;public void InitDB() {//--------------------MySQL--------------------CnDB new SqlSugarClient(new ConnectionConfig(){ConnectionString…

窮舉問題-搬磚(for循環)

某工地需要搬運磚塊&#xff0c;已知男人一人搬3塊&#xff0c;女人一人搬2塊&#xff0c;小孩兩人搬1塊。如果想用n人正好搬n塊磚&#xff0c;問有多少種搬法&#xff1f; 輸入格式: 輸入在一行中給出一個正整數n。 輸出格式: 輸出在每一行顯示一種方案&#xff0c;按照&q…

玩轉大數據12:大數據安全與隱私保護策略

1. 引言 大數據的快速發展&#xff0c;為各行各業帶來了巨大的變革&#xff0c;也帶來了新的安全和隱私挑戰。大數據系統通常處理大量敏感數據&#xff0c;包括個人身份信息、財務信息、健康信息等。如果這些數據被泄露或濫用&#xff0c;可能會對個人、企業和社會造成嚴重的損…

Unity 資源管理之Resources

Resources是一個特殊的文件夾&#xff0c;用于存放運行時加載的資源。 Resources文件夾中可以放置各種類型的資源文件&#xff0c;如紋理、模型、音頻、預制體等&#xff0c;一般用來存儲預制體和紋理信息。 通過API可以加載和訪問該文件夾及其子文件夾中的資源。 當我們打包…

大數據Doris(三十五):Unique模型(唯一主鍵)介紹

文章目錄 Unique模型(唯一主鍵)介紹 一、創建doris表 二、插入數據

【華為OD題庫-076】執行時長/GPU算力-Java

題目 為了充分發揮GPU算力&#xff0c;需要盡可能多的將任務交給GPU執行&#xff0c;現在有一個任務數組&#xff0c;數組元素表示在這1秒內新增的任務個數且每秒都有新增任務。 假設GPU最多一次執行n個任務&#xff0c;一次執行耗時1秒&#xff0c;在保證GPU不空閑情況下&…

海外獨立站站長常用的ChatGPT通用提示詞模板

目標市場&#xff1a;如何確定目標市場&#xff1f; 用戶需求&#xff1a;如何了解用戶需求&#xff1f; 網站設計&#xff1a;如何設計一個優秀的網站&#xff1f; 用戶體驗&#xff1a;如何提升用戶體驗&#xff1f; 功能規劃&#xff1a;請幫助我規劃網站的功能。 內容…

linux 應用開發筆記---【標準I/O庫/文件屬性及目錄】

一&#xff0c;什么是標準I/O庫 標準c庫當中用于文件I/O操作相關的一套庫函數&#xff0c;實用標準I/O需要包含頭文件 二&#xff0c;文件I/O和標準I/O之間的區別 1.標準I/O是庫函數&#xff0c;而文件I/O是系統調用 2.標準I/O是對文件I/O的封裝 3.標準I/O相對于文件I/O具有更…

SpringBoot 項目 Jar 包加密,防止反編譯

1場景 最近項目要求部署到其他公司的服務器上&#xff0c;但是又不想將源碼泄露出去。要求對正式環境的啟動包進行安全性處理&#xff0c;防止客戶直接通過反編譯工具將代碼反編譯出來。 2方案 第一種方案使用代碼混淆 采用proguard-maven-plugin插件 在單模塊中此方案還算簡…

調用別人提供的接口無法通過try catch捕獲異常(C#),見鬼了

前幾天做CA簽名這個需求時發現一個很詭異的事情&#xff0c;CA簽名調用的接口是由另外一個開發部門的同事(比較難溝通的那種人)封裝并提供到我們這邊的。我們這邊只需要把數據準備好&#xff0c;然后調他封裝的接口即可完成簽名操作。但在測試過程中&#xff0c;發現他提供的接…

[后端卷前端2]

綁定class 為什么需要樣式綁定呢? 因為有些樣式我們希望能夠動態展示 看下面的例子: <template><div><p :class"{active:modifyFlag}">class樣式綁定</p></div> </template><script>export default {name: "goo…

人力資源服務展示網站作用有哪些

就業勞務問題往往是不少人群關注的問題&#xff0c;每個城市都聚集著大量求業者&#xff0c;而人力資源管理公司每年也會新增不少&#xff0c;對求業者來說&#xff0c;通過人力資源公司可以快速便捷的找到所需工作&#xff0c;而對公司來說&#xff0c;市場大量用戶可以帶來收…

C語言第十八集(動態內存管理)

1.malloc函數可以開辟一塊空間,具體搜: 2.malloc函數申請的空間在內存的堆區 而且它只負責幫你申請空間,不負責幫你清理空間 3.free函數可以釋放內存 4.free函數釋放的是內存中的堆區,具體搜: 5.在free函數調用完后記得把對應的指針設為空指針 6.calloc函數跟malloc函數差…

揭秘字符串的奧秘:探索String類的深層含義與源碼解讀

文章目錄 一、導論1.1 引言&#xff1a;字符串在編程中的重要性1.2 目的&#xff1a;深入了解String類的內部機制 二、String類的設計哲學2.1 設計原則&#xff1a;為什么String類如此重要&#xff1f;2.2 字符串池的概念與作用 三、String類源碼解析3.1 成員變量3.2 構造函數3…