欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > c++标准库STL————string类的基础模拟

c++标准库STL————string类的基础模拟

2024/10/24 13:19:48 来源:https://blog.csdn.net/2301_79181624/article/details/137463620  浏览:    关键词:c++标准库STL————string类的基础模拟

string类

  • 一、构造类函数
    • 1.构造一个空内容的对象
    • 2.用已知对象进行拷贝构造
    • 3.用c语言字符串的形式构造
  • 二、容量型函数
  • 三、对象访问
  • 四、修改类操作
    • 4、非成员函数

一、构造类函数

在这里插入图片描述
c11提供了许多参数的重组,但通常这四种类型的构造较为常用。

1.构造一个空内容的对象

2.用已知对象进行拷贝构造

3.用c语言字符串的形式构造

经过观察,1,3可以通过缺省值进行合并

string(const char* str = ""):_size(strlen(str)),_str(nullptr){_capacity = _size ;_str = new char[_capacity + 1];strcpy(_str, str);}

使用对象构造,通过现代写法,可以复用1,3函数

string(const string& s): _str(nullptr){string tmp(s._str);swap(tmp);}

二、容量型函数

在这里插入图片描述
对类成员大小的访问和手动修改,尤其是reserve和clear使用频繁

        char* c_str(){return _str;}const char* c_str() const{return _str;}void reserve(size_t n){if (_capacity < n){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void resize(size_t n, char c){if (_size >= n){_str[n] = '\0';_size = n;}else{reserve(n);for (size_t i = _size; i < n; ++i){_str[i] = c;}_str[n] = '\0';_size = n;}}void clear(){_size = 0;_str[_size] = '\0';}size_t size()const{return _size;}size_t capacity()const{return _capacity;}

三、对象访问

该过程通常使用[]运算符重载,和迭代器begin,end,rbegin,rend,范围for等

        typedef char* iterator;typedef 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;}char& operator [](size_t pos){assert(pos < _size);return _str[pos];}const char& operator [](size_t pos) const{assert(pos < _size);return _str[pos];}

四、修改类操作

在这里插入图片描述
1.+=运算符重载,最为常用
2.append将字符串尾加至对象,与+=一致
3.push_back尾插
4.assign函数通常用于将一个字符串的内容替换为另一个字符串的内容。
剩下几个函数,分别为插入,删除,交换,尾删等

void push_back(char ch){if (_capacity == _size){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '\0';}void append(const char* str){size_t len = strlen(str);if (_capacity < _size + len){reserve(_size + len);}strcpy(_str + _size, str);_size += len;}string& operator+=(const char* str){append(str);return*this;}string& operator+=(const char ch){push_back(ch);return*this;}//插入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 - 1){_str[end] = _str[end - len];end--;}strncpy(_str + pos, str, len);_size += len;return *this;}//  aaaaa   //  aabbbaaastring& insert(size_t pos, char c){assert(pos <= _size);//扩容if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];end--;}_str[pos] = c;++_size;return *this;}string& erase(size_t pos = 0, size_t len = npos){assert(pos < _size);if (len == npos || pos >= _size - len){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}return *this;}void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}

4、非成员函数

在这里插入图片描述

void swap(string& s1, string& s2){s1.swap(s2);}bool operator == (const string a, const string b){int ret = strcmp(a.c_str(), b.c_str());return ret == 0;}bool operator > (const string a, const string b){int ret = strcmp(a.c_str(), b.c_str());return ret > 0;}bool operator < (const string a, const string b){int ret = strcmp(a.c_str(), b.c_str());return ret < 0;}bool operator >= (const string a, const string b){return !(a < b);}bool operator <= (const string a, const string b){return !(a > b);}bool operator != (const string a, const string b){return !(a == b);}std::ostream& operator<< (std::ostream& out, const string& s){for (auto ch : s){out << ch;}return out;}std::istream& operator>> (std::istream& in,  string& s){s.clear();char ch = in.get();char buff[128];size_t i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){buff[127] = '\0';s += buff;i = 0;}ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;}std::istream& getline (std::istream& in, string& s){s.clear();char ch = in.get();char buff[128];size_t i = 0;while ( ch != '\n'){buff[i++] = ch;if (i == 127){buff[127] = '\0';s += buff;i = 0;}ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com