string类

1.学习string类

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

2.标准库中的string类

string类的文档介绍

string是表示字符串的字符串类

3.string类的常用接口及模拟实现

3.1string类对象的常见构造

string(const char* str = ""): _capacity(strlen(str)), _size(_capacity)
{_str = new char[_capacity + 1];strcpy(_str, str);
}string(const string& str): _size(0), _capacity(0), _str(nullptr)
{string temp(str._str);swap(temp);
}//两种方法都可以
/*string(const string& str)
{_str = new char[str._capacity + 1];strcpy(_str, str._str);_size = str._size;_capacity = str._capacity;
}*/

3.2string类对象的容量操作

size_t size() const
{return _size;
}size_t length() const
{return _size;
}size_t capacity() const
{return _capacity;
}bool empty() const
{return _size == 0;
}void clear()
{_str[0] = '\0';_size = 0;
}void reserve(size_t n)
{if (n > _capacity){char* temp = new char[n + 1];strcpy(temp, _str);delete[] _str;_str = temp;_capacity = n;}
}void resize(size_t n, char c = '\0')
{if (n > _size){reserve(n);for (size_t i = _size; i < n; i++){_str[i] = c;}}_str[n] = '\0';_size = n;
}

 注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小

3.3string类对象的访问及遍历操作

char& operator[](size_t pos)
{assert(pos < _size);return _str[pos];
}const char& operator[](size_t pos) const
{assert(pos < _size);return _str[pos];
}//迭代器
iterator begin()
{return _str;
}iterator end()
{return _str + _size;
}const_iterator begin() const
{return _str;
}const_iterator end() const
{return _str + _size;
}

3.4string类对象的修改操作

void Push_back(char c)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = c;_str[_size] = '\0';
}void append(const char* str)
{size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size);}strcat(_str, str);_size += len;_str[_size] = '\0';
}string& operator+=(const char* str)
{append(str);return *this;
}string& operator+=(const char c)
{Push_back(c);return *this;
}const char* c_str() const 
{return _str;
}size_t find(char c, size_t pos = 0) const
{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == c){return i;}}return nops;
}size_t find(const char* s, size_t pos = 0) const
{assert(pos < _size);const char* p = strstr(_str + pos, s);if (p){return p - _str;}else{return nops;}
}string substr(size_t pos, size_t len = nops)
{assert(pos);string s;size_t end = pos + len;if (len == nops || len + pos >= _size){len = _size - pos;end = _size;}s.reserve(len);for (size_t i = pos; i < end; i++){s += _str[pos];}return s;
}

 

 4.string的模拟实现

namespace cola
{class string{public:typedef char* iterator;typedef const char* const_iterator;//默认成员函数string(const char* str = ""): _capacity(strlen(str)), _size(_capacity){_str = new char[_capacity + 1];strcpy(_str, str);}~string(){delete[] _str;_str = nullptr;_capacity = _size = 0;}string(const string& str): _size(0), _capacity(0), _str(nullptr){string temp(str._str);swap(temp);}string& operator=(string& temp){swap(temp);return *this;}/*string(const string& str){_str = new char[str._capacity + 1];strcpy(_str, str._str);_size = str._size;_capacity = str._capacity;}*/string& operator=(const string& str){if (*this == str){return *this;}char* temp = new char[str._capacity];strcpy(temp, str._str);delete[] _str;_str = temp;_size = str._size;_capacity = str._capacity;return *this;}//迭代器iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}//修改void reserve(size_t n){if (n > _capacity){char* temp = new char[n + 1];strcpy(temp, _str);delete[] _str;_str = temp;_capacity = n;}}void resize(size_t n, char c = '\0'){//扩容if (n > _size){reserve(n);for (size_t i = _size; i < n; i++){_str[i] = c;}}_str[n] = '\0';_size = n;}void Push_back(char c){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = c;_str[_size] = '\0';}void append(const char* str){size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size);}strcat(_str, str);_size += len;_str[_size] = '\0';}string& operator+=(const char* str){append(str);return *this;}string& operator+=(const char c){Push_back(c);return *this;}void clear(){_str[0] = '\0';_size = 0;}void swap(string& str){std::swap(_str, str._str);std::swap(_size, str._size);std::swap(_capacity, str._capacity);}bool empty() const{return _size == 0;}//返回私有成员size_t size() const{return _size;}size_t capacity() const{return _capacity;}const char* c_str() const {return _str;}char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}size_t find(char c, size_t pos = 0) const{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == c){return i;}}return nops;}size_t find(const char* s, size_t pos = 0) const{assert(pos < _size);const char* p = strstr(_str + pos, s);if (p){return p - _str;}else{return nops;}}string substr(size_t pos, size_t len = nops){assert(pos);string s;size_t end = pos + len;if (len == nops || len + pos >= _size){len = _size - pos;end = _size;}s.reserve(len);for (size_t i = pos; i < end; i++){s += _str[pos];}return s;}string& insert(size_t pos, char c){assert(pos < _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];--end;}_str[pos] = c;++_size;return *this;}string& insert(size_t pos, const char* str){assert(pos < _size);size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size);}size_t end = _size + len;while (end >= pos + len){_str[end] = _str[end - len];end--;}for (size_t i = pos; i < pos + len; i++){_str[i] = str[i - pos];}_size += len;return *this;}string& erase(size_t pos, size_t len = nops){assert(pos < _size);if (len == nops || len + _size > _capacity){_str[pos] = '\0';_size = pos;}else{size_t i = pos;while (i + len <= _size){_str[i] = _str[i + len];++i;}_size -= len;}return *this;}//比值bool operator==(const string& str) const{return strcmp(_str, str._str) == 0;}bool operator!=(const string& str) const{return !(*this == str);}bool operator>(const string& str) const{return strcmp(_str, str._str) > 0;}bool operator>=(const string& str) const{return *this == str && *this > str;}bool operator<(const string& str) const{return !(*this > str) && !(*this == str);}bool operator<=(const string& str) const{return !(*this > str);}private:char* _str;size_t _capacity;size_t _size;const static size_t nops;};const size_t string::nops = -1;ostream& operator<<(ostream& out, const string& s){out << s.c_str();return out;}istream& operator>>(istream& in, string& s){s.clear();char c;char buff[128];c = in.get();size_t i = 0;while (c != ' ' && c != '\n'){if (i == 127){buff[i] = '\0';s += buff;i = 0;}buff[i++] = c;c = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;}}

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

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

相关文章

Vue 引入阿里巴巴Iconfont图标库

vue2 Element ui 1、项目设置 2、文件下载到本地 压缩包里有些文件是没有用的&#xff0c;比如demo的文件可以直接删除。 3、src文件夹下&#xff0c;新建iconfont文件 4、main.js文件&#xff0c;引入iconfont.css 5、iconfont.css&#xff0c;引入对应的图标

KAFKA第二课之生产者(面试重点)

生产者学习 1.1 生产者消息发送流程 在消息发送的过程中&#xff0c;涉及到了两个线程——main线程和Sender线程。在main线程中创建了一个双端队列RecordAccumulator。main线程将消息发送给RecordAccumulator&#xff0c;Sender线程不断从RecordAccumulator中拉取消息发送到K…

Android学习之路(4) UI控件之输入框

本节引言&#xff1a; 在本节中&#xff0c;我们来学习第二个很常用的控件EditText(输入框)&#xff1b; 和TextView非常类似&#xff0c;最大的区别是&#xff1a;EditText可以接受用户输入&#xff01; 1.设置默认提示文本 如下图&#xff0c;相信你对于这种用户登录的界面并…

RocketMQ消费者可以手动消费但无法主动消费问题,或生成者发送超时

1.大多数是配置问题 修改rocketmq文件夹broker.conf 2.配置与集群IP或本地IPV4一样 重启 在RocketMQ独享实例中支持IPv4和IPv6双栈&#xff0c;主要是通过在网络层面上同时支持IPv4和IPv6协议栈来实现的。RocketMQ的Broker端、Namesrv端和客户端都需要支持IPv4和IPv6协议&…

Cookie、Session、Token的区别

有人或许还停留在它们只是验证身份信息的机制&#xff0c;但是它们之间的关系你真的弄懂了么&#xff1f; 发展史&#xff1a; Coolie: Netscape Communications 公司引入了 Cookie 概念&#xff0c;作为在客户端存储状态信息的一种方法。初始目的是为了解决 HTTP 的无状态性…

电脑剪辑用哪个软件比较好?电脑视频剪辑软件分享

在电脑上剪辑视频可以让您更容易地编辑和组织素材&#xff0c;以及添加音频、标题和其他效果。此外&#xff0c;电脑上的剪辑软件通常比手机上的应用程序更强大&#xff0c;使我们可以进行更精细的编辑&#xff0c;并获得更好的最终产品。那么电脑剪辑视频哪个软件比较好用呢&a…

Tomcat 部署优化

Tomcat Tomcat 开放源代码web应用服务器&#xff0c;是由java代码开发的 tomcat就是处理动态请求和基于java代码的页面开发 可以在html当中写入java代码&#xff0c;tomcat可以解析html页面当中的iava&#xff0c;执行动态请求 动态页面机制有问题&#xff1a;不对tomcat进行优…

Sentinel使用实例

不说了&#xff0c;直接上官方文档 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 项目说明 本项目演示如何使用 Sentinel starter 完成 Spring Clo…

vuejs 设计与实现 - 快速diff算法

Vue.js 2 所采用的双端 Diff 算法。既然快速 Diff 算法如此高效&#xff0c;我们有必要了解它的思路。接下来&#xff0c;我们就着重讨论快速 Diff 算法的实现原理。 相同的前置元素和后置元素 快速 Diff 算法借鉴了纯文本 Diff 算法中预处理的步骤。 案例&#xff1a; 旧的…

学习助手(安卓)

首先&#xff0c;这是一款人工智能的学习软件&#xff0c;功能非常的强大&#xff0c;进入软件就能看见多种功能&#xff0c;它可以根据大家提供的主题&#xff0c;环境&#xff0c;文体&#xff0c;语言等要求进行写作&#xff0c;还有诗歌创作&#xff0c;也可以帮我们进行内…

Unity3D高级编程:主程手记学习1

第一章 软件架构 Untiy 分层设计 分层后再分治

深度学习笔记(kaggle课程《Intro to Deep Learning》)

一、什么是深度学习&#xff1f; 深度学习是一种机器学习方法&#xff0c;通过构建和训练深层神经网络来处理和理解数据。它模仿人脑神经系统的工作方式&#xff0c;通过多层次的神经网络结构来学习和提取数据的特征。深度学习在图像识别、语音识别、自然语言处理等领域取得了…

[PyTorch][chapter 49][创建自己的数据集 1]

前言&#xff1a; 后面几章主要利用DataSet 创建自己的数据集&#xff0c;实现建模&#xff0c; 训练&#xff0c;迁移等功能。 目录: pokemon 数据集深度学习工程步骤 一 pokemon 数据集介绍 1.1 pokemon: 数据集地址&#xff1a; 百度网盘路径: https://pan.baidu.com/s/1…

【EI/SCOPUS检索】第三届计算机视觉、应用与算法国际学术会议(CVAA 2023)

第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023) The 3rd International Conference on Computer Vision, Application and Algorithm 2023年第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023&#xff09;主要围绕计算机视觉、计算机应用、计…

[PyTorch][chapter 50][创建自己的数据集 2]

前言&#xff1a; 这里主要针对图像数据进行预处理.定义了一个 class Pokemon(Dataset) 类&#xff0c;实现 图像数据集加载,划分的基本方法. 目录&#xff1a; 整体框架 __init__ load_images save_csv divide_data __len__ denormalize __g…

数据结构——堆

数据结构——堆 堆堆简介堆的分类 二叉堆过程插入操作 删除操作向下调整&#xff1a; 增加某个点的权值实现参考代码&#xff1a;建堆方法一&#xff1a;使用 decreasekey&#xff08;即&#xff0c;向上调整&#xff09;方法二&#xff1a;使用向下调整 应用对顶堆 其他&#…

dirsearch_暴力扫描网页结构

python3 dirsearch 暴力扫描网页结构&#xff08;包括网页中的目录和文件&#xff09; 下载地址&#xff1a;https://gitee.com/xiaozhu2022/dirsearch/repository/archive/master.zip 下载解压后&#xff0c;在dirsearch.py文件窗口&#xff0c;打开终端&#xff08;任务栏…

深入理解索引B+树的基本原理

目录 1. 引言 2. 为什么要使用索引&#xff1f; 3. 索引的概述 4. 索引的优点是什么&#xff1f; 4.1 降低数据库的IO成本&#xff0c;提高数据查找效率 4.2 保证数据库每一行数据的唯一性 4.3 加速表与表之间的连接 4.4 减少查询中分组与排序的执行时间 5. 索引的缺点…

[足式机器人]Part3机构运动微分几何学分析与综合Ch03-1 空间约束曲线与约束曲面微分几何学——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch01-4 平面运动微分几何学 3.1 空间曲线微分几何学概述3.1.1 矢量表示3.1.2 Frenet标架 连杆机构中的连杆与连架杆构成运动副&#xff0c;该运动副元素的特征点或特…

【Stable Diffusion】雨天、湿身

一、Models 1.1、Wet Clothes (Clothing Style) [LoHA] WECL SEE-THROUGH WET WET HAIR BIKINI OR SWIMSUIT UNDER CLOTHES NO BRA BRA VISIBLE THROUGH CLOTHES MISC SHIRTS MISC CLOTHES1.2、Rain 雨 Multiply Style rain style1.3、Wet T-Shirt LORA <lora:wetshirt:…