string类(C++)

news2025/7/9 1:52:34

文章目录

  • 一.引言
  • 二.string类:
    • 成员函数:
      • 构造函数:
      • 析构函数
    • 遍历:
      • operator[]
      • 迭代器(iterator)
      • 范围for
      • 反向遍历(反向迭代器reverse_iterator)
      • const迭代器
    • 容器:
      • capacity扩容
      • clear清数据
      • shrink_to_fit缩容:
      • resever扩容
      • resize改变大小:
    • 元素访问
    • 修改:
      • 尾部插入数据:
      • assign覆盖值
      • insert中间插入
      • erase删掉某个位置
      • repalce替换字符字符串
    • 字符串操作
      • C的字符串c_str
      • data
      • substr截取
      • find寻找字符字符串
      • rfind反着找
    • 非成员函数重载
      • getline

以下都是以初学者的角度,有些乱,但层层递进,没有依照C++标准库的顺序

一.引言

string类是C++标准库里面的一个模板
在这里插入图片描述

首先得会看文档,这里推荐两个:个人认为cpulspuls看起来比官网舒服
cpulspuls:https://cplusplus.com/reference/
C++的官网:https://en.cppreference.com/w/cpp
下面都是以cpulspuls为基准查
在这里插入图片描述
个人喜欢切到旧版直接查:
在这里插入图片描述
在这里插入图片描述

二.string类:

下面按照cpulspuls的顺序进行一步步讲解:

成员函数:

在这里插入图片描述
C++头文件基本是不带.h的

构造函数:

可以看出有7个构造函数
在这里插入图片描述
根据英文可以得出:
1.默认构造函数
2.拷贝构造
3.也是拷贝,从pos拷贝到len
在这里插入图片描述
其中npos是:无符号整形,存到里面就是整形的最大值,代表着str最后一位
在这里插入图片描述
4.可以用一个字符串来构造,其中c-string有可能是字符串也可能是个数组,核心就是最后得有一个‘\0’
这里来用一用前4个构造函数:

在这里插入图片描述在这里插入图片描述

上面的流插入其实本来也用不了的,是库中有运算符重载才可以用
在这里插入图片描述
5.拷贝字符串的前n个(并不是很常用)
6.拷贝n个字符
例子;
在这里插入图片描述

析构函数

析构函数自动调用,所以不用关注
在这里插入图片描述

遍历:

operator[]

由于string中成员变量是私有的,所以用到了C++标准库提供的size和operator[],用法就是字面意思
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s1("hello world");
	for (size_t i = 0;i<s1.size();i++)
	{
		cout << s1[i] << " ";//相当于cout << s1.operator[](i) << " ";
	}
	return 0;
}

不仅能够遍历还能够修改:

for (size_t i = 0;i<s1.size();i++)
	{
		s1[i]++;
	}

还有一点要注意:sting中有size,那么hello world中size存的是几
答案是11:因为后面的’\0’只不过是表示符,跟C语言匹配而已
在这里插入图片描述

迭代器(iterator)

iterator是一个类型,定义在类里面的
迭代器行为像指针一样的类型对象

int main()
{
	string s1("hello world");
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

在这里插入图片描述

范围for

e依次取s1容器中的数据,自动迭代,自动往后走

int main()
{
	string s1("hello world");
	for (auto e : s1)
	{
		cout << e << " ";
	}
	return 0;
}

其实范围for的底层就是迭代器:从反汇编可以看出运行起来相似。
在这里插入图片描述
在这里插入图片描述

反向遍历(反向迭代器reverse_iterator)

int main()
{
	string s1("hello world");
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	return 0;
}

const迭代器

int main()
{
	const string s1("hello world");
	string::const_iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

C++11认为begin不够很好的区分const和正常的,所以加了cbegin。很多人依旧用的是begin

在这里插入图片描述在这里插入图片描述

容器:

在这里插入图片描述
首先发现size和length功能一样,由于历史问题,一开始没有STL库,数据结构都是以length命名,后来STL库出来后才有的size。所有的语言只能向前兼容,所以留着length
max_size是最大的长度,没啥参考意义,每个编译器下面基本都不一样

capacity扩容

通过以下代码可以看出一次扩多少空间

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s;
	size_t sz = s.capacity();
	cout << "capacity changed: " << sz << endl;
	for (int i = 0;i<100;++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << endl;
		}
	}
	return 0;
}

可以看出第一次是2倍,后面都是1.5倍扩容
在这里插入图片描述
当然扩容没有明确规定扩多少,Linux的g++编译器是一次性2倍扩
在这里插入图片描述

clear清数据

就是把数据都清掉:
在这里插入图片描述
这里是清数据,空间还在:
在这里插入图片描述

shrink_to_fit缩容:

C++11增加的缩容空间
在这里插入图片描述

resever扩容

扩容是有代价的,尤其是异地扩容,resever是直接开好多少个空间,不像capacity需要循循渐进的扩容
在这里插入图片描述
这里是扩出了111个空间,更准确说是112个,有个’\0’没算,每个编译器下的扩容规则不一样,相同的代码,Linux的g++正好扩出100个
在这里插入图片描述
如果resever<size不会缩容
在这里插入图片描述
size<resever<capacity也不会缩容
在这里插入图片描述

resize改变大小:

有三种情况:
在这里插入图片描述
这里来演示一下:插入默认是’\0’

n<size在这里插入图片描述
size<n<capacity在这里插入图片描述
n < capacity在这里插入图片描述

并且有函数重载,如果不想默认插入的是’\0’,可以自己手动添加
在这里插入图片描述
例子:
在这里插入图片描述

元素访问

以下都是对元素的访问
在这里插入图片描述
operator[ ]就是运算符重载,用法如下:
在这里插入图片描述
at访问
在这里插入图片描述
用法如下:
在这里插入图片描述
operator[ ] 与at的不同之处就在于越界的检查不同
operator[ ]的越界:
在这里插入图片描述
at的越界:
在这里插入图片描述
当然也可以捕获at的越界异常
在这里插入图片描述
常用都是operator[ ]
front和back都是取字符串头和尾部的字符,出于规范提供,实践并没有什么用

修改:

修改主要是一些插入数据
在这里插入图片描述

尾部插入数据:

如果想插入某个字符可以用push_back:
在这里插入图片描述
在这里插入图片描述
apend可以插入字符串
在这里插入图片描述
以下是上述第三行用法(最常见的)
在这里插入图片描述
第五行用法
在这里插入图片描述
下述代码如果不想要s1两侧的空格可以:
在这里插入图片描述
大多数不用push_back和append,用+=,不仅可以连接单个字符,还可以连接字符串
在这里插入图片描述
在这里插入图片描述

assign覆盖值

实践中很少使用
在这里插入图片描述
第一行用法:直接对s的空间上覆盖
在这里插入图片描述

insert中间插入

在这里插入图片描述
用的最多的是第三行:跟顺序表类似,在中间插入时间复杂度就是O(n),所以尽量不用instert
在这里插入图片描述

erase删掉某个位置

在这里插入图片描述
演示上述第一行:从第三个位置开始删,删除1个
在这里插入图片描述
也是个全缺省,删空:
在这里插入图片描述

repalce替换字符字符串

用的也很少
在这里插入图片描述
下面是上述第一行:把下标为6的后面3个字符替换成%60
在这里插入图片描述
以上的insert/erase/replace能少用就少用,因为基本都要挪动数据,效率不高

字符串操作

C的字符串c_str

就比如C语言中fopen需要char*的字符串,但创建的的string类型的,可以用c_str,就是为了与C语言兼容
在这里插入图片描述
在这里插入图片描述

data

跟c_str差不多,把string转换成char*,大多数都用c_str
在这里插入图片描述

substr截取

copy很少用,基本上都是substr
在这里插入图片描述
在这里插入图片描述

find寻找字符字符串

在这里插入图片描述
找空格:不给参数是从头找
在这里插入图片描述
当然也可以找字符串。
如果没找到返回npos;
在这里插入图片描述
所以可以这么用:找到空格,然后改
在这里插入图片描述
所以上述的找空格有另一种写法:
在这里插入图片描述

rfind反着找

在这里插入图片描述
在这里插入图片描述

非成员函数重载

getline

在cin输入的时候遇到空格和’\n’就不会读取
例如:输入123 456但只有123在a1,456在缓冲区
在这里插入图片描述
C语言中用getchar解决,C++输入string解决空格问题使用getline:
在这里插入图片描述

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

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

相关文章

Azure数据分析Power BI

Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…

Web渗透:XSS-反射型存储型

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者将恶意脚本注入到网页中&#xff0c;其他用户在浏览这些页面时&#xff0c;可能会执行这些恶意脚本&#xff0c;从而导致各种安全问题&#xff0c;如…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备&#xff08;改进版&#xff09; https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…

【文末附gpt升级秘笈】AI音乐大模型崛起:版权归属与创意产业的新挑战

AI音乐大模型崛起&#xff1a;版权归属与创意产业的新挑战 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到社会生活的各个领域&#xff0c;音乐领域也不例外。最近一个月&#xff0c;轮番上线的音乐大模型不仅为普通人打开了音乐创作的大门&…

am62x芯片安全类型确认(HS-SE, HS-FS or GP)

文章目录 芯片安全类型设置启动方式获取串口信息下载脚本运行脚本示例sk-am62x板卡参考芯片安全类型 AM62x 芯片有三个安全级别。 • GP:通用版本 • HS-FS:高安全性 - 现场安全型 • HS-SE:高安全性 - 强制安全型 在SD卡启动文件中,可以查看到, 但板上的芯片,到底是那…

手把手教你挖赏金系列(2)如何挖掘短信验证码漏洞

免责声明 由于传播、利用本公众号所发布的而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人承担。LK安全公众号及原文章作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;如有侵权烦请告知&#xff0c;我们会立即删除并致歉。谢谢&#…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

人工智能这么厉害,比如GPT-4,为什么没有看到程序员大量失业?

从ChatGPT第一版发布到现在&#xff0c;还不到一年的时间中&#xff0c;可是它使用的GPT架构已经从3.5版本进化到现在的4.0版本&#xff0c;随之而来的是其能力的极大提升。下面是GPT-4在其官网的介绍中的一句话&#xff1a; GPT-4是OpenAI最先进的系统&#xff0c;可以产生更安…

FlowUs:打造沉浸式协作体验感受

直观的用户体验 从我个人的角度来看&#xff0c;FlowUs的界面设计非常符合现代审美&#xff0c;简洁而不失功能性。每次打开FlowUs&#xff0c;我都能迅速找到我需要的功能&#xff0c;这大大提升了我的工作效率。 实时协作的流畅性 在FlowUs中&#xff0c;我最喜欢的功能之一就…

记录:[android] SSLHandshakeException: Handshake failed 问题;已解决!

1、问题描述&#xff1a;在使用Retrofit2 时在安卓老设备上&#xff08;安卓6.0&#xff09;网络无法请求、安卓 10 、 11 未出现此问题&#xff1f;what? 原因&#xff1a;服务端 TLS 版本过高 2、废话不多说、解决方案A 、添加依赖&#xff1a;implementation org.conscrypt…

[面试题]Kafka

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

如何才能入手到好的开放式耳机,总结六招耳机亲测好方法

作为一款当代年轻人基本离不开的数码产品&#xff0c;很有理由进入这次618的必买清单&#xff1b;但是如果不是耳机领域或者是数码领域的&#xff0c;对于耳机的参数、数据和使用等都不了解&#xff0c;就很容易造成踩雷&#xff0c;不仅浪费钱&#xff0c;还浪费时间&#xff…

国际版游戏陪练源码电竞系统源码支持Android+IOS+H5

&#x1f3ae;电竞之路的得力助手 一、引言&#xff1a;电竞新纪元&#xff0c;陪练小程序助力成长 在电竞热潮席卷全球的今天&#xff0c;每一个电竞爱好者都渴望在竞技场上脱颖而出。然而&#xff0c;独自一人的游戏之路往往充满了挑战和困难。幸运的是&#xff0c;国际版游…

14:补充-变量作用域-页面加载

试问&#xff1a;在控制台打印person1、person2结果是什么&#xff1f; var person2{name:"张三",age:21}//页面加载完成执行的事件window.onloadfunction(){var person1{name:"李四",age:18}} 打印结果&#xff1a;在控制台中发现person1这个变量不存在 原…

iptables(3)规则管理

简介 上一篇文章中,我们已经介绍了怎样使用iptables命令查看规则,那么这篇文章我们就来介绍一下,怎样管理规则,即对iptables进行”增、删、改”操作。 注意:在进行iptables实验时,请务必在个人的测试机上进行,不要再有任何业务的机器上进行测试。 在进行测试前,为保障…

MAVEN-SNAPSHOT和RELEASE + 打包到远程仓库

一、快照版本SNAPSHOT和发布版本RELEASE区别 快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客 在使⽤maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能⼀天就要发布⼀次&#xff0c;遇到bug时&am…

Vue 前后端分离开发:懒人必备的API SDK

在前后端分离的项目中,前后端通过API进行通信和数据交换。随着项目规模的扩大,API的数量可能从几十个增加到几百个。为了简化API的编写和维护,我们可以利用JavaScript的特性,通过动态生成接口方法来实现懒人开发。本文将详细介绍如何统一接口调用方式、抽象和封装接口,并利…

模版与策略模式

一&#xff0c;怎么选择 如果需要固定的执行流程&#xff0c;选模版 如果不需要固定的执行流程&#xff0c;只需要对一个方法做具体抽象&#xff0c;选策略 参考文章&#xff1a; 常用设计模式汇总&#xff0c;告诉你如何学习设计模式 二&#xff0c;常用写法 子类 exten…

天池人脸识别项目复现

1 项目背景 #c 概述 项目的目的 图像分类是整个计算机视觉领域中最基础的任务&#xff0c;也是最重要的任务之⼀&#xff0c;最适合拿来进⾏学习实践。为了让新⼿们能够⼀次性体验⼀个⼯业级别的图像分类任务的完整流程&#xff0c;本次我们选择带领⼤家完成⼀个对图片中⼈脸进…

《计算机组成原理》(学习笔记)(王道)

目录 一、计算机系统概述 *1.1 计算机发展历程 *1.1.1 计算机硬件的发展 *1.1.2 计算机软件的发展 1.2 计算机系统层次结构 1.2.1 计算机系统的组成 1.2.2 计算机硬件的基本组成 冯诺依曼体系结构特点&#xff08;6&#xff09;&#xff1a; 1.2.3 计算机软件的分类 …