模拟String基本函数/深浅拷贝/柔性数组

ops/2025/3/16 23:46:17/

1.首先我们先关注一下ASCII:

记住常用每一个字符对应的ascii码值!

2.string函数的相关操作函数代码:

大多数小疑问都已经写在注释里面!

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<assert.h>
using namespace std;namespace hush
{class string{public://strlen函数的参数类型要求是const char*string(const char* str="") :_size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];//+1目的是为动态分配的数组,增加额外空间存储‘/0’strcpy(_str, str);}//拷贝构造是用一个已知的对象去初始化另一个新的对象--浅拷贝析构函数调用两次string(const char&str):_str(nullptr),_size(0),_capacity(0){//c++并不会对类置类型进行一个初始化,所以以防编译器版本问题,所以建议进行一个初始化列表}string& operator=(const string& s){if (this != &s){char* tmp = new char[s._capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;}流插入//ostream& operator<<(ostream& out, const string& s)//{//	for (auto ch : s)//	{//		out << ch;//	}//	return out;//}流提取//istream& operator>>(ostream& in, const string& s)//{//	s.clear();//	char ch;//	/*in >> ch;*///	ch = in.get();//	s.reserve(100);//	while (ch != ' ' && ch != '/n')//	{//		s += ch;//		/*in >> ch;*///		ch = in.get();//	}//	return in;// }//这里是迭代器的板块typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}char& operator[](size_t pos)//减少性能开销  如果不加引用,返回时会把返回的数组值重新拷贝一份给临时对象,临时对象再拷贝返回给原数组{assert(pos < _size);return _str[pos];}size_t capacity() const//这样的函数既可以被类的非 const 对象调用,也可以被 const 对象调用。//例如上述的 obj.capacity() 和 constObj.capacity() 都可以正常调用。{return _capacity;}//reserve函数扩容void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void push_back(char ch)//这是尾插,一次插一个{if (_capacity == _size){reserve(_capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '/0';}//append 函数的参数是 char* s,它表示一个指向字符数组(C 风格字符串)的指针,// 意味着函数期望接收一个字符串,然后对字符串进行处理并追加到类内部存储的字符串 _str 后面。// 而 char& s 表示一个字符的引用,它只是单个字符,和原本接收字符串的意图不匹配。void append(const char* s){size_t len = strlen(s);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, s);_size += len;}string& operator+=(char ch){push_back(ch);return *this;}string& operator+=(const char* str){append(str);return *this;}void insert(size_t pos,char* str){size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}// 挪动数据size_t end = _size;while (end >= pos) {_str[end + len] = _str[end];--end;}strncpy(_str + pos, str, len);_size += len;}void insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}//扩容size_t end = _size;while (end >= pos){_str[end + 1] = _str[end];--end;}//这是挪动数据_str[pos] = ch;_size++;}void erase(size_t pos, size_t len = npos) {assert(pos < _size);if (len == npos || pos + len >= _size) {_str[pos] = '\0';_size = pos;}else {size_t begin = pos + len;while (begin <= _size) {_str[begin - len] = _str[begin];++begin;}_size -= len;}}void resize(size_t n, char ch = '/0'){if (n < _size){_str[n] = ch;_size = n;}else{reserve(n);while (n > _size){_str[_size] = ch;++_size;}_str[_size] = '/0';}}size_t find(char ch,size_t pos=0){for (size_t i = pos; i <_size; i++){if (_str[i] == ch) {return i;}}return npos;}size_t find(char* ch, size_t pos = npos){char*p= strstr(_str, ch);//用于在一个字符串中查找另一个字符串首次出现的位置if (p){return p - _str;}else{return pos;}}bool operator<(const string& s) const{return strcmp(_str, s._str) < 0;}bool operator==(const string& s) const{return strcmp(_str, s._str) == 0;}bool operator<=(const string& s) const{return *this < s || *this == s;}bool operator>(const string& s) const{return !(*this <= s);}bool operator !=(const string& s) const{return !(*this == s);}void clear(){_str[0] = '/n';_size = 0;}~string(){delete[]_str;_str = nullptr;_capacity = _size = 0;}private:char* _str;size_t _size;size_t _capacity;const static size_t npos;//静态成员变量要在类外面定义,但是这个其实也是一个特例const +static+ 整型 的可以直接在这一行加缺省值};const  size_t string::npos = -1;
}
//深拷贝:你的数据不是在你的对象里面的,而是指向的一个空间里面
//浅拷贝:就是数据存在对象里面,例如日期类

3.深浅拷贝:

浅拷贝:在编程里,浅拷贝复制的是对象的 “表面” 信息。如果对象里有指向其他数据的指针,浅拷贝只会复制指针的值(也就是内存地址),而不会复制指针所指向的数据。这就好比你复制了一个指向宝藏地点的地图,但地图指向的还是同一个宝藏。要是有人去宝藏地点拿走了东西,两份地图指向的宝藏都没了。

深拷贝:在编程里,深拷贝会递归地复制对象及其所有嵌套的对象。也就是说,它不仅复制对象本身,还会复制对象所指向的所有数据,创建出一个完全独立的副本。

4.c++里面柔性数组:


#include <cstdlib>
//柔性数组
struct Buffer {int length;char data[];//一定要保证它是最后一个成员
};int main() {// 为结构体和柔性数组分配内存int bufferLength = 10;struct Buffer* buf = (struct Buffer*)malloc(sizeof(struct Buffer) + bufferLength * sizeof(char));if (buf == NULL) {perror("Memory allocation failed");return 1;}// 设置长度buf->length = bufferLength;// 释放内存free(buf);return 0;
}

注意事项

  • 必须是结构体的最后一个成员:柔性数组只能作为结构体的最后一个成员,并且结构体中至少要有一个其他成员。
  • 内存管理:使用柔性数组时,需要手动进行内存分配和释放,要确保在不再使用时及时释放内存,避免内存泄漏。

 


http://www.ppmy.cn/ops/166348.html

相关文章

ES6回顾:闭包->(优点:实现工厂函数、记忆化和异步实现)、(应用场景:Promise的then与catch的回调、async/await、柯里化函数)

闭包讲解 ES6回顾&#xff1a;闭包->(优点&#xff1a;实现工厂函数、记忆化和异步实现&#xff09;、&#xff08;应用场景&#xff1a;Promise的then与catch的回调、async/await、柯里化函数&#xff09; 以下是与 JavaScript 闭包相关的常见考点整理&#xff0c;结合 Pro…

Pytest深度集成Playwright让测试自动化变得轻松简单

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在测试自动化领域&#xff0c;你可能已经接触过或使用过像Cypress或Selenium这样的…

48.HarmonyOS NEXT 登录模块开发教程(三)上:短信验证码登录基础实现

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 登录模块开发教程&#xff08;三&#xff09;上&#xff1a;短信验证码登录基础实现 文章目录 HarmonyOS NEXT 登录模块开发教程&a…

REDIS生产环境配置

REDIS生产环境配置 REDIS生产环境配置docker-compose文件redis.conf文件 REDIS生产环境配置 docker-compose模式部署生产环境 docker-compose文件 d_redis:image: redis:${REDIS_VERSION}container_name: d_redisvolumes:- ${REDIS_1_CONF_FILE}:/etc/redis.conf:ro- ${DATA_…

【每日学点HarmonyOS Next知识】上下拉动作、图片预览、组件边距、this获取、svg旋转

1、HarmonyOS 怎么实现上拉刷新&#xff0c;并可以调接口和实现动画&#xff0c;下拉刷新同理&#xff1f; 怎么实现上拉刷新&#xff0c;并可以调接口和实现动画&#xff0c;下拉刷新同理 参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-referenc…

Django REST Framework 中 ModelViewSet 的接口方法及参数详解,继承的方法和核心类方法,常用查询方法接口

第一部分&#xff08;ModelViewSet&#xff09; 一、ModelViewSet 的继承结构 ModelViewSet 继承自以下类&#xff1a; ModelViewSet (CreateModelMixin # 创建RetrieveModelMixin # 检索单个UpdateModelMixin # 更新DestroyModelMixin # 删除ListModelMixin …

【python】OpenCV—Hough Circle Transform

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 2、代码实现 载入必要的库 import sys import cv2 as cv import numpy as np函数入口 if __name__ "__main__&qu…

Ubuntu 服务器安装 Python 环境 的详细指南

以下是 在 Ubuntu 上安装 Python 3.10 的详细步骤&#xff08;兼容 Ubuntu 20.04/22.04&#xff09;&#xff1a; 方法一&#xff1a;通过 PPA 仓库安装&#xff08;推荐&#xff09; 1. 添加 deadsnakes PPA sudo apt update sudo apt install software-properties-common s…