C++入门自学Day7-- String类的自实现
往期回顾
String类的使用(续)
String类(续)
String类(初识)
C++ std::string简要总结
1. 基本介绍
-
std::string 是 C++ 标准库提供的字符串类,封装了字符数组,支持动态大小管理。
-
具备安全性和便捷性,替代了传统的 C 风格字符串(char*)。
2. 构造函数
默认构造:创建空字符串。
-
从 C 字符串构造。
-
拷贝构造。
-
指定字符和个数构造。
-
迭代器范围构造。
3. 基本属性
-
size() / length():返回字符串长度。
-
capacity():当前分配的容量。
-
empty():判断是否为空。
4. 内存管理
-
reserve(size_t):预留容量,减少扩容次数,不改变长度。
-
resize(size_t):改变长度,扩展时填充字符,缩短时截断。
-
支持动态增长和释放。
5. 访问字符
-
operator[]:无边界检查,访问字符。
-
at():带边界检查,安全访问。
-
迭代器:begin(), end(), cbegin(), cend()。
-
反向迭代器:rbegin(), rend()。
6. 字符串操作
-
追加:append(), +=, push_back()。
-
插入:insert()。
-
删除:erase()。
-
替换:replace()。
-
查找:find(), rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of()。
-
子串:substr()。
-
比较:compare()。
7. 字符串与 C 字符串转换
-
c_str():返回以 \0 结尾的 C 字符串。
-
data():返回字符串内部数据指针(C++17 及之后等价于 c_str())。
8. 运算符支持
-
拼接:+, +=。
-
比较:==, !=, <, > 等。
9. 性能和安全
-
拷贝是深拷贝,确保对象独立。
-
C++11 起支持移动语义,提升性能。
-
动态管理内存,避免手动管理。
总结:
std::string 提供了强大且方便的字符串操作功能,封装了底层字符数组的复杂性,安全且高效,是 C++ 字符串操作的首选工具
C++string类的自实现
一、string类的自定义
1、需要使用到的头文件内容
#include<iostream> using namespace std; #include<assert.h> #include<string.h>
2、自定义string类的成员变量
namespace your_namespace{class string{ private:char* _str;size_t _size;size_t _capacity;static size_t npos;}; }
3、自定义的构造,拷贝构造,析构函数
string(const char* str = "",size_t size = 0,size_t capacity = 10) //两个构造函数 :_str(new char[capacity]) {if(capacity<(strlen(str)+1)){_str = new char[strlen(str)+1];_capacity = strlen(str);}else{_str = new char[capacity];_capacity = capacity;}_size = strlen(str);strcpy(_str,str); } ~string(){delete [] _str;_str = nullptr;_capacity = 0;_size = 0; string(const string& str){_str = new char[strlen(str._str)+1];_capacity = str._capacity;_size = str._size;strcpy(_str,str._str); }
4、基本属性函数
size() / length():返回字符串长度。
capacity():当前分配的容量。
empty():判断是否为空。
size_t size() const{return _size; } size_t capacity() const {return _capacity; }bool isempty(){if(_size != 0){return false;}return true; }
5、内存管理函数
reserve(size_t):预留容量,减少扩容次数,不改变长度。
resize(size_t):改变长度,扩展时填充字符,缩短时截断。
void reserve(size_t n){assert(n > _capacity);char* new_str = new char[n+1];strcpy(new_str,_str);delete[] _str;_str = new_str;_capacity = n; }; void resize(size_t size,char ch = '\0'){if(size < _size){_str[size] = '\0';}else{if(size > _capacity){reserve(size);}for(size_t i = _size ;i < size; i++){_str[i] = ch;}_str[size] = '\0';}_size = size; }
6. 字符串操作函数
追加:append(), +=, push_back()。
插入:insert()。
删除:erase()。
替换:replace()。
查找:find(),
子串:substr()。
比较:compare()。
void push_back(char ch){if(_size == _capacity){size_t new_capacity = 2*_capacity;reserve(new_capacity);}_str[_size] = ch;++_size;_str[_size] = '\0'; } void append(const char* str){size_t len = strlen(str);// while (len+_size > _capacity)// {// _capacity *= 2;// }if(len+_size > _capacity){_capacity = len+_size;}reserve(_capacity);// strcat(newstr,_str);// strcat(newstr,str);strcpy(_str+_size,str);_size += len; }; void Delete(){if(_size == 0){cout<< "void string!"<<endl;return;}_size --; }string& insert(size_t pos, char ch){assert(pos<_size);if(_size == _capacity){reserve(2*_capacity);}int end = _size;while(end >= pos){_str[end+1] = _str[end];}_str[pos] = ch;_size++;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);}int end = _size;while (end >= pos){_str[end+len] = _str[end];end--;};strncpy(_str+pos,str,len);_size += len;return *this; } string& erase(size_t pos, size_t len = npos){assert(pos<_size);if(pos+len >= _size){_size = pos;_str[_size] = '\0';}else{int res = _size - len - pos;size_t end = _size;while (res >= 0){_str[pos+res] = _str[end--];res--;}_size = _size-len;}return *this; } string& operator+=(char ch){this->push_back(ch);return *this; } string& operator+=(const char * str){this->append(str);return *this; } size_t find(char ch, size_t pos = 0){assert(pos >= 0 && pos<_size);while (pos < _size){if(_str[pos] == ch){return pos;}pos ++;}return npos; } size_t find(const char* str, size_t pos = 0){assert(pos<_size);// if(pos + len > _size){// return npos;// }// for(size_t begin = pos; begin <=_size-len;begin++){// size_t i = 0;// while ( i < len && _str[begin+i] == str[i])// {// ++i;// }// if(i == len){// return begin;// }// }// return npos;char* ps = strstr(_str+pos,str);if(!ps){return npos;}else{return ps -_str;} }
7. c_str()函数
c_str():返回以 \0 结尾的 C 字符串。
char* c_str(){char* str = new char[_size];strcpy(str, _str);return str; }
8、运算符支持
拼接:+, +=。
比较:==, !=, <, > 等。
string& operator= (const string& str){if(&str == this){return *this;}delete [] _str;if(str._str){_str = new char[strlen(str._str)+1];strcpy(_str,str._str);}else{_str = nullptr;}_capacity = str._capacity;_size = str._size;return *this; } string& operator+=(char ch){this->push_back(ch);return *this; } string& operator+=(const char * str){this->append(str);return *this; } char& operator[](size_t i){assert(i<_size);return _str[i]; } const char& operator[](size_t i) const{assert(i<_size);return _str[i]; } bool operator<(const string& s){int ret = strcmp(_str,s._str);return ret<0; } bool operator>(const string& s){int ret = strcmp(_str,s._str);return ret > 0; } bool operator==(const string& s){int ret = strcmp(_str,s._str);return ret == 0; } bool operator<=(const string& s){return !(*this > s); } bool operator!=(const string& s){return !(*this == s); } bool operator>=(const string& s){return !(*this < s); }
主函数测试:
大家可以自己去测试,这里我就不进行测试了。