数据结构–用C++实现string

典型的String类实现C++ 一个典型的String类实现,C++描述,里面包括String的构造函数,赋值构造函数,析构函数,赋值操作符的实现等 立即下载

**

数据结构–用C++实现string

**

这两天在写string类,实现方法是定长顺序存储。将串定义成字符数组,利用串名可以直接访问串值。用这种表示方法,串的存储空间在编译时确定,其大小不能改变。

代码如下:
文件MyString.h

#ifndef MyString_byNim
#define MyString_byNim

#include<iostream>
#include<string.h>
using namespace std;

#define MAX_STRLEN 256  //定长
class MyString
{
    private:
        char *ch;   //串存放数组
        int curLen; //串实际长度
        int maxSize;    //存放数组的最大长度
    public:
        MyString()  //默认构造函数,构造一个最大长度为MAX_STRLEN,实际长度为0的字符串
        {
            maxSize=MAX_STRLEN;
            curLen=0;
            ch=new char[maxSize+1];
        }
        MyString(const char *init)  //构造函数,构造一个最大长度为maxSize,由init初始化的新字符串对象
        {
            int len=strlen(init);
            if(len>MAX_STRLEN)
                maxSize=len;
            else
                maxSize=MAX_STRLEN;
            curLen=len;
            ch=new char[maxSize+1];
            strcpy(ch,init);
        }
        MyString(const MyString& obj)   //拷贝构造函数,由一个已有的字符串对象ogj构造一个新字符串
        {
            maxSize=obj.maxSize;
            curLen=obj.curLen;
            ch=new char[maxSize+1];
            strcpy(ch,obj.ch);
        }
        ~MyString()    //析构函数,释放动态分配的串空间并撤销改字符串对象
        {
            delete []ch;
            ch=NULL;
        }
        int length()const   //函数返回串*this的实际长度
        {
            return curLen;
        }
        MyString operator()(int pos,int len)    //则在串*this中从pos所指出位置开始连续取len个字符组成子串返回
        {
            MyString temp;
            if(pos>=0&&pos<maxSize&&len>=0&&(pos+len)<maxSize)
            {
                len=((pos+len-1)>=curLen)?(curLen-pos):len; //如果所取长度大于串*this中现有长度,则取curLen-pos
                temp.curLen=len;
                for(int i=0,j=pos;i<len;i++,j++)
                {
                    temp.ch[i]=ch[j];
                }
                temp.ch[len]='\0';  //串结尾符 
            }
            return temp;
        }
        bool operator==(MyString& obj)const //运算符==重载 
        {
            if(strcmp(ch,obj.ch)==0)
                return true;
            return false;
        }
        bool operator!=(MyString& obj)const //运算符!=重载 
        {
            if(strcmp(ch,obj.ch)!=0)
                return true;
            return false;
        }
        MyString& operator=(MyString& obj)  //串obj赋值给当前串*this
        {
            if(&obj != this)
            {
                delete []ch;
                maxSize=obj.maxSize;
                curLen=obj.curLen;
                ch=new char[maxSize+1];
                strcpy(ch,obj.ch);
            }
            return *this;
        }
        MyString& operator+=(MyString& obj)
        {
            int i,j;
            if(curLen+obj.curLen>maxSize)
            {
                obj.curLen=maxSize-curLen;  //如果相接后的长度大于maxSize,则取obj对象的前maxSize-curLen位 
            }
            for(i=curLen,j=0;j<obj.curLen;i++,j++)
            {
                ch[i]=obj.ch[j];
            }
            curLen+=obj.curLen;
            return *this; 
        }
        char& operator[](int i) //取*this的第i个字符
        {
            if(i<0||i>=curLen)
                throw "溢出";
            return ch[i];
        }
        /*int find(MyString* pat)const//若串pat与串*this中的某个子串匹配,则函数返回第1次匹配时子串在串*this中的位置,若串pat为空或在串*this中没有匹配子串,则函数返回-1
        {
            int i=0;
            int j=0;
            for(i=0;i<=curLen-pat->curLen;i++)
            {
                for(j=0;j<pat->curLen;j++)
                {
                    if(ch[i+j]!=pat->ch[j])
                    {
                        break;
                    }
                }
                if(j==pat->curLen)
                {
                    return i;
                }
            }
                return -1;//这里先挖个坑,目前还不知道如何调用,留以后修改
            }*/
        friend ostream& operator<<(ostream &os,const MyString &str) //运算符<<重载 
        {
            int i;
            for(i=0;i<str.curLen;i++)
            {
                os<<str.ch[i];
            }
            return os;
        }
};

#endif

MyString初始化方法:

MyString s1="abc";
MyString s2=("abc");

这个类是根据别人写的来修改的,具体可参照:
http://blog.youkuaiyun.com/cainv89/article/details/51786007

以太网以及车载以太网概述 千兆网线和百兆网线区别 1、所谓的百兆网线其实就是 五类线 和超五类线 ,而千兆网线主要是指六类线 和超六类线 ,另外还有古老的十兆网线也就是指 四类线 和 三类线 等。 2、在使用上,其实千兆网线和百兆网线是没什么区别的,千兆网线完全兼容百兆网络。 3、百兆网线的线芯是8芯,但上传和下载只用到了其中的4根,而千兆网线需要完全用到8根。 4、另外在线芯的排布上,千兆网线的线芯中间有个十字形的塑料架,用来把四组8芯的线分开,这个百兆网线是没有的, 5、所有的网线在外皮上都有种类标识,CAT5 CAT 阅读详情

相关推荐

嵌入式统一消息机制:模块解耦与零拷贝通信设计

在嵌入式系统开发中,模块间通信(IMC)是影响可维护性与实时性的关键环节。传统IPC方式如全局变量、信号量或Socket易导致高耦合、调试困难及跨平台适配成本高。统一消息机制通过逻辑地址抽象、标签/实体分离、路由表驱动等原理,实现控制流与数据流解耦,在裸机、RTOS及Linux用户态保持一致接口。其技术价值在于降低模块依赖复杂度、支持动态增删与分布式迁移,并通过零拷贝优化显著减少CPU与内存开销。典型应用场景涵盖工业网关、城域交换机、多核ARM边缘设备等资源受限环境,尤其适用于需长期稳定运行、快速迭代与混合

weixin_35257663的博客 266

数据结构之String实现

说到底,string类实际上就是对字符串指针进行一系列的操作 两个重点: 1.接口记得写哪一些 2. c函数的使用 strcpy(newString.m_data, m_data); strcat(newString.m_data, other.m_data); class MyString { public: MyString(const char* str = NUL...

MrZhuangzhipeng的博客 434

MTK pwm beeper配置记录

如果正常,系统启动后会在/dev/input下生成 一个event节点,使用方法参考标准linux使用。dts相关修改如下,全都在里面,注意一下位置。对应的配置文件中增加如下定义。

hclydao的专栏 727

C#数据结构-string字符串实现

using System; using System.Collections; using System.Collections.Generic; namespace StructScript { public sealed class StringScript : IEnumerable&lt;char&gt;, IEnumerable, IEquatable&lt;StringSc...

qq826364410的专栏 1023

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2415

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1142

string的实现

一般来说,为了防止与标准库中的string冲突,我们都会开一个命名空间。 构造函数,如果用最基本的构造函数,会怎么样 class string { public: string() :_str(nullptr) {} string(char* s) :_str(s) { } 这样子初始化的常量字符串,不能被修改,被存放再代码段,且扩容也不好处理。因此构造时候,不能直接传,要用new来动态开辟空间储存,因此其实string的底层是数组。 string(const cha

w1724556613的博客 326

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 414

【C++】深度剖析string类的底层结构及其模拟实现

深度剖析string类的底层结构及其模拟实现

m0_70980326的博客 2646

手把手教你完成YOLOv11分类识别界面搭建,使用Qt6设计YOLOv11分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目结合YOLOv11分类识别算法和PySide6框架,开发了一套图形化分类识别系统。系统支持图片、视频和摄像头实时分类检测,并具备完善的用户管理功能,包括登录验证、个人信息修改等模块。最新版本新增了管理员后台管理系统,包含用户管理、权限控制等功能。系统采用MySQL数据库存储用户数据,界面设计采用QtDesigner完成,实现了高效的目标分类与友好的交互体验。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1051

配置适合Gurobi的机器硬件环境需要考虑的因素

介绍了在为gurobi选择合适的硬件环境时,需要考虑三个方面的因素;

Linshaodan520的博客 1064

C++入门篇之string类的底层原理和模拟实现

string类的模拟实现和string的底层原理

满天的博客 1593

嵌入式面经篇八——进程&线程

记录一些招聘公司在招聘嵌入式软件岗位时的一些问题,此文为第八篇。进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器中的值,进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。

明天你好的博客 1854

【C++】string的使用及其模拟实现

STL的简单介绍,string容器的简单使用及其模拟实现。

大三小白C++进阶之路 1755

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C++】STL简介 -- string 的使用及其模拟实现

STL简介、string 的基本使用、string 的模拟实现

在平淡的日子里寻找存在的价值 1596

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C++】STL_ string的使用 + 模拟实现

STL_ string的使用 + 模拟实现

weixin_42976474的博客 1282

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++面试题之数据结构和算法

目录 1、String原理及实现 2、链表的实现 2.1、顺序链表 2.2、链式表 2.3、双链表 2.4、循环链表 3、队列 3.1、顺序队列 3.2、链式队列 4、栈 4.1、顺序栈 4.2、链式栈 5、二叉树 5.1、二叉树的链式存储 5.2、哈夫曼树 6、查找算法 6.1、线性表查找(顺序查找、折半查找) 6.2、树表查找(二叉排序树、平衡二叉树、B-树...

找个特立不独行的名的博客 2万+

【C++之STL】一文学会使用 string

1. STL导读 1. 1 什么是STL 1. 2 STL的版本 1. 3 STL六大组件 1. 4 STL的重要性 1. 5 STL的学习 1. 6 STL系列博客的规划 2. string 2. 1 为什么学习string类? 2. 2 标准库中的string 2. 3 基本构造 2. 4 尾插与输出运算符重载 2. 5 构造函数 2. 6 赋值运算符重载 2. 7 容量操作 2. 8 元素访问 2. 9 迭代器 2. 10 修改 2. 11 字符串操作 2. 12 不在类中的函数重载 3. 尾声

fhvyxyci的博客 2504

【C++】简述STL——string类的使用

string类的使用

f_2789889770的博客 1440

C++STL之string类的使用和实现

文章目录STL简介什么是STLSTL的版本STL的六大组件STL的重要性string为什么学习string类?C语言中的字符串标准库中的string类string类string类对象的构造函数string类的成员函数的使用string类的模拟实现经典的string类问题浅拷贝深拷贝深拷贝和赋值的现代写法string类的模拟实现模拟实现string类的构造函数模拟实现string类的reserve模拟实现push_back模拟实现swap函数+=字符运算符重载:+=字符串运算符重载模拟实现resize获取_s

小赵小赵福星高照的博客 1818

【C++初阶】STL-string的使用

sting的基本使用

每天都要坚持刷题的博客 2345

c++-string

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本(1). 原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP 版本–所有STL实现版本的始祖。(2). P. J. 版本。

dong132697的博客 374

【C++进阶】深入STL之string:掌握高效字符串处理的关键

STL(Standard Template Library,标准模板库)是C++标准库的重要组成部分,它提供了一系列通用的数据结构和算法。在STL中,string类是一个非常重要的容器,用于处理字符串数据。本文将详细介绍STL中的string类,包括其基本概念、常用操作以及使用示例

EterNity_TiMe_的计算机学习之路 2294

C++初阶:初识STL、String类接口详细讲解(万字解析)

1.STL介绍1.1概念(标准模板库) 1.2版本问题(主流有4个) 1.3 STL六大组件 2.string类的基本介绍 3.string类对象的构造 4.访问及遍历操作 4.1operator[] ([]加下标) 4.2基于范围for 4.3使用迭代器(最推荐使用) 5.string的迭代器 (lterator) 5.1介绍 5.2 begin () 和end () (正向和常正向) 5.3rbegin () 和rend () (反向和常反向) 6.string类对象的容量操作 6.1sizeleng

qq_74415153的博客 1807

[C++] STL介绍及string的模拟实现

STL中string类的介绍与模拟实现,内容较长,请耐心点

zzg的学习博客 293
上一篇: 链队列介绍及其C++实现
下一篇: 数据结构--抽象数据类型(ADT)的表示与实现
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值