【C++】继续学习 string类 吧

在这里插入图片描述

开始使用 string类 吧

  • 1 继续学习
    • 1.1 扩容机制
    • 1.2 string类对象的访问及遍历操作
    • 1.3 string类对象的修改操作
    • 1.4 其他一些成员函数
  • 2 实践解决问题:
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂…
所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)

1 继续学习

上一篇文章
上一篇文章我们给出了构造函数和一些成员函数的功能:

成员函数作用
begin()返回字符首位置 (迭代器常用 )
end()返回字符结尾 (迭代器常用)
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

1.1 扩容机制

上一篇文章,我们看到了string的容量是比较模糊的,为什么是15???,它的扩容规则是什么???
接下来我们来探索一下string的扩容机制:
首先我们来写一个简单的测试程序:


#include<string>
#include<iostream>using namespace std;int main(){string s1 = "";for (int i = 0; i < 200; i++) {s1 += "c";//检查是否需要扩容 然后打印出来if (s1.size() == s1.capacity()) cout << "string 的空间 :" << s1.capacity() << endl;}return 0;
}

来看看效果:
在这里插入图片描述
可以看出来VS2022 基本是以1.5 倍扩容。那全部的编译器都是1.5 倍吗???
再让我们来liunx中,用g++ 来试试哈。
在这里插入图片描述
所以不同编译器的扩容机制也不同,这就是历史的原因了。根据我们所学过的顺序表,我们可以很容易想到内部扩容机制是什么样子:

  1. 检查 size 是否 等于 capacity
  2. 如果相等 扩容
  3. 否则直接插入尾部。

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

函数名称功能说明
operator[] (重点)返回pos位置的字符,const string类对象调用
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendrbegin获取一个字符的迭代器 + rend获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式(底层是迭代器)

迭代器是C++新增的内容,功能类似指针,这里不细说,只将在string中如何使用。
首先看到迭代器(iterator)功能类似指针,那必须想到遍历的作用,对不对。接下来我们来看看迭代器的遍历好不好用。
注意不同类型的迭代器需要使用命名空间限定 这里是 string :: iterator

#include<string>
#include<iostream>using namespace std;int main() {string s1 = "I love you !";string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";it++;}return 0;
}

看见这熟悉的结构,while()循环 *it it++是不是真的和指针一样。
再让我们看一下结果吧:
在这里插入图片描述
顺利的遍历了全部字符串。
接下来再来看一个好玩的,逆转迭代器reverse_iterator

#include<string>
#include<iostream>using namespace std;int main() {string s1 = "I love you !";string::reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";it++;}return 0;
}

仔细看,依然是 it++,而且起始位置也成为了rbegin() 结尾是rend() 是不是非常有意思。
来看效果:
在这里插入图片描述
成功逆转打印,very good!!!
同样也可以使用基于范围的for循环
for(auto it : s1){ } 即可完成遍历操作;

1.3 string类对象的修改操作

来给一波函数:

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

这里面其实有许多函数重载,不过常用的就那几个,有需求请自行查看:C++库
来初步使用一下插入函数:

#include<string>
#include<iostream>using namespace std;int main() {string s1 = "I love you !";s1.push_back('c');cout << "结尾插入字符 :" << s1 << endl;s1.append("forever");cout << "append 结尾插入字符串 :" << s1 << endl;s1 += "xxxxx";cout << "+= 结尾插入字符串 :" << s1 << endl;return 0;
}

非常顺利的插入了:
来看效果:
在这里插入图片描述

1.4 其他一些成员函数

函数功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

这些我们以后再进行详细讲解。

2 实践解决问题:

家人们,上链接!!!!
1859 . 将句子排序
来看题目描述:
在这里插入图片描述

这个我们直接套用字符串操作模版即可:
在这里插入图片描述
这个非常好用的获取单词的办法,首先使用基于范围的for循环,然后遍历,只要不是空格,就插入到中间string类temp中,遇到空格,就把该单词存入数组中。非常好用!
然后这道题还要求我们完成排序,所以直接使用sort按要求排序即可。
最后删除结尾的数字,重新插入到s中即可。

bool compare(string a,string b){return a.back() < b.back();
}class Solution {
public:string sortSentence(string s) {string temp = "";vector<string> res;s += " ";for(auto ch : s){if(ch == ' '){res.push_back(temp);temp.clear();}else{temp.push_back(ch);}}sort(res.begin(),res.end(),compare);s.clear();for(auto& it : res){it.pop_back();s += it + ' ';}   s.pop_back();return s;}
};

运行效果非常好:
在这里插入图片描述

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

透明玻璃屏幕为什么那么贵

透明玻璃屏幕之所以价格较高&#xff0c;主要是由于以下几个方面的原因&#xff1a; 技术研发与创新&#xff1a;透明玻璃屏幕作为一种先进的显示技术&#xff0c;其研发和制造过程涉及到许多复杂的技术。这些技术的研发和创新需要投入大量的资金和时间。此外&#xff0c;透明玻…

操作系统概念概述

软件设计师11--操作系统 考点1&#xff1a;操作系统的作用操作系统概述例题&#xff1a; 考点2&#xff1a;特殊的操作系统例题&#xff1a; 考点1&#xff1a;操作系统的作用 操作系统概述 管理系统的硬件、软件、数据资源控制程序运行人机之间的接口应用软件与硬件之间的接口…

MySQL 缓存策略

MySQL 缓存方案用来干什么 ? 缓存用户定义的热点数据&#xff0c;用户直接从缓存中获取热点数据&#xff0c;降低数据的读写压力。场景分析 内存访问速度是磁盘访问速度的 10 万倍。读的需求远远大于写的需求MySQL 自身缓冲层跟业务无关。MySQL 作为项目主要数据库&#xff0…

winui开发笔记(五)应用程序图标

应用程序图标、发布者、显示名称大部分都在package.appxmanifest清单文件中&#xff0c;可以正常打开&#xff0c;也可以使用xml文本编辑器打开。 以下是一个正常的应用程序中所有的与图标相关的图片&#xff1a; 但是设置之后会有一圈白&#xff0c;包括在电脑最下边一行&…

Python异步IO库之uvloop使用详解

概要 在Python中,异步编程已经成为处理高并发和IO密集型任务的主要方式之一。而uvloop库则是一个专门针对异步IO操作进行优化的库,它能够显著提高异步程序的性能。本文将深入探讨uvloop库的使用方法、功能特性以及如何利用它来加速异步IO编程。 什么是uvloop库? uvloop是一…

Tensorflow2.0笔记 - 计算梯度

本笔记主要记录tf.GradientTape和tf.gradient的用法 import tensorflow as tf import numpy as nptf.__version__#要计算梯度的所有参数计算过程必须放到gradient tape中 #with tf.GradientTape as tape: w tf.constant(1.) x tf.constant(2.)with tf.GradientTape() as tap…

防御保护--课程笔记

一、内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 IAE引擎 1、DFI和DPI技术 --- 深度检测技术 &#xff08;1&#xff09;DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对 数据…

C#高级:Winform桌面开发中DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…

(C语言)sizeof和strlen的对比(详解)

sizeof和strlen的对⽐&#xff08;详解&#xff09; 1. sizeof sizeof是用来计算变量所占内存空间大小的&#xff0c; 单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是用类型创建的变量所占空间的大小。 sizeof 只关注占用内存空间的大小 &#xff0c;不在乎内…

【C语言】指针超级无敌金刚霹雳进阶(但不难,还是基础)

点击这里访问我的博客主页~~ 对指针概念还不太清楚的点击这里访问上一篇指针初阶2.0 上上篇指针初阶1.0 谢谢各位大佬的支持咯 今天我们一起来学习指针进阶内容 指针进阶 一、指针变量1、字符指针变量2、数组指针变量①数组指针变量的定义②数组指针变量的初始化 3、函数指…

【Linux从青铜到王者】进程信号

——————————————————————————————————————————— 信号入门 在了解信号之前有许多要理解的相关概念 我们可以先通过一个生活例子来初步认识一下信号 1.生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来…

C++对象内存模型布局详解

目录 本文主要内容如下&#xff1a; 最后还有一些问题&#xff1a; 一、理解虚函数表 二、对象模型概述 三、继承下的C对象模型 单继承&#xff1a; 多继承&#xff1a; 一般的多继承&#xff08;非菱形继承&#xff09;&#xff1a; 菱形继承&#xff1a; 五、虚继承…