【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.mfbz.cn/a/432266.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter弹窗输入,Android学习的三个终极问题及学习路线规划

题库非常全面包括&#xff1a; Android基础知识: 基本涵盖Android所有知识体系&#xff0c;四大组件&#xff0c;Fragment,WebView,事件分发&#xff0c;View绘制…Java基础知识&高阶知识点: 基础部分不谈了&#xff0c;高阶部分&#xff1a;泛型&#xff0c;反射&#xff…

pytorch(六、七)多维特征数据的输入、加载数据集的类

文章目录 多维特征数据的输入代码 加载数据集概念 多维特征数据的输入 对于一个多维数据&#xff0c;其行表示一个样本&#xff0c;列表示样本的特征 对于多维特征的运算&#xff0c;实质上可以当做特征的映射 代码 import torch import torch.nn.functional as F import …

uniapp实现单选框卡片选择器,支持微信小程序、H5等多端

采用uniapp-vue3实现的一款单选框卡片选择器&#xff0c;纯CSS实现样式和交互&#xff0c;提供丝滑的动画选中效果&#xff0c;支持不同主题配置&#xff0c;适配多端 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id16901 使用示例 示例代码 <te…

【办公类-38-01】20240305 班级微信优质指导交流(word单元格插入统一大小的微信截图,替换方式修改基本信息)

作品展示 背景需求&#xff1a; 2024年3月5日&#xff0c;搭档指着她的笔记本电脑里面的一个docx页面&#xff08;有2*2表格&#xff09; “你写的那个编程可不可以直接在里面插图片&#xff1f;” 她是工会成员&#xff0c;经常要开展工会活动&#xff0c;并拍照&#xff0…

Nginx配置文件的整体结构

一、Nginx配置文件的整体结构 从图中可以看出主要包含以下几大部分内容&#xff1a; 1. 全局块 该部分配置主要影响Nginx全局&#xff0c;通常包括下面几个部分&#xff1a; 配置运行Nginx服务器用户&#xff08;组&#xff09; worker process数 Nginx进程PID存放路径 错误…

【笔记】ArkTS 语言(OpenHarmony系统)

一、官方简介和文档 介绍&#xff1a;aArkTS 语言 | 华为开发者联盟 (huawei.com) 学习指南&#xff08;文档&#xff09;&#xff1a;初识ArkTS语言-学习ArkTS语言-入门 | 华为开发者联盟 (huawei.com) 二、ArkTS语言知识 &#xff08;一&#xff09;编程语言介绍 Mozilla创…

基于php+mysql的高校共享单车管理系统springoot+vue_java

高校共享单车管理系统在让高校单车租赁信息规范化的同时&#xff0c;也能及时通过数据输入的有效性规则检测出错误数据&#xff0c;让数据的录入达到准确性的目的&#xff0c;进而提升高校共享单车管理系统提供的数据的可靠性&#xff0c;让系统数据的错误率降至最低。 …

微信小程序开发系列(十七)·事件传参·mark-自定义数据

目录 步骤一&#xff1a;按钮的创建 步骤二&#xff1a;按钮属性配置 步骤三&#xff1a;添加点击事件 步骤四&#xff1a;参数传递 步骤五&#xff1a;打印数据 步骤六&#xff1a;获取数据 步骤七&#xff1a;父进程验证 总结&#xff1a;data-*自定义数据和mark-自定…

代码训练LeetCode(2)区间列表的交集

代码训练(2)LeetCode之区间列表的交集 Author: Once Day Date: 2024年3月5日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 986. 区间列表的交集 - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全球…

推荐一款素材资源下载神器 —— 有图下载器

​ 最近由于学习工作需要&#xff0c;得从小红薯上搬运一些学习视频&#xff0c;一直找不到一个好用的视频搬运软件&#xff0c;朋友向我介绍推荐了一款工具叫作有图视频下载器&#xff0c;试了试感觉这款软件真的非常好用&#xff0c;所以推荐给大家&#xff01; 一、支持提…

定时执行专家的主要功能和使用场景

定时执行专家是一款功能强大且实用的定时任务软件。它具有以下优点&#xff1a; 功能丰富: 支持多种定时模式、多种任务类型、丰富的触发方式、强大的日志功能等。易于使用: 操作界面简洁直观&#xff0c;易于上手。稳定可靠: 运行稳定可靠&#xff0c;可长期使用。 具体来说&…

flutter框架优缺点,最新Android大厂高频面试题

部分面试常问的面试专题 一、Java篇 1.多线程并发&#xff1b; sleep 和 wait 区别join 的用法线程同步&#xff1a;synchronized 关键字等线程通信线程池手写死锁 2.Java 中的引用方式&#xff0c;及各自的使用场景 3.HashMap 的源码 4.GC(垃圾回收)是什么&#xff1f;如何…

uniapp 手写 简易 时间轴 组件

一、案例如图 该案例设计条件&#xff1a; 左侧时间 和竖线、点、内容都是居中对其的&#xff0c;上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构&#xff1a;一共三个元素&#xff0c;左侧是时间和黑点&#xff0c;中间是线条&#xff0c;右侧是内容 2. 样式难点&#…

第五篇:人工智能与机器学习技术VS创意创新(creative)--- 我为什么要翻译介绍美国人工智能科技巨头IAB公司?

【如无特殊说明&#xff0c;本文所有图片均来源于网络】 IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&…

(学习日记)2024.03.05:UCOSIII第七节:SysTick+任务时间片

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

java-ssm-jsp-大学社团管理系统

java-ssm-jsp-大学社团管理系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

pyg-创建消息传递网络

创建消息传递网络 — pytorch_geometric 文档 (pytorch-geometric.readthedocs.io) https://arxiv.org/abs/1801.07829 import torch from torch.nn import Sequential as Seq, Linear, ReLU from torch_geometric.nn import MessagePassing class EdgeConv(MessagePassing): …

Cloud-Sleuth分布式链路追踪(服务跟踪)

简介 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败 GitHub - spring-cloud/spring-cloud-sl…

Java基础 - 8 - 算法、正则表达式

一. 算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法 学习算法的技巧&#xff1f; 先搞清楚算法的流程&#xff0c;再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

分析开源机器学习框架TensorFlow

TensorFlow是一个开源的机器学习框架&#xff0c;由Google开发和维护。它提供了一个灵活的编程环境&#xff0c;可用于构建和训练各种机器学习模型。TensorFlow的基本概念和使用场景如下&#xff1a; 张量&#xff08;Tensor&#xff09;&#xff1a;在TensorFlow中&#xff0c…