C++系列-String(四)String初步的模拟实现

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”   

 下面的这些是我们这篇文章将要实现的String的功能:

#pragma once
#include<iostream>
#include<assert.h>
using namespace std;

namespace bit
{
	class string
	{
	public:
		typedef char* iterator;
		iterator begin();
		iterator end();

		string(const char* str = "");
		~string();
		const char* c_str() const;
		size_t size() const;
		char& operator[](size_t pos);
	private:
		char* _str;
		size_t size;
		size_t _capacity;
	};
}

在这些功能当中

string(const char* str = "");

这样子写的目的主要是兼顾空的字符串,加入了缺省值,若是传入的字符串为空时候,会自动复制为“\0”

const char* c_str() const;
		size_t size() const;

在这两行代码中,加入const主要是保证不管传入的size string是否可修改,都可以调用这两个函数。

上面的这些代码我们放到头文件当中。

而在.cpp文件中,我们用来实现这些功能。

#include"String.h"

在.cpp文件的开头我们引入头文件,有同学可能会好奇会不会和C++库当中的String.h文件发生冲突,但结果是不会的,因为编译器会现在当前目录进行查找,而当前目录就已经存在了这个文件。

#define _CRT_SECURE_NO_WARNINGS
#include"String.h"
namespace bit
{
	string::iterator string::begin()
	{
		return _str;
	}
	string::iterator string::end()
	{
		return _str + _size;
	}

	string::string(const char* str)
		:_size(strlen(str))
	{
		_str = new char[_size + 1];
		_capacity = _size;
		strcpy(_str, str);
	}
	string::~string()
	{
		delete[] _str;
		_str = nullptr;
		_size = _capacity = 0;
	}
	const char* string::c_str() const
	{
		return _str;
	}
	size_t string::size() const
	{
		return _size;
	}
	char& string::operator[](size_t pos)
	{
		assert(pos < _size);
		return _str[pos];
	}

}

这个便是基础的String的代码实现。

下面是针对这个String的测试文件

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"String.h"
namespace bit
{
	void test_string1()
	{
		bit::string s1("hello world");
		cout << s1.c_str() << endl;
		for (size_t i = 0; i < s1.size(); i++)
		{
			s1[i]++;
		}
		for (size_t i = 0; i < s1.size(); i++)
		{
			cout << s1[i] << " ";
		}
		cout << endl;
		string::iterator it1 = s1.begin();
		while (it1 != s1.end())
		{
			cout << *it1 << " ";
			++it1;
		}
		cout << endl;
		for (auto e : s1)
		{
			cout << e << " ";
		}
		cout << endl;
		bit::string s2;
		cout << s2.c_str() << endl;
	}
}
int main()
{
	bit::test_string1();

	return 0;
}

其实对于范围for而言,它的底层是迭代器,而迭代器,主要就是一个封装,底层的不同的类型都用iterator进行了重命名,搭建起来统一的上层建筑。

所以,只要搭建了基本的迭代器,范围for就可以使用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载程序到仿真

第一步&#xff0c;新建工程 第二步&#xff0c;设备组态 第三步&#xff0c;地址分配 需要注意的是&#xff0c;分配地址的范围&#xff0c;是CPU决定的。 关于常见数据类型 下载与仿真 一般安装好博图会自带。 PLCSIM/PLCSIM Advanced PLCSIM普通仿真 PLCSIM Advanced高级…

Spark 分布式弹性计算集(RDD)相关概念介绍

目录 一、概述 二、RDD的核心概念 2.1 Partition 2.2 Partitioner 2.3 RDD的依赖关系 2.4 Stage 2.5 PreferredLocation 2.6 CheckPoint 三、RDD的持久化 3.1 概述 3.2 概念 3.3 RDD持久化级别 3.3.1 MEMORY_ONLY 3.3.2 MEMORY_AND_DISK 3.3.3 MEMORY_ONLY_SER …

昇思第18天打卡|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里&#xff0c;使用命令行下修改IP地址&#xff0c;网上有很多方案&#xff0c;我最终觉得这个方案&#xff08;使用Netplan&#xff09;最好&#xff0c;最根本&#xff0c;记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

「Java开发指南」如何用MyEclipse完成Spring Web Flow 2.0搭建?

本教程将引导您完成Spring Web Flow的软件组件生成&#xff0c;这是Spring的一个项目&#xff0c;用于简化Web应用程序的开发。虽然Spring Web Flow与Spring MVC兼容&#xff0c;但Spring Web Flow使用流而不是控制器来实现应用程序的Web层。在本教程中&#xff0c;您将学习如何…

放大镜案例

放大镜 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>商品放大镜</title><link rel&qu…

可控硅整流自动恒流充电器设计制作

该充电器除可为各种镍镉电池充电外&#xff0c;也可为干电池充电。其充电电流可调。充电终止电压由RP1预先确定。 工作原理 电路原理见图1。开始充电时&#xff0c;电池组两端电压较低&#xff0c;不足以使晶体管VT导通。由RC组成的移相电路给可控硅提供触发电流。移相角度由R…

Java技术栈总结:Spring框架篇

一、SpringBean 1、定义方式 </bean>标签&#xff08;XML文件&#xff09;Bean注解Component注解BeanDefinition方法FactoryBeanSupplier 注&#xff1a;BeanDefinition方法为“</bean>标签、Bean注解、Component注解”的底层实现。 &#xff08;1&#xff09;…

【K8s】专题六(5):Kubernetes 稳定性之重启策略、滚动更新策略

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、重启策略 1、基本介绍 2、资源清单&#xff08;示例&#xff09; 二、滚动更新策略 …

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

Zabbix自动发现

目录 自动发现的主要特点包括&#xff1a; 如何配置自动发现&#xff1a; 实验步骤 1. 创建自动发现规则 2. 给自动发现规则创建动作 3. 给新主机安装agent 在 Zabbix 中&#xff0c;自动发现&#xff08;Auto Discovery&#xff09;是一种强大的功能&#xff0c;用于自…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计&#xff0c;支持移动端适配,不仅功能强大&#xff0c;颜值也是超一流&#xff01; Vue-…

读书记录《SQL从小白到大牛》01

读书记录《SQL从小白到大牛》01 接地气的书名&#xff0c;内容应当值得一读。 第一篇 SQL基础 01 一些基础概念 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用来输入、更改和查看关系数据库内容的命令。数据库发展经历三个阶…

ROS-机械臂-基础概念

课纲 话题通信模型&#xff08;多对多&#xff09; RPC RPC&#xff0c;全称为 Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种通信协议&#xff0c;允许一个计算机程序在另一个网络上的计算机上执行一组函数或过程&#xff0c;而不需程序员显式编码网络…

SketchUp如何阵列?

sketchup如何阵列&#xff1f;请看下面方法。 方法 打开SketchUp。 以默认人物为例。 按M&#xff0c;选中人物&#xff0c;再按住Ctrl移动鼠标&#xff08;不要点击鼠标键&#xff09; 按键盘数字键输入距离&#xff0c;按回车&#xff0c;不要动鼠标。 按*10设置阵列数。 按…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器&#xff0c;监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

MySQL篇四:表的约束

文章目录 前言1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。…

香橙派编译linux内核支持ebpf和虚拟WIFI

前言 上一篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)中说了怎么运行redroid&#xff0c;这篇补一下怎么修改参数编译内核。 补充 上篇文章有个内容需要补充一下&#xff1a;更新完内核需要用下面的命令防止内核被apt更新&#xff0c;不然后面使用apt update又回…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类&#xff0c;可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止&#xff0c;大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器&#xff0c;input 元素被统一…