C++ STL : 模拟实现STL中的string类
生活随笔
收集整理的這篇文章主要介紹了
C++ STL : 模拟实现STL中的string类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
string的文檔介紹
和allocator作為basic_string的默認(rèn)參數(shù)(根于更多的模板信息請(qǐng)參考basic_string)。
下面就來模擬實(shí)現(xiàn)一個(gè)具備常用功能的String類
實(shí)現(xiàn)的接口:
默認(rèn)成員函數(shù)部分
string(const char* str = ""); //全缺省構(gòu)造函數(shù) string(const string& s); //拷貝構(gòu)造函數(shù) ~string(); //析構(gòu)函數(shù) string& operator=(const string& s);迭代器部分
//用指針模擬實(shí)現(xiàn)迭代器 typedef char* iterator; typedef const char* const_iterator; iterator begin(); //首部迭代器 iterator end(); //尾部迭代器 const_iterator cbegin() const; //首部常量迭代器 const_iterator cend() const; //尾部常量迭代器容量部分
size_t capacity() const; size_t size() const; bool empty() const; void resize(size_t newSize, char c = '\0'); void reserve(size_t newCapacity);元素訪問部分
char& operator[](size_t index); const char& operator[](size_t index) const;關(guān)系運(yùn)算符部分
bool operator<(const string& s); bool operator<=(const string& s); bool operator>(const string& s); bool operator>=(const string& s); bool operator==(const string& s); bool operator!=(const string& s);字符串操作部分
const char* c_str() const; size_t find(char c, size_t pos = 0) const; size_t find(const char* s, size_t pos = 0) const;IO部分
friend std::ostream& operator<<(std::ostream& _cout, const string& s); friend std::istream& operator>>(std::istream& _cin, string& s);修改部分
static size_t npos; string& insert(size_t pos, char c); string& insert(size_t pos, const char* str); string& erase(size_t pos, size_t len = npos); void push_back(char c); void pop_back(); string& operator+=(char c); string& operator+=(const char* str); void append(const char* str); void clear(); void swap(string& s);私有成員
size_t _size; size_t _capacity; char* _str;代碼實(shí)現(xiàn)
因?yàn)榇a有點(diǎn)多就不分開介紹了,所有的思路都寫在注釋里
#pragma once #include<iostream> #include<cstring> #include<cassert>namespace lee {class string{public:typedef char* iterator;typedef const char* const_iterator;friend std::ostream& operator<<(std::ostream& _cout, const string& s);friend std::istream& operator>>(std::istream& _cin, string& s);//構(gòu)造函數(shù)string(const char* str = ""): _size(strlen(str)), _capacity(_size), _str(new char[_size + 1]){strcpy(_str, str);}/*//拷貝構(gòu)造函數(shù)//傳統(tǒng)寫法開空間拷數(shù)據(jù)string(const string& s): _size(s._size), _capacity(s._capacity), _str(new char[_size + 1]){strcpy(_str, s._str);}*///現(xiàn)代寫法,直接構(gòu)造一個(gè)臨時(shí)對(duì)象,然后和那個(gè)臨時(shí)對(duì)象進(jìn)行交換,交換過去的數(shù)據(jù)在函數(shù)結(jié)束便銷毀string(const string& s): _size(0), _capacity(0), _str(nullptr){string temp(s._str);swap(temp);}/*//傳統(tǒng)寫法,開空間拷貝數(shù)據(jù)string& operator=(const string& s){//相同則不交換if (this != &s){char* str = new char[strlen(s._str) + 1];strcpy(str, s._str);delete[] _str;_str = str;}return *this;}*///現(xiàn)代寫法,直接用構(gòu)造函數(shù)構(gòu)建然后交換string& operator=(const string& s){string temp(s._str);swap(temp);return *this;}//析構(gòu)函數(shù)~string(){_size = _capacity = 0;delete[] _str;_str = nullptr;}/*------------------------------------------------------------容量部分Capacity------------------------------------------------------------*///返回capacitysize_t capacity() const{return _capacity;}//返回sizesize_t size() const{return _size;}//如果為空返回true,不為空返回falsebool empty() const{return !_size;}//重新分配sizevoid resize(size_t newSize, char c = '\0'){//如果size不夠,擴(kuò)容if (_size < newSize){//如果capacity不夠,調(diào)用reserve擴(kuò)容if (_capacity < newSize){reserve(newSize);}//將多出的空間全部初始化為cmemset(_str + _size, c, newSize - _size);}//當(dāng)空間夠的時(shí)候,直接截?cái)鄶?shù)據(jù)_size = newSize;_str[_size] = '\0';}//重新分配capacityvoid reserve(size_t newCapacity){if (_capacity >= newCapacity)return;char* str = new char[newCapacity + 1];strcpy(str, _str);delete[] _str;_str = str;_capacity = newCapacity;}/*------------------------------------------------------------迭代器部分Iterators:------------------------------------------------------------*///首部迭代器啊iterator begin(){return _str;}//尾部迭代器iterator end(){return _str + _size;}//首部常量迭代器const_iterator cbegin() const{return _str;}//尾部常量迭代器const_iterator cend() const{return _str + _size;}/*------------------------------------------------------------修改部分Modifiers:------------------------------------------------------------*///在某個(gè)位置后插入字符string& insert(size_t pos, char c){assert(pos < _size);if (_capacity == _size){size_t newcapacity = (_capacity == 0) ? 2 : 2 * _capacity;reserve(newcapacity);}//數(shù)據(jù)后移for (size_t i = _size; i > pos; i--){_str[i] = _str[i - 1];}_str[pos] = c;_str[++_size] = '\0';return *this;}//在某個(gè)位置后插入字符串string& insert(size_t pos, const char* str){assert(pos < _size);size_t size = strlen(str);//檢查容量,不夠就擴(kuò)容if (size + _size > _capacity){reserve(size + _size);}//數(shù)據(jù)后移size個(gè)位置for (size_t i = _size + size - 1; i > pos + size - 1; i--){_str[i] = _str[i - size];}//拷貝數(shù)據(jù)到第pos個(gè)位置memcpy(_str + pos, str, size);_size += size;_str[_size] = '\0';return *this;}// 刪除pos位置上的元素,并返回該元素的下一個(gè)位置string& erase(size_t pos, size_t len = npos){//如果那個(gè)位置后面沒有那么多數(shù)據(jù),就直接從那個(gè)位置截?cái)?#xff0c;刪除后面所有數(shù)據(jù)if (len >= _size - pos){_str[pos] = '\0';_size = pos;}else{//從數(shù)據(jù)刪除后前移pos個(gè)位置for (size_t i = pos + len; i <= _size; i++){_str[i - len] = _str[i];}}//重新設(shè)置size和結(jié)尾的\0_size -= len;_str[_size] = '\0';return *this;}//尾插void push_back(char c){if (_capacity == _size){size_t newcapacity = (_capacity == 0) ? 2 : 2 * _capacity;reserve(newcapacity);}_str[_size++] = c;_str[_size] = '\0';}//尾刪void pop_back(){_str[--_size] = '\0';}//追加字符string& operator+=(char c){push_back(c);return *this;}//尾部追加字符串void append(const char* str){size_t size = strlen(str);//檢查容量,不夠就擴(kuò)容if (size + _size > _capacity){reserve(size + _size);}//尾部追加字符串strcpy(_str + _size, str);_size += size;}//追加字符串string& operator+=(const char* str){append(str);return *this;}//清空stringvoid clear(){_size = 0;_str[_size] = '\0';}//交換stringvoid swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}/*------------------------------------------------------------元素訪問部分Element access:------------------------------------------------------------*/char& operator[](size_t index){assert(index < _size);return _str[index];}const char& operator[](size_t index) const{assert(index < _size);return _str[index];}/*------------------------------------------------------------關(guān)系運(yùn)算符relational operators:------------------------------------------------------------*/bool operator<(const string& s){if (strcmp(_str, s._str) == -1)return true;elsereturn false;}bool operator<=(const string& s){return (*this < s) || (*this == s);}bool operator>(const string& s){return !(*this <= s);}bool operator>=(const string& s){return !(*this < s);}bool operator==(const string& s){if (strcmp(_str, s._str) == 0)return true;elsereturn false;}bool operator!=(const string& s){return !(*this == s);}/*------------------------------------------------------------字符串操作String operations:------------------------------------------------------------*///返回C風(fēng)格的字符串const char* c_str() const{return _str;}//查找字符c第一次出現(xiàn)的位置size_t find(char c, size_t pos = 0) const{assert(pos < _size);size_t i = pos;while (i < _size){if (_str[i] == c)return i;i++;}return npos;}// 返回子串s在string中第一次出現(xiàn)的位置size_t find(const char* s, size_t pos = 0) const{const char* src = _str;const char* sub = s;while (*src){//如果兩個(gè)位置匹配則繼續(xù)遍歷while (*src == *sub && *sub){src++;sub++;}//如果sub走完就說明完全匹配,返回sub第一次出現(xiàn)的位置if ('\0' == *sub){return (src - _str - strlen(s));}//不匹配則回溯,繼續(xù)匹配下一個(gè)位置else{sub = sub;src = ++src;}}return npos;}private:size_t _size;size_t _capacity;char* _str;static size_t npos;};size_t string::npos = -1;std::ostream& operator<<(std::ostream& out, const string& s){out << s._str;return out;}std::istream& operator>>(std::istream& in, string& s){//直接用cin輸入進(jìn)str會(huì)有無法擴(kuò)容的問題,需要手動(dòng)擴(kuò)容while (1){char ch;ch = in.get();//遇到分隔符則暫停if (ch == '\n' || ch == ' '){break;}else{s.push_back(ch);}}return in;} }總結(jié)
以上是生活随笔為你收集整理的C++ STL : 模拟实现STL中的string类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 多线程(二)线程安全:线程安
- 下一篇: C++实现一个简易的线程池