C++ ─── string的完整模拟实现
本博客实现了string的常见接口实现
下面是用到的一些函数,供大家回顾复习
改进1:流提取的改进
原来的代码中流提取中是一个一个字符提取,扩容频率太快,消耗太多
采用buff的方式,buff在栈上,开空间快。
istream& operator>> (istream& is, string& str) { str.clear(); char buff[128]; int i = 0; char ch = is.get(); while (ch != ' ' && ch != '\n') { buff[i++] = ch; //0 - 126 if (i == 127) { buff[i] = ''; str += buff; i = 0; } ch = is.get(); } if (i != 0) { buff[i] = '改进二:拷贝构造和赋值重载的改进
'; str += buff; } return is; }
//bit::string s1(s2) 原来的写法 string::string(const string& s) { _str = new char[s._capacity+1]; strcpy(_str, s._str); _size = s._size; _capacity = s._capacity; } //改进后 //bit::string s2=s1; string::string(const string& s) { string tmp(s._str); std::swap(tmp._str,_str); std::swap(tmp._size,_size); std::swap(tmp._capacity, _capacity); } string::string(const string& s) { string tmp(s._str); swap(tmp); } 注意有些平台s2没有初始化(this指针是随机制),s2与tmp交换后,tmp的_str为随机值,出了函数,tmp会调用析构函数就会崩 解决方案: 在.h文件定义中都加上缺省值 例如: private: //char _buff[16]; char* _str=nullptr; size_t _size = 0; size_t _capacity = 0;
//原来的 string& string::operator=(const string& s) { if (this != &s) { char* tmp = new char[s._capacity + 1]; strcpy(tmp, s._str); delete[] _str; _str = tmp; _size = s._size; _capacity = s._capacity; } return *this; } //改进后 //s1 = s3 string& string::operator=(const string& s) { if (this != &s) { string tmp(s._str); swap(tmp); } return *this; } string& string::operator=(string tmp) { swap(tmp); return *this; }
传统写法就是1.开空间2.拷贝数据
使用现代写法(利用构造函数)改进, 利用构造函数,两者实际效率一样但是现代写法更简单快捷
string.h
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include #include using namespace std; namespace bit { class string { public: typedef char* iterator; typedef const char* const_iterator; iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; //string(); string(const char* str = ""); string(const string& s); string& operator=(const string& s); ~string(); const char* c_str() const; size_t size() const; size_t capacity() const; char& operator[](size_t pos); const char& operator[](size_t pos) 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);//在pos前面插入 void insert(size_t pos, const char* str); void erase(size_t pos = 0, size_t len = npos);//从pos开始删除 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; void clear(); private: //char _buff[16]; char* _str; size_t _size; size_t _capacity; // // const static size_t npos = -1; // ֧ // const static double N = 2.2; const static size_t npos; }; istream& operator>> (istream& is, string& str); ostream& operator _capacity) { char* tmp = new char[n + 1]; strcpy(tmp, _str);//复制字符串最后是'' delete[] _str; _str = tmp; _capacity = n; } } void string::push_back(char ch)//等价与+=(char ch) { if (_size == _capacity) { size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2; reserve(newcapacity); } _str[_size++] = ch; _str[_size] = ''; } void string::append(const char* str)//等价与+=(const char* ch) { size_t len = strlen(str); if (_size == _capacity) { size_t newcapacity = _capacity + len; reserve(newcapacity); } //直接从str末尾加入字符串 strcpy(_str + _size, str); _size += len; } string& string::operator+=(char ch) { push_back(ch); return (*this); } string& string::operator+=(const char* str) { append(str); return (*this); } void string::insert(size_t pos, char ch) { assert(pos pos) { _str[end] = _str[end - 1]; --end; } _str[end] = ch; _size++; } void string::insert(size_t pos, const char* str) { size_t len = strlen(str); assert(pos pos) { _str[end] = _str[end - len]; --end; } _size += len; //while (len) //{ // _str[end + len - 1] = str[len-1]; // --len; //} memcpy(_str + pos, str, len); } void string::erase(size_t pos, size_t len) { assert(pos _size - pos) { _str[pos] = ''; _size = pos; } else { strcpy(_str + pos, _str + pos + len); _size -= len; } } size_t string::find(char ch, size_t pos) { for (size_t i = pos; i _size - pos) { string sub(_str + pos); return sub; } else { string sub; sub.reserve(len); for (size_t i = 0; i (istream& is, string& str) { str.clear(); char ch = is.get(); while (ch != ' ' && ch != '\n') { str += ch; ch = is.get(); } return is; } ostream& operator
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!