C++ string模拟实现(部分接口)

C++ string模拟实现

  • string模拟实现(部分接口)

C++的string类是一个类模板,用于表示和操作任何字符类型的字符串。 string类内部使用字符数组来存储字符,但是所有的内存管理,分配和空终止都由string类自己处理,所以使用起来很方便。string类的长度可以在运行时改变,因为它使用动态内存分配类似于vector。

string类提供了许多成员函数和运算符重载,用于进行字符串的创建,赋值,连接,比较,查找,替换,插入,删除等操作。你可以使用下标运算符[]或at()函数来访问字符串中的单个字符。你也可以使用c_str()或data()函数来获取字符串的C风格表示形式。

string模拟实现(部分接口)

官方C++string类:(string)

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;
#include <assert.h>namespace hsl
{class string{public:typedef char* iterator;//构造函数string(const char* str = ""):_size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];strcpy(_str, str);}//string(const string& s);//string& operator=(const string& s);//析构函数~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}//// iterator//返回第一个位置的指针iterator begin(){return _str;}//返回最后一个位置的指针iterator end(){return _str + _size;}/// modify//尾插字符void push_back(char c){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = c;_size++;_str[_size] = '\0';}//尾插字符string& operator+=(char c){push_back(c);return *this;}//尾插字符串void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;}//重载+=运算符(尾插字符串)string& operator+=(const char* str){append(str);return *this;}//void clear();//void swap(string& s);//以字符串的形式返回const char* c_str()const{return _str;}///返回数据个数size_t size()const{return _size;}//返回容量大小size_t capacity()const{return _capacity;}//判断是否为空bool empty()const{return (_size == 0 || _capacity == 0);}//如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出的元素(并销毁它们)。
//如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。如果指定了 //val,则新元素将初始化为 val 的副本,否则,它们将被值初始化。
//如果 n 也大于当前容器容量,则会自动重新分配分配的存储空间。void resize(size_t n, char c = '\0'){if (n < _size){_str[_size] = c;_size = n;}if (n > _size){if (n > _capacity){reserve(n);}int x = _size;_size = n;while (x < n){_str[x] = c;x++;}_str[n] = '\0';}}//扩容void reserve(size_t n){if (n > _capacity){char* ch = new char[n + 1];strcpy(ch, _str);delete[] _str;_str = ch;_capacity = n;}}///[]重载运算符char& operator[](size_t index){assert(index < _size);return _str[index];}//[]重载运算符(重载函数)const char& operator[](size_t index)const{assert(index < _size);return _str[index];}///relational operators//<重载运算符bool operator<(const string& s){return strcmp(_str, s._str) < 0;}//<=重载运算符bool operator<=(const string& s){return (_str < s._str) || (_str == s._str);}//>重载运算符bool operator>(const string& s){return !((_str <= s._str));}//>=重载运算符bool operator>=(const string& s){return !(_str < s._str);}//==重载运算符bool operator==(const string& s){return strcmp(_str, s._str) == 0;}//!=重载运算符bool operator!=(const string& s){return !(_str == s._str);}// 返回c在string中第一次出现的位置//size_t find(char c, size_t pos = 0) const;// 返回子串s在string中第一次出现的位置//size_t find(const char* s, size_t pos = 0) const;// 在pos位置上插入字符c/字符串str,并返回该字符的位置string& insert(size_t pos, char c){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}int end = (int)_size;while (end >= (int)pos){_str[end + 1] = _str[end];--end;}_str[pos] = c;_size++;return *this;}//在pos位置插入字符串string& insert(size_t pos, const char* str){assert(pos <= _size);int len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}int end = _size;while (end >= (int)pos){_str[end + len] = _str[end];--end;}_size += len;int n = pos + len;int i = 0;while (pos < n){_str[pos++] = str[i++];}return *this;}// 删除pos位置上的元素,并返回该元素的下一个位置string& erase(size_t pos, size_t len){assert(pos < _size);size_t end = _size;//assert((end - pos) >= len);if (pos + len >= _size){_str[pos] = '\0';_size = pos;}else{while (pos <= (end - len + 1)){_str[pos] = _str[pos + len];pos++;}_size -= len;}return *this;}//清空数据(不删除数据)void clear(){_str[0] = '\0';_size = 0;}//传统写法s1(s2)//string(const string& s)//{//	_str = new char[s._capacity + 1];//	strcpy(_str, s._str);//	_size = s._size;//	_capacity = s._capacity;//}s1 = s2;//string& operator=(const string& s)//{//	if (this != &s)//	{//		char* tmp = new char[s._capacity+1];//		strcpy(tmp, s._str);//		delete[] _str;//		_str = tmp;//		_size = s._size;//		_capacity = s._capacity;//	}//	return *this;//}	//交换void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}//s1(s2)//拷贝构造string(const string& s):_str(nullptr), _size(0), _capacity(0){string tmp(s._str);swap(tmp);}//s1 = s2;//赋值重载string& operator=(string s){swap(s);return *this;}private:char* _str;//字符指针size_t _size;//字符个数size_t _capacity;//容量};//输出流ostream& operator<<(ostream& _cout, const string& s){for (size_t i = 0; i < s.size(); i++){cout << s[i];}return _cout;}//istream& operator>>(istream& _cin, string& s)//{//	s.clear();//	char ch;//	ch = _cin.get();//	while (ch != ' ' && ch != '\n')//	{//		s += ch;//		ch = _cin.get();//	}//	return _cin;//}//输入流istream& operator>>(istream& _cin, string& s){s.clear();char ch;char buff[129];int i = 0;ch = _cin.get();while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 128){buff[i] = '\0';s += buff;i = 0;}ch = _cin.get();}if (i != 0){buff[i] = '\0';s += buff;}return _cin;}void test_string3(){string s1;cin >> s1;cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;}}int main()
{	hsl::test_string3();return 0;
}

(本章完)

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

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

相关文章

node.js

什么是Node.js Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序 概念: 使用Node.js编写后端程序 // 支持前端工程化 ​ 后端程序&#xff1a;提供接口和数据 &#xff0c;网页资源 ​ 前端工程化:对代码压缩&…

成员变量和局部变量的区别

局部变量成员变量 1、定义的位置不一样 在方法的内部&#xff0c;方法申明上&#xff08;形参&#xff09;。 声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 在方法的外部&#xff0c;直接写在类当中 &#xff08;类中方法外的变量&#xff09; 2、作用范…

《孤注一掷》现实版:29万打水漂,华为程序员也躲不过的诈骗!!!

明天周五&#xff0c;约吗&#xff1f; 不管怎样&#xff0c;反正播妞已经订好了《孤注一掷》的电影票。不为别的&#xff0c;《孤注一掷》太敢拍了&#xff01;&#xff01;&#xff01; 美女荷官在线发牌&#xff0c;高知程序员在线养“猪”&#xff0c;诈骗头目“虔诚”拜佛…

UGUI组件EventTrigger用法

一.Unity编辑器中EventTrigger组件用法 1.添加事件类型 2.绑定gameObject指定组件的方法 3.方法执行逻辑 public class NewBehaviourScript : MonoBehaviour {public void PointerDown(){Debug.Log("Trigger PointerDown");} } 4.按下鼠标&#xff0c;绑定方法成功…

杰发科技(合肥)2021笔试题

笔试时间:2020.10.17 ,10:30-12:00。 岗位:Linux 驱动工程师。 题型:选择题8道,填空题10道,编程题4道。 杰发科技主要做汽车电子,由北京四维图新控股,对汽车电子感兴趣的有机会可以应聘试试。 选择题 1、128,4 #include<stdio.h> unsigned int getstrsiz…

深度思考mysql面经

推荐 1 索引下推 Mysql性能优化&#xff1a;什么是索引下推&#xff1f; 1.1 定义 索引下推&#xff08;Index Condition Pushdown&#xff0c;简称 ICP&#xff09;是一种数据库优化技术。在传统的数据库查询中&#xff0c;数据库首先使用索引检索来找到符合索引条件的行&…

集成测试最全详解,看完必须懂了

目录 什么是集成测试 测试关注的重点 集成测试的三个级别 集成测试的模式 集成测试策略 自顶向下集成&#xff08;Top-Down Integration&#xff09; 三明治集成&#xff08;Sandwich Integration&#xff09; 基干集成&#xff08;Backbone Integration&#xff09; …

解决Windows:Call to undefined function exif_imagetype()

很明显,是php安装时没有打开某些扩展,以致不能执行exif_imagetype()这个方法,因此需要打开。 网上很多人说需要打开下面这两个扩展: extension=php_exif.dll extension=php_mbstring.dll 但只说对了一半,我一开始也按照网上文章说的打开这两个扩展,但是还是同样错误。…

23.8.8 杭电暑期多校7部分题解

1008 - H.HEX-A-GONE Trails 题目大意 有两个玩家和一棵树&#xff0c;初始状态玩家一和玩家二分别在两个点 x , y x,\space y x, y&#xff0c;每次操作可以走一个与当前点有连边并且双方都没走到过的点&#xff0c;问最后是谁赢 解题思路 因为不能走走过的点&#xff0c…

[Vulnhub] matrix-breakout-2-morpheus

目录 <1> 信息收集 <2> getshell <3> Privilege Escalation&#xff08;提权&#xff09; <1> 信息收集 nmap -sP 192.168.236.0/24 扫描一下靶机ip 靶机ip: 192.168.236.154 nmap -A -p 1-65535 192.168.236.154 扫描一下靶机开放哪些服务 开放…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

2023全新UI好看的社区源码下载/反编译版

2023全新UI好看的社区源码下载/反编译版 这次分享一个RuleAPP二开美化版&#xff08;尊重每个作者版权&#xff09;&#xff0c;无加密可反编译版本放压缩包了&#xff0c;自己弄吧&#xff01;&#xff01;&#xff01; RuleAPP本身就是一款免费开源强大的社区&#xff0c;基…

海外应用商店优化实用指南之元数据的迭代更新

随着每天都有新应用程序加入App Store和Google Play商店&#xff0c;许多应用程序都会针对与我们相同的关键词&#xff0c;虽然我们的元数据保持不变&#xff0c;但竞争对手的应用会重新编入索引&#xff0c;最终导致我们的关键词排名随着时间的推移稳步下降。 1、迭代的重要性…

C语言——九九乘法表

//九九乘法表 //用程序做一个九九乘法表 #include<stdio.h> int main() {int i,j,result;printf("\n");for(i1;i<10;i){for(j1;j<i;j){resulti*j;printf(" %d*%d%-d",i,j,result);}printf(" \n");}}

React Router@3.x 升级到 @6.x 的实战

一、概述 目前公司产品有关 react 的工具版本普遍较低,其中react router版本为 3.x(是的,没有看错,3.x 的版本,4年前的版本)。而最新的 react router 已经到了 6.x 版本。 为了能够跟上路由的脚步,也为了使用 router 相关的 hooks 函数,一次必不可少的升级由此到来!由于…

获取当前线程中的请求属性的静态方法

RequestContextHolder.getRequestAttributes() 是 Spring 框架中用于获取当前线程中的请求属性的静态方法。它通常在 Web 应用中使用&#xff0c;用于访问当前请求的上下文信息。在 Spring 的 Web 应用中&#xff0c;每个请求都会有一个对应的请求上下文&#xff0c;其中包含了…

【数据库】P0 创建数据库环境 MySQL + DataGrip

创建数据库环境 下载安装 MySQL下载安装 DataGrip 下载安装 MySQL Windows版本_MySQL 下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 下载后依照默认顺序安装即可&#xff0c;本博文将讲述简约安装步骤&#xff1b; 如需详细安装步骤可见&#xff1a;https:/…

4.1、Flink任务怎样读取集合中的数据

1、API说明 非并行数据源&#xff1a; def fromElements[T: TypeInformation](data: T*): DataStream[T] def fromCollection[T: TypeInformation](data: Seq[T]): DataStream[T] def fromCollection[T: TypeInformation] (data: Iterator[T]): Data…

【设计模式】观察者模式

什么是观察者模式&#xff1f; 观察者模式&#xff08;又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;属于行为型模式的一种&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态…

leetcode做题笔记64

给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路一&#xff1a;动态规划 int minPathSum(int** grid, int gridSize, int* gridColSi…