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.hqwc.cn/news/472420.html

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

相关文章

2024.2.16日总结(小程序开发8)

数据监听器 监听对象属性的变化 数据监听器支持监听对象中单个或多个属性的变化 纯数据字段 什么是纯数据字段 纯数据字段指的是哪些不用于页面渲染的data字段 应用场景:例如有些情况下&#xff0c;某些 data 中的字段既不会展示在界面上&#xff0c;也不会传递给其他组件…

[计算机提升] 备份系统:设置还原点

6.7 备份系统&#xff1a;设置还原点 在Windows系统中&#xff0c;系统还原点是指系统在特定时间存储的重要系统文件的备份。通过创建系统还原点&#xff0c;可以轻松地将系统恢复到之前创建还原点的状态。这有助于解决系统文件损坏或Windows操作系统出现问题的情况。 1、右键…

SpringBoot RabbitMQ收发消息、配置及原理

今天分析SpringBoot通过自动配置集成RabbitMQ的原理以及使用。 AMQP概念 RabbitMQ是基于AMQP协议的message broker&#xff0c;所以我们首先要对AMQP做一个简单的了解。 AMQP (Advanced Message Queuing Protocol) is a messaging protocol that enables conforming client a…

云计算基础-大页内存

大页内存功能概述 什么是大页内存 简单来说&#xff0c;就是通过增大操作系统页的大小来减小页表&#xff0c;从而避免快表缺失 主要应用场景 主要运用于内存密集型业务的虚拟机&#xff0c;比如对于运行数据库系统的虚拟机&#xff0c;采用HugePages(大页)后&#xff0c;可…

系统可靠性分析与设计

一、考点分析 可靠性相关基本概念&#xff08;※※&#xff09;系统可靠性分析&#xff08;※※※※&#xff09;软件可靠性设计&#xff08;※※※※&#xff09; 二、可靠性相关基本概念 可靠性&#xff1a;软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下…

【计算机网络】网际协议——互联网中的转发和编址

编址和转发是IP协议的重要组件 就像这个图所示&#xff0c;网络层有三个主要组件&#xff1a;IP协议&#xff0c;ICMP协议&#xff0c;路由选择协议IPV4 没有选项的时候是20字节 版本&#xff08;号&#xff09;&#xff1a;4比特&#xff1a;规定了IP协议是4还是6首部长度&am…

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…

Atcoder ABC339 E - Smooth Subsequence

Smooth Subsequence&#xff08;光滑的子序列&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【…

OpenAI Sora是世界模型?

初见Sora&#xff0c;我被OpenAI的野心震撼了。 他们不仅想教会AI理解视频&#xff0c;还要让它模拟整个物理世界&#xff01;这简直是通用人工智能的一大飞跃。 但当我深入了解后&#xff0c;我发现Sora比我想象的更复杂、更强大。 Sora不是简单的创意工具&#xff0c;而是…

循序渐进-讲解Markdown进阶(Mermaid绘图)-附使用案例

Markdown 进阶操作 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever Mermaid官网 由于CSDN对某些Mermaid或Markdown语法不支持&#xff0c;因此我的某些效果展示使用图片进行 下面的笔记内容全部是我根据Mermaid官方文档学习的&#xff0c;因为是初学者所以…

lazarus:LCL 嵌入 fpwebview 组件,做一个简单浏览器

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\lclembed 修改 lclembed.lpr 如下&#xff0c;将 fphttpapp. 注释掉&#xff0c;因为我用不上。 progr…

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅

这份技术报告主要关注两个方面&#xff1a;&#xff08;1&#xff09;我们的方法将各种类型的视觉数据转化为统一的表示形式&#xff0c;从而实现了大规模生成模型的训练&#xff1b;&#xff08;2&#xff09;对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…