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

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.rhkb.cn/news/36559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

文档搜索引擎

实现的搜索功能 首先获取很多的网页,然后根据用户输入的查询词,在这些网页中进行查找 用户输入查询词之后,如何让查询词和当前的网站进行匹配? 首先获取很多网页(爬虫->一个http客户端,发送http请求获取http响应结果(就是网站))(批量化的获取很多的页面), 再根据用户输入…

自然语言处理入门4——RNN

一般来说&#xff0c;提到自然语言处理&#xff0c;我们都会涉及到循环神经网络&#xff08;RNN&#xff09;&#xff0c;这是因为自然语言可以被看作是一个时间序列&#xff0c;这个时间序列中的元素是一个个的token。传统的前馈神经网络结构简单&#xff0c;但是不能很好的处…

C++学习之QT实现取证小软件首页

实现效果 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QToolButton> #include <QLabel> #include <QMessageBox> #include <QDebug> #include <QHBoxLayout> #include <QTableView> #incl…

AI 数字人短视频数字人分身系统源码开发难点都有哪些?

AI 数字人分身系统源代码开发涉及多个领域的复杂技术&#xff0c;其难点主要体现在以下几个方面&#xff1a; 逼真的数字人建模 精确的人体扫描与重建&#xff1a;要创建高度逼真的数字人分身&#xff0c;首先需要对真实人体进行精确扫描&#xff0c;获取准确的人体外形、肌肉…

适合用户快速开发项目的PHP框架有哪些?

有时候用户赶时间&#xff0c;并想快速在有限的时间里&#xff0c;筑起自己的项目&#xff0c;对于适合用户快速开发项目的PHP框架有哪些推荐呢&#xff1f;下面一起来了解一下。 1. Laravel Laravel 是一个功能强大且语法优雅的PHP框架&#xff0c;提供了丰富的功能和工具&a…

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比&#xff0c;上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …

进程间通信(1)——管道

1. 进程间通信简介 进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指不同进程之间交换数据的机制。由于进程具有独立的地址空间&#xff0c;它们无法直接访问彼此的数据&#xff0c;因此需要IPC机制来实现信息共享、数据传递或同步操作。 …

台达PLC转太网转换的教程案例(台达DVP系列)

产品介绍 台达DVP-PLC自投身工业自动化市场以来&#xff0c;始终致力于创新发展&#xff0c;不断推陈出新。其产品紧密贴合市场需求与行业工艺&#xff0c;凭借卓越性能与丰富功能&#xff0c;深受用户青睐。不仅推出了高效的程序与编辑工具&#xff0c;显著提升了主机执行速度…

ArcGIS10. 8简介与安装,附下载地址

目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统&#xff08;GIS&#xff09;平台。其核心功能在于…

R语言高效数据处理-自定义格式EXCEL数据输出

注&#xff1a;以下代码均为实际数据处理中的笔记摘录&#xff0c;所以很零散&#xff0c; 将就看吧&#xff0c;这一篇只是代表着我还在&#xff0c;所以可能用处不大&#xff0c;这一段时间都很煎熬&#xff01; 在实际数据处理中为了提升效率&#xff0c;将Excel报表交付给…

从零构建大语言模型全栈开发指南:第一部分:数学与理论基础-1.1.2核心数学基础:线性代数、概率论与梯度优化

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.1.2 核心数学基础&#xff1a;线性代数、概率论与梯度优化1. 线性代数&#xff1a;大语言模型的“骨架”1.1 核心概念与应用场景表1&#xff1a;线性代数核心运算与模型应…

科研项目验收管理系统

摘 要 使用旧方法对科研项目信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在科研项目信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的科研项目验收管…

游戏成瘾与学习动力激发策略研究——了解存在主义心理学(通俗版)

存在主义心理学是20世纪中叶兴起的重要心理学流派,融合了哲学存在主义思想,强调人的主观体验、自由选择与责任承担,旨在帮助个体在不确定的世界中创造意义。 研究人如何在不确定的世界中活出意义的心理学,核心思想可以概括为以下四点: 存在主义心理学的主要内容 “存在先于…

Dropshare for Mac v6.1 文件共享工具 支持M、Intel芯片

Dropshare 是 Mac 用来上传图片、视频、截图和各种文件的工具。这款软件利用了SCP over SSH传输协议来将 Mac 本机的文件快速上传到自设的远程服务器。 应用介绍 Dropshare 是 Mac 用来上传图片、视频、截图和各种文件的工具。这款软件利用了SCP over SSH传输协议来将 Mac 本…

关于redis中的分布式锁

目录 分布式锁的基础实现 引入过期时间 引入校验id 引入lua脚本 引入看门狗 redlock算法 分布式锁的基础实现 多个线程并发执行的时候&#xff0c;执行的先后顺序是不确定的&#xff0c;需要保证程序在任意执行顺序下&#xff0c;执行逻辑都是ok的。 在分布式系统中&am…

利用AI让数据可视化

1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是&#xff08;&#xff09;。2、&#xff08;&#xff09;可以判断企业在行业中所处的地位。3、&#xff08;&#xff09;是指店铺内有…

PairRE: Knowledge Graph Embeddings via Paired Relation Vectors(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2020年11月 代码位置 25年3月24日交 目录 一、简介 二、原理 1.整体 2.关系模式 3.优化模型 三、实验性能 四、结论和未来工作 一、简介 将RotatE进行生级&#xff0c;RotatE只对头实体h进行计算&#xff0c;PairRE对头尾…

解决git init 命令不显示.git

首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件&#xff0c;有可能是因为.git文件隐藏了&#xff0c;下面是解决办法

汇编移位指令

rol, ror 循环左移/右移 该指令影响CF。因为左移/右移时将最高位/最低位移动到CF中&#xff0c;同时移动到最低位&#xff0c;其他位依次左移/右移。 shl, shr 逻辑左移/右移 该指令影响CF。因为左移/右移时将最高位/最低位移动到CF中&#xff0c;其他位依次左移/右移&…