当前位置: 首页 > news >正文

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);
}

主函数测试:

        大家可以自己去测试,这里我就不进行测试了。

http://www.dtcms.com/a/323547.html

相关文章:

  • Adapting Vision-Language Models Without Labels A Comprehensive Survey
  • RWKV与VRWKV
  • Filter,Interceptor拦截器-登录校验
  • visual studio 字体设置
  • 【小米比笔记本Pro15.6】>>Stasrt PXE over IPv6,Press [Esc] to EXIT...
  • 第二十天:余数相同问题
  • 信息安全简要
  • 分布式锁详解及 Spring Boot 实战示例
  • Redis 持久化策略深度剖析:从原理到实战,守护数据不丢失
  • 基于 InfluxDB 的服务器性能监控系统实战(二)
  • [论文阅读] 人工智能 + 软件工程 | Posterior-GRPO:优化代码生成推理过程的新框架
  • Solana上Launchpad混战:新颖性应被重视
  • 云服务器--阿里云OSS(1)【阿里云OSS简单介绍以及环境准备】
  • 论文学习21:Pyramid Scene Parsing Network
  • AG32cpld实现一个UartTx“外设”
  • 莫比乌斯反演学习笔记
  • Qt 元对象系统中的 QMetaObject 类和他的invokeMethod() 函数及其他常见函数应用详解​
  • MoVA:多模态视觉专家混合架构的创新设计与应用实践
  • 【能碳建设2】把“能碳计算”做成可配置、可演示的系统
  • codeforces 补题1
  • FAN5622SX 四通道六通道电流吸收线性LED驱动器,单线数字接口 数字式调光, 2.7 → 5.5 V 直流直流输入, 30mA输出FAN5622S
  • 现代数据加密技术:守护数字世界的无形之盾
  • 供应链需求预测项目如何设定合理的KPI、准确率指标(十四)
  • jxWebUI--输入框
  • M8-11读卡器如何通过RS485转Profinet网关在plc写入从站地址
  • 飞书多维表格搭建设备租赁系统-和保养提醒
  • C++ 虚函数、多重继承、虚基类与RTTI的实现成本剖析
  • 云闪付自动签到脚本
  • 线程池与反射
  • 动态规划(三维)直接按照题目条件