C++ string的实现

《C++ string 完全指南:string的模拟实现》 本文中作者讲述了string的模拟实现以各个接口的细节与图解!让你更清晰地感受STL的魅力 阅读详情

自己实现了下c++ string 下面是源码,先做好备份,哈哈(源码下载:https://code.youkuaiyun.com/snippets/652446)

MyString.h文件

#pragma once
#include <iostream>

class MyString
{
public:
	MyString();
	~MyString();
	MyString(const MyString& str);
	MyString(char* data);

	MyString& operator=(const MyString& str);
	MyString operator+(const MyString& str);//这里返回值不能是引用,因为返回的是局部变量,在函数结束后回释放掉,其引用的对象就会指向不确定内存(如果返回非引用值,系统会在函数结束后创建一个临时变量并赋值返回值提供给被调用函数),与拷贝构造函数不同,其返回的是类指针(this)的引用,函数结束后不会释放
	bool operator==(const MyString& str);
	char operator[](const unsigned int index);

	friend std::ostream& operator<<(std::ostream& output,const MyString& str);
	friend std::istream& operator>>(std::istream& in,MyString& str);//

	MyString subString(const int start, const int end);
	int find(const char c);
	int findSubStr(const MyString& substr);

	int lenght();
private:
	char* m_data;

};


MyString.cpp文件

#include "MyString.h"
//#include <stdlib.h>
#include "Sunday.h"

#pragma warning(disable:4996)

//以下为构造函数
MyString::MyString()
{
	m_data = new char[1];
	*m_data = '\0';
}

MyString::~MyString()
{
	if (m_data != NULL)
	{
		delete[] m_data;
	}
}
MyString::MyString(const MyString& str)
{
	if (str.m_data == NULL)
	{
		m_data = new char[1];
		*m_data = '\0';
	}
	else
	{
		m_data = new char[strlen(str.m_data) + 1];
		strcpy(m_data, str.m_data);
	}
}

MyString::MyString(char* data)
{
	if (data == NULL)
	{
		m_data = new char[1];
		*m_data = '\0';
	}
	else
	{
		m_data = new char[strlen(data) + 1];
		strcpy(m_data,data);
	}
}

//=操作符重写
MyString& MyString::operator=(const MyString& str)
{
	if (this != &str)
	{
		delete[] m_data;
		m_data = new char[strlen(str.m_data) + 1];
		strcpy(m_data,str.m_data);
	}
	return *this;
}

//+操作符重写  注意:此处不能返回引用
MyString MyString::operator+(const MyString& str)
{
	MyString newString;
	
	if (!str.m_data)
	{
		newString = *this;
	}
	else if (!m_data)
	{
		newString = str;
	}
	else
	{
		newString = new char[strlen(m_data)+strlen(str.m_data)+1];
		strcpy(newString.m_data,m_data);
		strcat(newString.m_data, str.m_data);
	}

	return newString;
}

//==操作符重写
bool MyString::operator==(const MyString& str)
{
	if (strlen(str.m_data) != strlen(m_data))
	{
		return false;
	}
	else
	{
		for (int i = 0; i < strlen(m_data); ++i)
		{
			if (str.m_data[i] != m_data[i])return false;
		}
	}
	return true;
}

//下标操作符重载写
char MyString::operator[](const unsigned int index)
{
	return m_data[index];
}

//计算字符长度函数
int MyString::lenght()
{
	//return strlen(m_data)	;//此方法也行
	int length=0;
	for (; m_data[length] != '\0'; ++length);
	return length;
}

//输出流重写
std::ostream& operator<<(std::ostream& output, const MyString& str)
{
	return output << str.m_data;
}
//输入流重写
std::istream& operator>>(std::istream& in, MyString& str)
{
	char buff[1024];//缓冲区
	in >> buff;
	if (strcmp(buff, str.m_data) != 0)
	{
		delete[] str.m_data;//删除后str.m_data的地址不变,反而不删除地址变了,这里是内存分配的使用,局部变量存放到内存栈中,
							//删除一个变量后,其地址会被下一个变量地址覆盖
		str.m_data = new char[strlen(buff) + 1];
		strcpy(str.m_data, buff);
	}
	return in;
}

MyString MyString::subString(const int start, const int end)
{
	int sta = 0, en = 0;
	start < end ? (sta = start, en = end) : (sta = end, en = start);
	MyString substr;
	substr.m_data = new char[en-sta+2];
	int i = 0;
	for (; sta!= en+1; ++sta, ++i)
	{
		substr.m_data[i] = m_data[sta];
	}
	substr.m_data[i] = '\0';

	return substr;
}

int MyString::find(const char c)
{
	int index = -1;//不存在c则返回-1
	for (int i = 0; i < strlen(m_data); ++i)
	{
		if (m_data[i] == c)
		{
			index = i;
			break;
		}
	}
	return index;
}


int MyString::findSubStr(const MyString& substr)
{
	Sunday match;//此处采用sunday 算法来进行模式匹配
	return match.find(m_data,substr.m_data);
}



Sunday算法实现,写在一个类中

/*
@参考sunday算法:http://www.cnblogs.com/huhu0013/p/3227838.html
@
*/
#pragma once
#include<iostream>
class Sunday
{
public:
	Sunday();
	~Sunday();
public:
	int find(const char* pattern, const char* text);

private:
	void preCompute(const char* pattern);

private:
	//Let's assume all characters are all ASCII
	static const int ASSIZE = 128;
	int _td[ASSIZE];
	int _patLength;
	int _textLength;
};

#include "Sunday.h"
#pragma waring(disable:4996)

Sunday::Sunday()
{
}

Sunday::~Sunday()
{
}

void Sunday::preCompute(const char* pattern)
{
	for (int i = 0; i < ASSIZE; i++)
		_td[i] = _patLength + 1;

	const char* p;
	for (p = pattern; *p; p++)
		_td[*p] = _patLength - (p - pattern);
}

int Sunday::find(const char* text,const char* pattern)
{
	_patLength = strlen(pattern);
	_textLength = strlen(text);

	if (_patLength <= 0 || _textLength <= 0)
		return -1;

	preCompute(pattern);

	const char *t, *p, *tx = text;

	while (tx + _patLength <= text + _textLength)
	{
		for (p = pattern, t = tx; *p; ++p, ++t)
		{
			if (*p != *t)
				break;
		}
		if (*p == 0)
			return tx - text;
		tx += _td[tx[_patLength]];
	}
	return -1;
}

最后是main函数:(自己可以添加)

#include <iostream>
#include "MyString.h"
using namespace std;

int main()
{
	MyString str("abcdEFg");

	MyString str1;
	MyString str2("EF");
	MyString str3 = str.subString(1, 3);

	MyString str4 = str3 + str2;
	cout << str3 << endl;
	cout << str4 << endl;
	cout << str4.find('p') << endl;

	cout << str.findSubStr("EF") << endl;
	return 1;
}




c++string函数源码 c++string函数源码 无修改 立即下载

相关推荐

MODIS 遥感数据批量下载(使用Cygwin)

MODIS 遥感数据批量下载(使用Cygwin)包含Cygwin的下载教程

weixin_45913084的博客 916

string的empty和size操作

empty函数根据sring对象是否为空返回一个对应的布尔值。size函数返回string对象的长度。

2302_80472547的博客 471

Android 13 录音APK在后台无数据的处理

未获取到录音数据

chenchen4310的博客 1183

c++ string 释放_源码分析C++的string实现

我们平时使用C++开发过程中或多或少都会使用std::string,但您了解string具体是如何实现的吗,这里程序喵给大家从源码角度分析一下。读完本文相信您可以回答以下问题:string的常见的实现方式有几种?string类的内部结构是什么样子?string内部使用的内存是如何分配管理的?string是如何拷贝构造,如何析构的,有引用计数的概念吗?string的data()和c_str()函数有...

weixin_39906906的博客 943

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4760

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4195

【C#】String.empty与““的区别以及与null的区别

【C#】String.empty与""的区别以及与null的区别 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、String.empty到底是什么?二、String.empty不分配存储空间纯属扯淡1.概念性2.相同之处3.不同之处三、string.Empty与null的区别 总结 前言 敲黑板的知识点:引用类型是将对象是实际数据保存在堆上, 将对象在堆上的地址保存在栈上。 提示:以下是本篇文章正文内容,下面案例可供参考 一、String.empty到底是什么?

weixin_yuanweiyaonie的博客 5281

自动驾驶大模型---小鹏汽车VLA大模型

随着自动驾驶技术的进步,小鹏汽车正通过云端大模型蒸馏技术,将72B参数的VLA大模型轻量化后部署到车端,以提升自动驾驶系统的智能和安全性。这种技术路线不仅解决了“模态不统一”的问题,还通过强化学习增强了模型的表现。

智能汽车人的博客 2235

【转载】C#中可使用string.Empty代表空字符

在C#中,如果赋值一个字符串为空白字符串,我们一般会用“”的形式对字符串进行赋值操作,其实在C#的字符串类String类中,有个专门的常量string.Empty来代表空字符串,可直接在赋值的时候使用这个常量即可,跟你写“”赋值的效果是一样的。 例如,我们要对字符串strA赋值空字符可使用下列方法: string strA=""; string strA=string.Empty; 上述2...

weixin_30216561的博客 430

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

国科大学习资料--数据挖掘(刘莹)--第三章习题及参考答案

国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 第 3 章分类与回归 3.1简述决策树分类的主要步骤。 答:决策树生成的过程如下: (1)对数据源进行数据预处理, 得到训练集和测试集; (2)对训练集进行训练; (3)对初始决策树进行树剪枝; (4)由所得到的决策树提取分类规则; (5)使用测试数据集进行预测,评估决策树模型; 3.2给定决策树,选项有:(1)将决策树转换成规则,然后对结果

无名何许人的博客 3092

C++中简单自己实现一个string类

工具VS2017 MyString.h #pragma once #include<iostream> using namespace std; class MyString { friend ostream & operator<<(ostream &os, const MyString& s); friend istream & ...

Dxs4396的博客 4274

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【C++札记】实现C++的string类

C++有了string类使得操作字符串变得很方便。有关string类,面试过程中也经常问到的就是自己实现一个sring类。下边实现个String类供大家参考: String.h #pragma once class String { public: //构造函数 String(const char* str = nullptr); //拷贝构造函数 String(const St...

码农code之路 325

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

CPP简单实现string类

摘要:本文展示了一个自定义字符串类string的实现,包含构造函数、拷贝构造、析构函数等基本功能,以及字符串操作(append、push_back、insert、erase等)、查找(find)和子串(substr)等功能。类中通过动态内存管理存储字符串数据,并实现了迭代器支持和运算符重载(如[]、+=、<等),是一个完整的字符串类实现示例。

weixin_39559852的博客 259

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++】模拟实现string类

使用C++语言模拟实现C++中的string类,包括string类中的成员变量,默认成员函数,成员函数,运算符重载以及迭代器. 是适合C++初学者的入门模拟实现string逐步详解.

C/C++领域,数据结构,linux,MySQl学习者 1734

【C++】string类中常用函数的模拟实现

【C++】string类中常用函数的模拟实现

2303_80737493的博客 2423

C++初阶——简单实现string

简单实现std::string类及一些常用的成员函数。迭代器,使用指针简单代替。

博客 | 复习知识点 + 练习 + 最终的领悟 | 全力以赴 445

C++初阶-string类的模拟实现

若写成两个构造函数,一个设置成无参,一个设置成带参,若调用如上的带参构造函数就会报错,将str传给_str,属于权限放大,为了解决这个问题,可以将_str改为const char*类型,但是无法修改_str所指向的内容,调用operator[]函数就会报错。为了避免频繁扩容,使用一个128的字符数组接收,若输入的数据比128小,跳出循环将数组中的数据传给string类s,若输入的数据比128大,则将字符数组整体传给string类s,再正常扩容。

sushang的博客 1330

c++初阶--string类的实现

大家好,今天我们来实现一下string类,只给出代码,就不进行讲解了。string.cpp文件。string.h文件。test.cpp文件。

2302_79606537的博客 228

【C++】string的模拟实现

因为在自己写string类的时候没有涉及到模板,所以就分成两个文件去实现。(由于太多,这里只挑选常用的接口)

HEBRE的博客 494

【C++初阶】学习string类的模拟实现

前面已经学习了string类的用法,这篇文章将更深入的学习string类,了解string类的底层是怎么实现的。当然,这里只是模拟一些常用的,不常用的可以看文档学习。

2301_77459845的博客 2764

【C++】—— string 模拟实现

【C++】—— string 模拟实现

yusjushd的博客 1779

【C++】——string的模拟实现

在这里即一个一个字节的拷贝,动态申请资源时候如果浅拷贝会指向同一块资源,会有着程序崩溃的问题同一块空间析构了两次 程序崩溃深拷贝即调用拷贝构造,编译器生成的拷贝构造是浅拷贝,需要我们自己显示实现拷贝构造来进行深拷贝。

2402_82668782的博客 1526

【C++】string类的模拟实现

💗💗⭐个人专栏——⭐💫点击关注🤩一起学习C语言💯💫。

qq_64818885的博客 1188

cpp实战项目—string类的模拟实现

string类的模拟实现,带你了解string类的底层是如何实现的

2302_80295520的博客 423
上一篇: 青蛙跳台阶(2XN骨牌问题)
下一篇: Sunday算法
fiempty
博客等级 码龄15年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值