string類實現

目錄

string類實現

1.構造函數(三種)

2.c_str()函數

3.operator[] 重載

4.size()函數實現

5.迭代器

6.reserve()函數實現

7.push_back()函數實現

8.append()函數實現

9.operator+=實現

10.insert() 實現

11.erase()函數實現

12.find()函數實現

13.swap()函數實現

14.substr()函數實現

15.運算符重載比大小

16.clear

17.流插入 流提取實現

18.析構函數

補充修改

1.push_back優化

2.append優化

3.insert函數另外一種方法


string類實現

我們采用聲明和定義分離的方式

首先是.h文件

//
//  string.hpp
//  String
//
//  Created by 南毅 on 2024/5/8.
//#ifndef string_hpp
#define string_hpp#endif /* string_hpp */
#include <iostream>
using namespace std;
#include <assert.h>
#include <string.h>namespace nanyi{class String{private:char* _str;size_t _size;size_t _capacity;const static size_t npos;public:typedef char* iterator;typedef const char* const_iterator;//s構造函數、初始化列表//拷貝構造String(const char* str = "");String();String(const String& s);String& operator=(const String &s);~String();const char* c_str() const;size_t size() const;char& operator[](size_t pos);const char& operator[](size_t pos) const;iterator begin();iterator end();const_iterator begin() const;const_iterator end() const;void reserve(size_t n);void push_back(char ch);void append(const char* str);String& operator+=(char ch);String& operator+=(const char* str);void insert(size_t pos, char ch);void insert(size_t pos, const char* str);void erase(size_t pos = 0, size_t len = npos);size_t find(char ch, size_t pos = 0);size_t find(const char* str, size_t pos = 0);void swap(String& s);String substr(size_t pos = 0, size_t len = npos);bool operator<(const String& s) const;bool operator>(const String& s) const;bool operator<=(const String& s) const;bool operator>=(const String& s) const;bool operator==(const String& s) const;bool operator!=(const String& s) const;void clear();};istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);
}

1.構造函數(三種)

//構造函數
String::String(const char* str):_size(strlen(str))
{_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);
}
//默認構造
String::String(){_str = new char[1]{'\0'};_size = _capacity = 0;
}//拷貝構造
String::String(const String& s)
{_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}

2.c_str()函數

因為C形式字符串是內置類型,所以使用cout打印時編譯器會自動識別類型,相當于使用%s進行打印字符串,只需要返回字符串數組首字符地址即可

const char* String:: c_str() const {return _str;
}

3.operator[] 重載

可以以數組的形式,通過下標訪問數據

char& String::operator[](size_t pos){assert(pos < _size);return _str[pos];
}
const char& String::operator[](size_t pos) const{assert(pos < _size);return _str[pos];
}

4.size()函數實現

size_t String::size() const
{return _size;
}

5.迭代器

String::iterator String::begin(){return _str;
}String::iterator String::end(){return _str + _size;
}String::const_iterator String::begin() const{return _str;
}
String::const_iterator String::end() const{return _str + _size;
}

6.reserve()函數實現

void String::reserve(size_t n){char* tmp = new char[n+1];strcpy(tmp, _str);delete [] _str;_str = tmp;_capacity = n;
}

7.push_back()函數實現

void String::push_back(char ch){if (_size == _capacity) {size_t newcapacity = _capacity == 0? 4 : _capacity*2;reserve(newcapacity);}_str[_size] = ch;_str[_size + 1] = '\0';_size++;
}

8.append()函數實現

void String::append(const char* str){size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}strcpy(_str + _size, str);_size += len;
}

9.operator+=實現

//+=一個字符
String& String::operator+=(char ch){push_back(ch);return *this;
}
//+=一個字符串
String& String::operator+=(const char* str){append(str);return *this;
}

10.insert() 實現

void String::insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity) {size_t newcapacity = _capacity == 0? 4 : _capacity*2;reserve(newcapacity);}size_t end = _size + 1;while (end > pos) {_str[end] = _str[end-1];end--;}_str[pos] = ch;_size++;
}
void String::insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}size_t end = _size + len;while (end >= pos + len) {_str[end] = _str[end-len];end--;}memcpy(_str + pos, str, len);_size += len;
}

11.erase()函數實現

void String::erase(size_t pos, size_t len){assert(pos <= _size);if (len >= _size - pos) {_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}
}

12.find()函數實現

size_t String::find(char ch, size_t pos){for (size_t i = 0; 0 < _size; i++) {if (_str[i] == ch) {return i;}}return npos;
}
size_t String::find(const char* str, size_t pos){char* p = strstr(_str + pos,str);return p - _str;
}

13.swap()函數實現

void String::swap(String& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}

14.substr()函數實現

String String::substr(size_t pos, size_t len){if (len > _size - pos) {String sub(_str + pos);return sub;}else{String sub = "";sub.reserve(len);for (size_t i = 0; i < len; i++) {sub += _str[pos+i];}return sub;}}

15.運算符重載比大小

bool String::operator<(const String& s) const{return strcmp(_str, s._str) < 0;
}bool String::operator==(const String& s) const{return strcmp(_str, s._str) == 0;
}bool String::operator>(const String& s) const{return !(*this <= s);}bool String::operator<=(const String& s) const{return *this < s || *this == s;}bool String::operator>=(const String& s) const{return !(*this < s);}bool String::operator!=(const String& s) const{return !(*this == s);}

16.clear

 void String::clear(){_str[0] = '\0';_size = 0;}

17.流插入 流提取實現

istream& operator>> (istream& is, string& str){str.clear();char ch = is.get();while (ch != ' ' && ch != '\n') {str += ch;ch = is.get();}return is;
}ostream& operator<< (ostream& os, const string& str){for (size_t i = 0; i < str.size(); i++){os << str[i];}return os;
}

18.析構函數

//析構函數
String::~String(){delete[] _str;_str = nullptr;_capacity = _size = 0;}

補充修改

1.push_back優化

void String::push_back(char ch){insert(_size, ch);
}

2.append優化

void String::append(const char* str){insert(_size, str);
}

3.insert函數另外一種方法

void String::insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity) {size_t newcapacity = _capacity == 0? 4 : _capacity*2;reserve(newcapacity);}size_t end = _size;while (end >= (int)pos){_str[end + 1] = _str[end];--end;}_str[pos] = ch;++_size;
}
void String::insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}int end = _size;while (end >= (int)pos){_str[end + len] = _str[end];--end;}memcpy(_str + pos, str, len);_size += len;
}

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

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

相關文章

Chrome 瀏覽器的常用命令包括

Chrome 瀏覽器的常用命令包括&#xff1a; 1. **新建標簽頁**&#xff1a;Ctrl T &#xff08;在 Windows/Linux 下&#xff09;&#xff0c;Command T &#xff08;在 macOS 下&#xff09;。 2. **關閉當前標簽頁**&#xff1a;Ctrl W &#xff08;在 Windows/Linux 下&…

Java面試八股之Collection和Collections的區別

Java中Collection和Collections的區別 Collection 是一個接口&#xff0c;位于 java.util 包中&#xff0c;它是 Java 集合框架的頂層接口之一&#xff0c;代表了一組對象的集合。Collection 接口定義了所有集合類型&#xff08;如 List、Set、Queue 等&#xff09;所共有的基…

LeetCode2352相等行列對

題目描述 給你一個下標從 0 開始、大小為 n x n 的整數矩陣 grid &#xff0c;返回滿足 Ri 行和 Cj 列相等的行列對 (Ri, Cj) 的數目。如果行和列以相同的順序包含相同的元素&#xff08;即相等的數組&#xff09;&#xff0c;則認為二者是相等的。 解析 針對題目給出的數量級…

cubemx配置stm32f407VET6實現can通信

背景&#xff1a; 項目上需要把原先的TMC5160電機驅動器替換為購買的電機控制模塊&#xff08;該模塊采用canopen通信&#xff09; 移植canopen的前提是can通信正常&#xff0c;現在添加一下can通信&#xff08;先用標準幀&#xff0c;250K bit/S的波特率測試&#xff09; 原理…

個人學習計劃

vue前端&#xff08;一周&#xff09; 05/14 - 05/19 Html、css復習、vue基礎復習、axios復習 05/14 ElementUI學習 05/15 JWT集成驗證碼、token 05/16 vue-route多角色登錄 05/17 增刪查改、文件下載 05/18 Echart餅狀圖 05/19 &#x1f4cc; 附加學習&#xff1a; 父子傳值三…

其它高階數據結構②_圖(概念+存儲+遍歷+最小生成樹)

目錄 1. 圖的概念 2. 圖的存儲結構 2.1 鄰接矩陣&#xff08;后面算法所用&#xff09; 2.2 鄰接表 3. 圖的遍歷 3.1 BFS廣度優先遍歷 3.2 DFS深度優先遍歷 4. 最小生成樹 4.1 Kruskal算法 4.2 Prim算法 本篇完。 1. 圖的概念 圖是由頂點集合及頂點間的關系組成的一…

重磅!麒麟信安發布CentOS安全加固套件

CentOS Linux 7系統即將在6月30日停服&#xff0c;標志CentOS全部停止更新和維護。黨政、金融、能源、通信、交通、公共服務等關鍵信息基礎設施領域已經投運使用的CentOS系統將無法獲取官方提供的漏洞修復補丁&#xff0c;此后&#xff0c;CentOS系統將面臨巨大的安全風險與危害…

【運維項目經歷|003】:Nginx集群化運維升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 問題1&#xff1a;為什么選擇nginx-1.25.4版本&#xff0c;nginx官方最新版本是哪一個版本&…

河南廣電與LiblibAI簽署戰略合作協議

5月15日&#xff0c;河南廣電科技與LiblibAI戰略簽約儀式在鄭州中原福塔新聞發布廳隆重舉行。雙方將本著“共商、共享、共建、共贏”原則&#xff0c;基于全面、可持續的戰略合作伙伴關系&#xff0c;發揮各自優勢&#xff0c;共同聚焦生成式AI領域&#xff0c;圍繞內容創作、商…

CPU占用率過高排查

CPU占用率高是設備本身的一種現象&#xff0c;直觀表現為display cpu-usage命令查詢結果中整機CPU占用率“CPU usage”偏高&#xff0c;如超過70%。在網絡運行中CPU高常常會導致其他業務異常&#xff0c;如BGP震蕩、VRRP頻繁切換、甚至設備無法登錄。 通常&#xff0c;整機CPU占…

Java基礎教程 - 7 面向對象-1

更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 7 面向對象 面向對象&am…

無人售貨奶柜:掘金新零售藍海,

無人售貨奶柜&#xff1a;掘金新零售藍海&#xff0c; 在日新月異的商業浪潮中&#xff0c;無人奶柜猶如一股清新的創業颶風&#xff0c;正以不可阻擋之勢吸引著眾多創業者的目光。這股新興力量以其獨到之處和龐大的市場藍海&#xff0c;預示著一場關于健康、便捷消費方式的深…

【C#】DateTime類型數組含有null?并排序

代碼 internal class Program{static void Main(string[] args){List<DateTime?> dateTimes new List<DateTime?> { null,DateTime.MinValue,DateTime.MaxValue};var temp new List<DateTime?> { };dateTimes.Sort();//dateTimes.Reverse();foreach (va…

石碑之謎:滾動機關

描述 在蒙德和璃月的邊界地帶&#xff0c;有一個被遺忘的神廟&#xff0c;里面有一個奇怪的機關&#xff1a;滾動石碑。小熊必須操作這個112的長方體石碑&#xff0c;使其通過不同的地面環境&#xff0c;最終放置到神秘的符號“O”上&#xff0c;以解開通往寶藏的大門。 石碑…

Edwards愛德華PHM3000培訓PPT課件內容可見圖片詳情

Edwards愛德華PHM3000培訓PPT課件內容可見圖片詳情

golang encoding/json 使用基礎

json 與 encoding/json JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;它基于 ECMAScript&#xff08;歐洲計算機協會制定的js規范&#xff09;的一個子集&#xff0c;采用完全獨立于語言的文本格式來存儲和表示數據。簡潔和…

SDL系列(一)—— 小白入門

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套開放源代碼的 跨平臺多媒體開發庫 &#xff0c;使用 C 語 言寫成。 SDL 提供了數種控制圖像、聲音、輸出入的函數&#xff0c;讓開發者只要用相同或是相似的 代碼就可以開發出 跨多個平臺&#xff08; Linu…

618有什么劃算的數碼產品?4款精選數碼好物清單分享,趕緊碼住!

隨著618購物節慢慢開始&#xff0c;數碼產品的大門已經向你敞開&#xff0c;等你來發現里面的各種樂趣。在這個購物的好時節&#xff0c;我們為你準備了一些很不錯的數碼東西&#xff0c;不管是喜歡新鮮科技的你&#xff0c;還是需要實用小工具的朋友們&#xff0c;這里都有可能…

安卓、iOS、iPad三端搞定,不再劇荒!

哈嘍&#xff0c;各位小伙伴們好&#xff0c;我是給大家帶來各類黑科技與前沿資訊的小武。 之前給大家推薦過各種看劇姿勢&#xff0c;但很多蘋果、平板端的小伙伴還是存在更好的需求體驗&#xff0c;今天給大家推薦這款可以在安卓、iOS和平板上都能安裝使用&#xff0c;不再劇…

2024自學網絡安全的三個必經階段(含路線圖)_網絡安全自學路線

一、為什么選擇網絡安全&#xff1f; 這幾年隨著我國《國家網絡空間安全戰略》《網絡安全法》《網絡安全等級保護2.0》等一系列政策/法規/標準的持續落地&#xff0c;網絡安全行業地位、薪資隨之水漲船高。 未來3-5年&#xff0c;是安全行業的黃金發展期&#xff0c;提前踏入…