【C++】学习笔记——string_2

文章目录

  • 六、string类
    • 2. 反向迭代器
      • const迭代器
    • string类对象的容量操作(补)
      • size()
    • 3. string类的元素访问
    • 4. string类的修改
  • 未完待续


结合文档食用~

六、string类

2. 反向迭代器

一般来说,迭代器都是正向的遍历容器,虽然可以通过从 end ** 遍历到 begin 的方法来反向遍历容器,但是有这样一种迭代器,叫做反向迭代器**,可以做到反向遍历容器。

#include<iostream>
#include<string>
using namespace std;void test1()
{string s1("hello,world");// 反向迭代器 -- reverse_iteratorstring::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << ' ';++rit;}cout << endl;
}int main()
{test1();return 0;
}

在这里插入图片描述
在这里插入图片描述
反向迭代器就是反方向跑,每次+1其实都是往左跑。

const迭代器

当构造时使用 const 修饰,普通的迭代器就不能够使用了。

void test2()
{const string s1("hello,world");// 这里会出现报错string::iterator it = s1.begin();while (it != s1.end()){cout << *it << ' ';++it;}cout << endl;
}

此时由于类型不匹配,我们需要调整迭代器。
在这里插入图片描述

使用 const_iterator 就可以了。那么普通迭代器和 const迭代器 有什么区别呢?其实知道const就知道了,普通迭代器对容器是可读可写的,const迭代器就只可读

string类对象的容量操作(补)

在这里插入图片描述

size()

#include<iostream>
#include<string>
using namespace std;void test3()
{string s1("hello,world");cout << s1 << endl;cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.capacity() << endl;cout << s1.max_size() << endl;
}int main()
{test3();return 0;
}

size() 函数返回string类中的元素个数。
length() 函数和 size() 函数作用一样,返回元素个数。
capacity() 函数返回容器的当前容量,即分配的空间,size() 是使用的空间。
max_size() 函数不常用,返回这个容器能够存储的最大长度,跟编译器有关,输出结果不唯一。
在这里插入图片描述
既然知道了 capacity ,我们来看一看VS环境下的C++扩容机制吧。

#include<iostream>
#include<string>
using namespace std;void test4()
{string s;// 初始容量int sz = s.capacity();cout << sz << endl;// 循环插入数据for (int i = 0; i < 100; ++i){s.push_back('a');// 容量有变化时if (sz != s.capacity()){sz = s.capacity();// 输出新的容量cout << "capacity changed:" << sz << endl;}}
}int main()
{test4();return 0;
}

在这里插入图片描述
也不需要让大家找什么规律,我直接说了:①capacity 求的是不包含字符串末尾的 ‘\0’ 的空间,初始实际上是分配了 16 的空间大小,可用空间只有 15 个数据长度。②第一次扩容是 2倍扩容。③剩下的扩容都是 1.5倍扩容。在其他环境下不一定是这种扩容机制哦。

#include<iostream>
#include<string>
using namespace std;void test5()
{string s("hello,world!!!!!!!!!!!!!!!!!!!!!!");cout << s << endl;cout << s.capacity() << endl;cout << s.empty() << endl;s.clear();cout << s << endl;cout << s.empty() << endl;cout << s.capacity() << endl;}int main()
{test5();return 0;
}

在这里插入图片描述

empty() 函数翻译过来就知道功能就是判断容器是否为空,为空返回true,非空返回false
clear() 函数就是清理的意思,它会将容易里的数据都清除。但是,我们发现,capacity() 并没有相应的减少,说明 clear 只清理了数据,并没有释放空间。那我们想要释放空间该怎么办?
在这里插入图片描述
string 提供了这样一个函数,作用是将 capacity 缩小到 size 大小。

#include<iostream>
#include<string>
using namespace std;void test5()
{string s("hello,world!!!!!!!!!!!!!!!!!!!!!!");cout << s << endl;cout << s.capacity() << endl;cout << s.empty() << endl;s.clear();cout << s << endl;cout << s.empty() << endl;cout << s.capacity() << endl;// 缩容操作s.shrink_to_fit();cout << s.capacity() << endl;
}int main()
{test5();return 0;
}

在这里插入图片描述
实际上它并不能把空间全部释放掉,最小缩容到 16 (有一个’\0’)。

#include<iostream>
#include<string>
using namespace std;void test6()
{string s("hello,worlddddddddddddddddd");cout << s.size() << endl;cout << s.capacity() << endl;s.reserve(100);cout << s.capacity() << endl;
}int main()
{test6();return 0;
}

在这里插入图片描述
reserve() 函数的作用就是手动分配空间,但是不一定刚刚好分派到你想要的大小。那么,reserve 可以缩容吗?上面情况是想要分配的空间比原来的 capacity 大,假如想要分配的空间比 size 大,比 capacity 小会怎样?比 size 小会怎样?

#include<iostream>
#include<string>
using namespace std;void test6()
{string s1("hello,worlddddddddddddddddd");cout << s1.size() << endl;cout << s1.capacity() << endl;s1.reserve(100);cout << s1.capacity() << endl << endl;string s2("hello,worlddddddddddddddddd");s2.reserve(100);cout << s2.size() << endl;cout << s2.capacity() << endl;s2.reserve(50);cout << s2.capacity() << endl << endl;string s3("hello,worlddddddddddddddddd");s3.reserve(100);cout << s3.size() << endl;cout << s3.capacity() << endl;s3.reserve(10);cout << s3.capacity() << endl << endl;
}int main()
{test6();return 0;
}

在这里插入图片描述
所以我们知道,reserve 只有比 capacity 大时才扩容。
reserve 是改变容量,resize() 就是改变数据个数。
在这里插入图片描述
由上图可知:①给 resize 的值比 size 小时,resize 会将多余的给删除,不会修改 capacity 的值。②当给 resize 的值比 size 大,比 capacity 小时,字符串后面会默认插入 ‘\0’,或者给定的值。③当给 resize 的值比 capacity 大时,字符串会扩容至 resize,然后赋值 ‘\0’ 或给定值。

3. string类的元素访问

在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;void test8()
{string s("hello,world");// [] 访问cout << s[6] << endl;// at 访问cout << s.at(6) << endl;// 直接取头部数据cout << s.front() << endl;// 直接取尾部数据cout << s.back() << endl;
}int main()
{test8();return 0;
}

在这里插入图片描述

其中 []at 访问几乎没区别,只是对越界的检查方式不同。

4. string类的修改

在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;void test9()
{string s("123456789");cout << s << endl;// 字符串末尾追加s += '0';cout << s << endl;// 末尾追加s.append("987");cout << s << endl;// 尾插一个字符s.push_back('6');cout << s << endl;// 完全覆盖s.assign("13345889");cout << s << endl;// 从下标1开始插入s.insert(1, "23");cout << s << endl;// 从下标3开始删除两个字符s.erase(3, 2);cout << s << endl;// 从下标5开始,将1个字符给替换成s.replace(5, 1, "67");cout << s << endl;;
}int main()
{test9();return 0;
}

在这里插入图片描述

insert / erase / replace 需要挪动数据,复杂度大,能不用就不用。这里函数太多,就不一一介绍了,多看看文档就会用了。


未完待续

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

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

相关文章

MySQL与金蝶云星空对接集成执行查询语句-v2打通销售退货新增V1

MySQL与金蝶云星空对接集成执行查询语句-v2打通销售退货新增V1 数据源系统:MySQL mysql是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;所谓的关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来处理数…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目&#xff1a; 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力&#xff0c;B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等&#xff0c;允许从每组各选出一个CPU进行一次交换。 求两…

【学习vue 3.x】(二)组件应用及单文件组件

文章目录 章节介绍本章学习目标学习前的准备工作Vue.js文件下载地址 组件的概念及组件的基本使用方式组件的概念组件的命名方式与规范根组件局部组件与全局组件 组件之间是如何进行互相通信的父子通信父子通信需要注意的点 组件的属性与事件是如何进行处理的组件的属性与事件 组…

Redis---------实现查询缓存

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

2024年汉字小达人活动还有5个月开赛:来做18道历年选择题备考吧

距离2024年第11届汉字小达人比赛还有五个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷刷熟&#xff0c;这对了解汉字小达…

基于RK1126的小型化低功耗AI相机,支持人体特征识别、人脸特征识别、案例帽识别等

提供可定制的⼀套 AI相机软硬件开发平台&#xff0c; 硬件采⽤ RockchipRV1126处理器解决 ⽅案&#xff0c;可选择搭配 SonyIMX系列传感器&#xff0c;POE供电与数据传输&#xff0c;采⽤ 38板标准结构设计&#xff0c;快速按需定制外壳&#xff0c;⽀撑从开发到验证到批量⽣产…

64、二分-搜索二维矩阵

思路&#xff1a; 通过使用二分方式&#xff0c;对于每行进行二分&#xff0c;因为每行的最后一个数小于下一行的第一个数&#xff0c;我们就可以依次二分。首先取出行数N&#xff0c;然后从0-N进行二分&#xff0c;如果mid最后一个数小于目标值说明0-mid中没有&#xff0c;舍弃…

接口测试 - postman

文章目录 一、接口1.接口的类型2. 接口测试3. 接口测试流程4. 接口测试用例1. 测试用例单接口测试用例-登录案例 二、HTTP协议1. HTTP请求2. HTTP响应 三、postman1. 界面导航说明导入 导出用例集 Get请求和Post请求的区别:2.postman环境变量和全局变量3. postman 请求前置脚本…

kotlinDSL控制的安卓项目导入已存在的模块后sync报错

原因很明显&#xff0c;但是我还找了好久 因为在import时并没有选择groove还是kotlin控制&#xff0c; 所以默认为groovy控制的&#xff0c;然而主项目是由kotlin dsl控制的grale行为。 原因清楚之后&#xff0c;就可以去检查一下&#xff0c;项目里是否包含了settings.gradle和…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

【数据结构】为了节省空间,对于特殊矩阵我们可以这样做……

特殊矩阵的压缩存储 导读一、数组与矩阵1.1 数组1.2 数组与线性表1.3 数组的存储结构1.4 矩阵在数组中的存储1.4.1 行优先存储1.4.2 列优先存储 二、特殊矩阵及其压缩存储三、对称矩阵及其存储3.1 方阵与对称矩阵3.2 对称矩阵的存储3.3 压缩存储的手动实现3.3.1 行优先存储3.3.…

Golang | Leetcode Golang题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; func generateMatrix(n int) [][]int {matrix : make([][]int, n)for i : range matrix {matrix[i] make([]int, n)}num : 1left, right, top, bottom : 0, n-1, 0, n-1for left < right && top < bottom {for column : lef…