当前位置: 首页 > news >正文

C++STL简介(二)

目录

1.模拟实现string

1.string基本属性和大体框架

 2.基本函数

2.1size()

 2.2 []

2.3 begin() 和end()

 2.4capacity()

2.5  reserve

2.6push_back

2.7 append

2.8 +=

2.9insert

2.10find

2.11substr

2.12 =

2.12  <

2.13   >

2.14 <=

2.15 >=

2.16 ==

2.17 !=

2.19  <<

2.20  >>

3.完整代码

string.h

string.c


1.模拟实现string

1.string基本属性和大体框架

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <string>
#include<assert.h>
namespace String
{class string{public:
//默认构造string(const char* str=""){_size = strlen(str);//capacity不包含"\0"_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}
//析构函数~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}//基本变量private:char* _str;size_t _size;size_t _capacity;};

 2.基本函数

2.1size()

内容个数

//模拟size()size_t size(){return _size;}		
 2.2 []

访问元素

#//模拟[] 普通引用和const引用两个版本char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}
2.3 begin() 和end()

简单用typedef重定义char* 来模拟iterator获取begin()和end()

	 typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}
 2.4capacity()

获取容量

size_t capacity() const
{return _capacity;
}
2.5  reserve

调整空间

void string::reserve(size_t n)
{if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}
}
2.6push_back

尾插字符

void string::push_back(char ch)
{if (_size = _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = ch;_str[_size] = '\0';
}
2.7 append

尾插支付串

void  string::append(const char* str){size_t len = strlen(str);
//大于二倍就要多少开多少,低于二倍按二倍开if (_size + len > _capacity){reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);}strcpy(_str + _size, str);_size += len;}
2.8 +=
string& string::operator+=(char ch)
{push_back(ch);return *this;
}string& string::operator+=(const char* str)
{append(str);return *this;
}
2.9insert

在指定位置插入字符或字符串

void string::insert(size_t pos, char ch)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}assert(pos <= _size);size_t end = _size;while (end > pos){_str[end ] = _str[end-1];--end;}_str[pos] = ch;++_size;
}void string::insert(size_t pos, const char* s)
{assert(pos <= _size);size_t len = strlen(s);
if(len==0)
return;if (_size + len > _capacity){reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);}size_t end = _size + len;while (end > pos + len-1){_str[end - len] = _str[end];--end;}for (size_t i = 0; i < len; i++){_str[pos + i] = s[i];}_size += len;
}

2.10 erase

删除指定位置元素

void string::erase(size_t pos, size_t len)
{if (len >= _size - pos){_str[pos] = '\0';_size = pos;}else{for (size_t i = pos + len; i < _size; i++){_str[i - len] = _str[i];}_size -= len;}
}
2.10find

查找字符或字符串

size_t string::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 string::find(const char* str, size_t pos = 0)
{assert(pos < _size);const char* ptr = strstr(_str + pos, str);if (ptr == nullptr){return npos;}else {return ptr - _str;}
}
2.11substr

提取字符重新构建string类

//深拷贝
string(const string&s)
{_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;
}string string::substr(size_t pos, size_t len )
{assert(pos < _size);//len答疑剩余有效长度更新一下if (len > _size - len){len = _size - len;}string sub;sub.reserve(len);for (size_t i = 0; i < len; i++){sub += _str[pos + i];}return sub;
}
2.12 =
 //s2=s1string& operator=(const string& s){//避免s1=s1出现释放了_strif(this!=&s)delete[] _str;_str = new char[s._capacity];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;return *this;}
2.12  <
bool operator<(const string& s1, const string& s2)
{return strcmp(s1.Get_str(), s2.Get_str())<0;
}
2.13   >
bool operator>(const string& s1, const string& s2)
{return !(s1 <= s2);
}
2.14 <=
bool operator<=(const string& s1, const string& s2)
{return s1 < s2 || s1 == s2;}
2.15 >=
bool operator>=(const string& s1, const string& s2)
{return !( s1 < s2);
}
2.16 ==
bool operator==(const string& s1, const string& s2)
{return strcmp(s1.Get_str(), s2.Get_str()) ==0;
}
2.17 !=
bool operator!=(const string& s1, const string& s2)
{return !(s1 == s2);
}

2.18 clear

void clear()
{
_str[0]='\0';
_size=0;
}
2.19  <<
	ostream& operator<<(ostream& out, const string& s){for (auto ch : s){out << ch;}return out;}
2.20  >>
istream& operator >> (istream& in, string& s){char ch;ch = in.get();	while (ch != ' ' && ch != '\n'){s += ch;ch = in.get();}return in;}

3.完整代码

string.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <string>
#include<assert.h>
namespace String
{class string{public://s1(s)string(const string&s){_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}string(const char* str=""){_size = strlen(str);//capacity不包含"\0"_capacity = _size;_str = new char[_capacity + 1];//+1位置给'\0'strcpy(_str, str);}~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}//短小频繁,默认inline//获取_strchar* Get_str() const{return _str;}//模拟size()size_t size(){return _size;}//模拟实现capacity()size_t capacity() const{return _capacity;}//简单用typedef重定义char* 来模拟iterator获取begin()和end()typedef char* iterator;iterator begin() const{return _str;}iterator end() const{return _str + _size;}//模拟[] 普通引用和const引用两个版本char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}//s2=s1string& operator=(const string& s){//避免s1=s1出现释放了_strif (this != &s)delete[] _str;_str = new char[s._capacity];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;return *this;}void clear(){_str[0] = '\0';_size = 0;}void reserve(size_t n);void push_back(char ch);void append(const char* str);string& operator+=(char ch);string& operator+=(const char* str);void insert(size_t pos, char ch);void insert(size_t pos, const char* s);void erase(size_t pos, size_t len = npos);size_t find(char ch, size_t pos = 0);size_t find(const char* str, size_t pos = 0);string substr(size_t pos = 0, size_t len = npos);private:char* _str;size_t _size;size_t _capacity;static const size_t npos;};bool operator>(const string& s1, const string& s2);bool operator>=(const string& s1, const string& s2);bool operator<(const string& s1, const string& s2);bool operator<=(const string& s1, const string& s2);bool operator<=(const string& s1, const string& s2);bool operator==(const string& s1, const string& s2);bool operator!=(const string& s1, const string& s2);istream& operator>>(istream& out, const string& s);istream& operator<<(istream& in, string& s);
}
string.c

//text.cppusing namespace std;
#include"FileName.h"
namespace String
{const size_t string::npos = -1;void string::reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void string::push_back(char ch){if (_size = _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = ch;_str[_size] = '\0';}string& string::operator+=(char ch){push_back(ch);return *this;}void  string::append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);}strcpy(_str + _size, str);_size += len;}string& string::operator+=(const char* str){append(str);return *this;}void string::insert(size_t pos, char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}assert(pos <= _size);size_t end = _size;while (end > pos){_str[end ] = _str[end-1];--end;}_str[pos] = ch;++_size;}void string::insert(size_t pos, const char* s){assert(pos <= _size);size_t len = strlen(s);if (len == 0)return;if (_size + len > _capacity){reserve(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);}size_t end = _size + len;while (end > pos + len-1){_str[end - len] = _str[end];--end;}for (size_t i = 0; i < len; i++){_str[pos + i] = s[i];}_size += len;}void string::erase(size_t pos, size_t len){if (len >= _size - pos){_str[pos] = '\0';_size = pos;}else{for (size_t i = pos + len; i < _size; i++){_str[i - len] = _str[i];}_size -= len;}}size_t string::find(char ch, size_t pos ){for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t string::find(const char* str, size_t pos ){assert(pos < _size);const char* ptr = strstr(_str + pos, str);if (ptr == nullptr){return npos;}else {return ptr - _str;}}string string::substr(size_t pos, size_t len ){assert(pos < _size);//len答疑剩余有效长度更新一下if (len > _size - len){len = _size - len;}string sub;sub.reserve(len);for (size_t i = 0; i < len; i++){sub += _str[pos + i];}return sub;}bool operator<(const string& s1, const string& s2){return strcmp(s1.Get_str(), s2.Get_str())<0;}bool operator<=(const string& s1, const string& s2){return s1 < s2 || s1 == s2;}bool operator>(const string& s1, const string& s2){return !(s1 <= s2);}bool operator>=(const string& s1, const string& s2){return !( s1 < s2);}bool operator==(const string& s1, const string& s2){return strcmp(s1.Get_str(), s2.Get_str()) ==0;}bool operator!=(const string& s1, const string& s2){return !(s1 == s2);}ostream& operator<<(ostream& out, const string& s){for (auto ch : s){out << ch;}return out;}istream& operator >> (istream& in, string& s){s.clear();const int N = 256;char buff[N];int i = 0;char ch;//in >> ch ;ch = in.get();	while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == N - 1){buff[i] = '\0';s += buff;i = 0;}ch = in.get();}return in;}
}
int main()
{return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 面试重点---快速排序
  • 模块与组件、模块化与组件化的理解
  • 可消费的媒体类型和可生成的媒体类型
  • 数据结构——单链表OJ题(上)
  • 玄机-第一章 应急响应-webshell查杀
  • 数据库之数据表基本操作
  • Prometheus监控ZooKeeper
  • Matlab arrayfun 与 bsxfun——提高编程效率的利器!
  • exuberant ctags 支持 typescript 解析
  • 自动驾驶-机器人-slam-定位面经和面试知识系列05之常考公式推导(02)
  • 什么是埋点?前端如何埋点?
  • 速盾:分享一些防御 DDoS 攻击的措施
  • 爬虫 APP 逆向 ---> 粉笔考研
  • 请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理
  • Profinet从站转TCP/IP协议转化网关(功能与配置)
  • ES6指北【2】—— 箭头函数
  • @jsonView过滤属性
  • CSS魔法堂:Absolute Positioning就这个样
  • ECS应用管理最佳实践
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Nodejs和JavaWeb协助开发
  • Python打包系统简单入门
  • 创建一种深思熟虑的文化
  • 从0实现一个tiny react(三)生命周期
  • 第十八天-企业应用架构模式-基本模式
  • 构建二叉树进行数值数组的去重及优化
  • 构造函数(constructor)与原型链(prototype)关系
  • 简析gRPC client 连接管理
  • 如何在 Tornado 中实现 Middleware
  • 什么是Javascript函数节流?
  • 使用 Docker 部署 Spring Boot项目
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 整理一些计算机基础知识!
  • # 数据结构
  • #Java第九次作业--输入输出流和文件操作
  • #宝哥教你#查看jquery绑定的事件函数
  • #数学建模# 线性规划问题的Matlab求解
  • #微信小程序:微信小程序常见的配置传旨
  • $(function(){})与(function($){....})(jQuery)的区别
  • (20050108)又读《平凡的世界》
  • (39)STM32——FLASH闪存
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (LeetCode) T14. Longest Common Prefix
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (算法)前K大的和
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .DFS.
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET C# 操作Neo4j图数据库
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存