stl~string

迭代器

        typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const//左值const{return _str;}const_iterator end() const{return _str + _size;}

for(auto e : s)底层就是迭代器

[]运算符重载

		char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}

=运算符重载

		string& operator=(const string& str){//delete[]_str;if (this != &str){char* tmp = new char[str._size + 1];strcpy(tmp, str._str);delete[]_str;_str = tmp;_size = str._size;_capacity = str._capacity;}return *this;}

赋值运算符不写会自动生成,这三个放在一起,都是会默认生成,官方文档如下:

比较运算符重载

		bool operator>(const string& str) const{return strcmp(_str, str._str) > 0;}bool operator==(const string& str) const{return strcmp(_str, str._str) == 0;}bool operator>=(const string& str) const{return *this > str || *this == str;//左边的是非const右边的是const,写反就报错}

如果> 和 == 这俩函数的左操作数不是const ,那么>= 这里 *this和str有顺序

reserve

		void reserve(size_t n){if (n > _size)//防止缩容{char* tmp = new char[n + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;_capacity = n;}}

n>_size防止缩容,先开空间,再释放,再该指向,防止损坏扩容失败损坏_str里数据

push_back

		void push_back(char ch){if (_size + 1 > _capacity){reserve(_capacity * 2);//如果为0??}_str[_size] = ch;_size++;_str[_size] = '\0';}

默认构造里:_capacity = _size == 0 ? 4 : _size;就可以防止_capacity=0;

append

		void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;}

strcpy会把\0也拷贝过去,添值->_size肯定改变,strcpy(_str + _size, str); 前面的参数就是最后\0的位置

+=运算符重载

		string& operator+=(const char* str){append(str);return *this;}string& operator+=(const char ch){push_back(ch);return *this;}

复用

resize

		void resize(size_t n, char ch = '\0'){if (n <= _size){_str[n] = '\0';_size = n;}else{if (n > _capacity){reserve(n);}size_t i = _size;while (i < n){_str[i++] = ch;}_size = n;_str[n] = '\0';}}

n<_size直接\0截断,_size跟着改,

n==_size不走

n>_size,先判断是否扩容,再添加到个数n,_str[n]是第n+1个位置

insert

		string& insert(size_t pos, char ch)//库里有个n,三个参数{assert(pos <= _size);if (_size + 1 > _capacity){reserve(_capacity * 2);}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];end--;}_str[pos] = ch;_size++;return *this;}

同样的配方,先检查容量,再是插入,下面这个不行,end>=pos,若pos=0,end和是size_t,改end类型为int也不行,因为pos是size_t,pos也改就行,但是为了尽量和库里一致,上面的就可以在0>0停止(库里是n个char,有三个参数的)

            size_t end = _size;
            while (end >= pos)
            {
                _str[end + 1] = _str[end];
                end--;
            }

string& insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}size_t end = _size + len;while (end > pos + len - 1)//解释③{_str[end] = _str[end - len];end--;}strncpy(_str + pos, str, len);_size += len;return *this;}

 

用strncpy,用个数len防止拷贝到\0 

 erase

		string& erase(size_t pos, size_t len = npos){if (len == npos || pos + len >= _size)//越界{_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}return *this;}

swap

		void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}

比直接用swap(s1,s2)高效,这里是直接交换指向,不用拷贝构造

find

		size_t find(char ch, size_t pos = 0){assert(pos <= _size);for (size_t i = pos; i < _size; i++){if (_str[i] == ch)return i;}return -1;}size_t find(const char* str, size_t pos = 0){assert(pos <= _size);char* p = strstr(_str + pos, str);if (p){return p - _str;}else{return npos;}}

<<运算符重载

	ostream& operator<<(ostream& out, const string& s){for (auto e : s){out << e;}return out;}

>>运算符重载

	istream& operator >>(istream& in, string& s){s.clear();char ch = in.get();//get可以得到每一个字符包括空格和换行,in>>不行while (ch != ' ' && ch != '\0'){s += ch;ch = in.get();}return in;}

 get可以得到每一个字符包括空格和换行,in>>不行

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

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

相关文章

16.1 Spring框架_AOP面向切面编程(❤❤❤❤)

16.1 Spring框架_AOP面向切面编程 1. AOP介绍及相关概念名词1.1 需求分析1.2 简介2. AOP开发与配置流程2.1 入门实战_基于xml配置(❤❤)1. 依赖引入2. spring配置文件:基础格式3. 加载配置文件,启动Spring容器4. 定义切面:获取各层类信息5. 在applicationContext.xml配置切点和…

排序算法---计数排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 计数排序&#xff08;Counting Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;其核心思想是通过统计待排序元素的个数来确定元素的相对位置&#xff0c;从而实现排序。 具体的计数排序算法步骤如下&#xff…

政安晨:【示例演绎】【Python】【Numpy数据处理】快速入门(一)

简介 NumPy是SciPy家族的成员之一。 SciPy家族是一个专门应用于数学、科学和工程领域的开源Python生态圈&#xff0c;或者说是一个由多个Python库组成的集合&#xff0c;用于解决科学计算中的各种问题。这些库构成了一个功能强大的科学计算工具箱&#xff0c;可以进行数值计算…

QT+OSG/osgEarth编译之八十九:osgdb_ply+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ply)

文章目录 一、osgdb_ply介绍二、文件分析三、pro文件四、编译实践一、osgdb_ply介绍 斯坦福三角形格式(Stanford Triangle Format)是一种用于存储三维模型数据的文件格式,也称为 PLY 格式。它最初由斯坦福大学图形实验室开发,用于存储和共享三维扫描和计算机图形数据。 P…

活用 Composition API 核心函数,打造卓越应用(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

面试指导(面试会遇到的问题准备)

自我介绍 介绍项目流程 项目简介、用途项目架构、技术、模块、我负责的模块 开发过程中遇到的问题 效率问题、并发问题、JVM内存泄漏等问题接口修改文档不同步拖进度问题使用到了没使用过的技术浏览器 JDK linux等环境问题 你的优点是什么 能加班&#xff0c;能出差学习能…

简单试验:用Excel进行爬虫

文章目录 Excel的版本具体操作实例从网站上爬取工商银行的汇率Excel的版本 office 2016,2019,365这几个版本都可以 具体操作 #mermaid-svg-NlIVMivGoJbdyWW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NlIVMi…

Vue2学习第三天

Vue2 学习第三天 1. 计算属性 computed 计算属性实现 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来。 原理&#xff1a;底层借助了Objcet.defineproperty方法提供的getter和setter。 get函数什么时候执行&#xff1f; 初次读取时会执行一次。当依赖…

如何让Obsidian实现电脑端和安卓端同步

Obsidian是一款知名的笔记软件&#xff0c;支持Markdown语法&#xff0c;它允许用户在多个设备之间同步文件。要在安卓设备上实现同步&#xff0c;可以使用remote save插件&#xff0c;以下是具体操作步骤&#xff1a; 首先是安装电脑端的obsidian&#xff0c;然后依次下载obs…

Typora+PicGO+腾讯云COS做图床教程

文章目录 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床教程一、为什么使用图床二、Typora、PicGO和腾讯云COS介绍三、下载Typora和PicGOTyporaPicGO 四、配置Typora、PicGO和腾讯云COS腾讯云COS配置PicGO配置Typora配置 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做…

STM32入坑

目录 一、选择合适的开发板 二、安装和配置开发环境 三、学习基础知识 四、编写和调试程序 五、扩展功能和学习进阶知识 六、坚持&#xff0c;坚持&#xff0c;坚持 七、STM32的学习路径 一、选择合适的开发板 首先&#xff0c;你需要选择一款合适的STM32开发板。开发板…

mysql 执行update操作 记录未修改

问题 mysql 执行update操作 记录未修改 详细问题 笔者进行SpringBootMybatis项目开发&#xff0c;确认执行update操作 控制台内容如下 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3cbe9459] was not registered for sync…

基于STM32的老人心率监测系统

1. 系统设计 本次课题为基于STM32的老人心率监测系统&#xff0c;在此设计了如图2.1所示的系统结构框图&#xff0c;整个系统包括了MAX30102心率血氧检测模块&#xff0c;SIM800短信模块&#xff0c;液晶显示模块&#xff0c;按键&#xff0c;ESP8266无线通信模块以及主控制器s…

关于数据库

目录 一 什么是数据库&#xff08;DB) 二 什么是数据库管理系统(DBMS) 三 数据库的作用/好处 一 什么是数据库&#xff08;DB) 简单理解&#xff0c;数据库是存放数据的地方&#xff0c;就像冰箱是存放冷鲜食品的地方。 数据是数据存储的基本对象&#xff0c;而数据分为多…

mysql 查询性能优化关键点总结

MySQL查询性能优化是数据库管理的重要环节&#xff0c;良好的性能优化可以提高查询效率&#xff0c;降低系统负载。以下是一些关键点&#xff0c;用于优化MySQL查询性能&#xff1a; 1. 索引优化 索引是MySQL查询优化的重要手段&#xff0c;合理的索引可以大大…

【CV论文精读】【BEV感知】BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示

【CV论文精读】BEVFormer Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers BEVFormer&#xff1a;通过时空Transformer学习多摄像机图像的鸟瞰图表示 图1&#xff1a;我们提出了BEVFormer&#xff0c;这是一种自动驾驶的…

海纳思NAS盒子设置网卡静态IP

TV机顶盒刷了海纳思NAS系统之后&#xff0c;就可以跑路由了&#xff0c;系统默认得网卡是DHCP配置&#xff0c;它这个东西很麻烦&#xff0c;如果是物理硬件路由器&#xff0c;可以到后台去设置MAC跟IP地址相互绑定。 但如果是直接插在移动光猫上面&#xff0c;用户管理员是没…

js基础篇

javascript 1.1javascript是什么&#xff1f; 是运行在浏览器【客户端】的编程语言 1.2 js的组成 ECMAScript (基础语法) Web APIs (DOM BOM) 1.3 js的书写位置 内部&#xff0c;外部&#xff0c;行内 【代码写在标签内部】 // 内部 <script>alter("你好&…

软件实例分享,药店进销存软件医药系统进销存教程

软件实例分享&#xff0c;药店进销存软件医药系统进销存教程 一、前言 以下软件程序教程以 佳易王药店进销存管理系统V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 软件可以对药品的有效期进行管理&#xff0c;可以查询还有多少天到期的…

云计算基础-网络虚拟化

虚拟交换机 什么是虚拟交换机 虚拟交换机是一种运行在虚拟化环境中的网络设备&#xff0c;其运行在宿主机的内存中&#xff0c;通过软件方式在宿主机内部实现了部分物理交换机的功能&#xff0c;如 VLAN 划分、流量控制、QoS 支持和安全功能等网络管理特性 虚拟交换机在云平…