STL容器之string(上)

目录

什么是STL

string类

string类常见接口

string类的常见构造函数

 string类对象的容器操作

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

string类对象的修改操作

拓展


从本期开始,我们将正式学习C++中的STL,美国的麦克阿瑟将军说过:“C++不能没有STL就像西方不能没有耶路撒冷”。这足以见得STL在C++中的地位。

什么是STL

STL:STL俗称标准模板库,是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构算法软件框架

为什么说STL是一个保罗数据结构与算法的软件框架呢?我们通过STL的六大组件不难看出,STL六大组件为:仿函数,算法,迭代器,空间配置器,容器,配接器。图示如下:

算法有很多,比如查找,交换,逆置,排序,归并等等,容器就是我们常说的数据结构,这些数据结构是在库中定义过的,我们可以直接使用。

本期我们主要学习的就是STL容器中的string类。在学习stl时我们使用https://legacy.cplusplus.com/进行相关学习,小伙伴可以自行在这个官网查看对应的使用方法。

string类

在学习C语言时,我们通常使用字符数组来定义字符串,但是在C++中做了改进,我们用string类来定义字符串。

string类常见接口

string类的常见构造函数

1.无参的构造函数,即默认构造函数,构建一个空字符串。

2.拷贝构造函数。

3. 用一个常量字符串来初始化对象的构造函数。

代码如下: 

#include<iostream>
using namespace std;
#include<string>
int main()
{string s1;string s2("hello yjd\n");string s3(s2);return 0;
}

截图如下: 

 string类对象的容器操作

1.返回字符串的有效字符的个数,有效字符就是'\0'之前的所有字符。

代码如下: 

int main()
{string s1("hello yjd");cout << s1.length() << endl;cout << s1.size() << endl;return 0;
}

截图如下: 

2.返回空间总大小,即字符串最多容纳的字符的个数。

代码如下: 

int main()
{string s1("hello yjd");cout << s1.capacity() << endl;return 0;
}

截图如下: 

 3.清除字符串中的有效字符。

代码如下: 

int main()
{string s1("hello yjd");cout << s1 << endl;s1.clear();cout << s1 << endl;cout << s1.capacity() << endl;return 0;
}

 截图如下:

注意:清除有效字符并不影响字符串的capacity的大小,即不影响字符串字符串存储字符的最大个数。

4.判断字符串是否为空,为空返回ture,否则返回false。

代码如下:

int main()
{string s1("hello yjd");string s2;cout << s1.empty() << endl;cout << s2.empty()<< endl;return 0;
}

 截图如下:

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

1.重载[ ],在之前[ ]只允许用于整形数组的元素的访问,但是在重载之后,支持自定义对象进行元素的访问,string类对象可以看成是一个字符数组。

2.at成员函数进行访问。

  代码如下:

int main()
{string s1("hello yjd");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1.at(i) << " ";}return 0;
}

截图如下: 

如果我们执行完下面的代码,会打印什么呢?

int main()
{string s1("hello yjd");for (size_t i = 0; i < s1.size(); i++){s1[i]+=1 ;}cout << s1 << endl;for (size_t i = 0; i < s1.size(); i++){s1.at(i) += 1;}cout << s1;return 0;
}

我们发现对象的值发生了改变,这样就意味着[ ]运算符重载和at成员函数的返回值应该是字符串中每个字符的引用,所以此时引用最大的作用并不是为了减少拷贝,而是为了改变对象的值。 

string类对象的修改操作

1.push_back,在字符串尾部添加字符

代码如下: 

int main()
{string s1("hello yjd");cout << s1 << endl;s1.push_back('h');cout << s1 << endl;
}

 截图如下:

 2.append,在字符串后追加字符串。

代码如下:

int main()
{string s1("hello yjd");cout << s1 << endl;s1.append("hello djy");cout << s1 << endl;
}

截图如下:

3. 重载+=,使得自定义字符串对象可以实现+=操作。

代码如下:

int main()
{string s1("hello yjd");cout << s1 << endl;s1 += 'h';cout <<s1 << endl;s1 += "hello djy";cout << s1 << endl;
}

截图如下:

 上面便是我们经常使用到的string类的成员函数。

拓展

1.不知道大家有没有注意到下述行代码:

cout << s1 << endl;

我们知道流插入运算符一般情况下只能用于编译器的内置类型,可是这里为什么却可以使用在自定义类型之上呢?

这是因为我们对流插入运算符和留提取运算符都做了重载,作为了string类的非成员函数,所以我们可以使用流插入运算符实现对自定义对象的输出。

 2.我们知道stl的容器都是建立在模板的基础上进行学习的,可是为什么我们在定义string类对象时丝毫没有看到模板的影子呢?就比如这行代码:

string s1("hello yjd");

 其实,cplusplus中的文档已经告诉了我们答案:

原来string是对basic_string<char>的重命名。这就更奇怪了,一个字符串的每个元素的类型可能性就是字符呀,还能有其他类型吗?

其实,这就牵扯到了编码的相关概念,因为对于英语的字符而言,无非就是26个英文的大小加上一些其它的字符,一个char是一个字节,也就是8个bit,转为10进制就是256,所以使用一个char类型可以表示256个字符,对于英语的字符这肯定是够了的。但是对于中文,各种菠萝文,这些语言那么多字符,肯定是远远不够的,所以此时字符串的每个元素的类型可能就是其它的char,在cpluspus文档中可以看到:

总共有四种类型的char,所以string类也是模板,本质上就是basic_string类模板。

好了,以上便是本期的所有内容,主要讲述了string类的一些基本的操作,都是一些基础的内容。

本期内容到此结束^_^

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

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

相关文章

mipi dsi协议DBI/DPI接口

MIPI dsi协议中的DBI/DPI接口主要用于主机和display设备之间的数据传输&#xff0c;说的更通俗一点就是DSI RX控制器和实际的显示面板之间的接口&#xff1b;dsi 协议spec中对DBI/DPI有描述&#xff1a; DSI协议中对DBI 接口模式命名为command mode operation&#xff0c;对DP…

【物联网】EMQX(二)——docker快速搭建EMQX 和 MQTTX客户端使用

一、前言 在上一篇文章中&#xff0c;小编向大家介绍了物联网必然会用到的消息服务器EMQ&#xff0c;相信大家也对EMQ有了一定的了解&#xff0c;那么接下来&#xff0c;小编从这篇文章正式开始展开对EMQ的学习教程&#xff0c;本章节来记录一下如何对EMQ进行安装。 二、使用…

QT第一步

文章目录 软件下载软件安装QT的程序组新建项目 软件下载 qt下载网址&#xff1a;https://download.qt.io/archive/qt/   关于版本&#xff1a;     我选择的版本是5.14.2&#xff0c;这个版本是最后的二进制安装包的版本&#xff0c;在往后的版本就需要在线安装了。并且5…

994. 腐烂的橘子 --力扣 --JAVA

题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没…

C#基础——构造函数、析构函数

C#基础——构造函数、析构函数 1、构造函数 构造函数是一种特殊的方法&#xff0c;用于在创建类的实例时进行初始化操作。构造函数与类同名&#xff0c;并且没有返回类型。 构造函数在对象创建时自动调用&#xff0c;可以用来设置对象的初始状态、分配内存、初始化字段等操作…

【跨域】同源策略、跨域解决

文章目录 1. 什么是同源策略及其限制内容?2. JSONP的实现流程3. CORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。4. Node中间件代理(两次跨域)5. nginx反向代理6. 总结1. 什么是同源策略及其限制内容? 同源策略是一种约定,它是浏览器最核心也最…

【漏洞复现】DophinPHP后台getshell

漏洞描述 DolphinPHP(海豚PHP)是一个基于ThinkPHP5.1.41LTS开发的一套开源PHP快速开发框架,DolphinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。统一了模块、插件…

单机架构到分布式架构的演变

目录 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 总结 1.单机架构 初期&#xff0c;我们需要利用我们精干的技术团队&#xff0c;快…

RocketMQ系统性学习-SpringCloud Alibaba集成RocketMQ以及批量发送消息、消息过滤实战

文章目录 批量发送消息消息过滤 批量发送消息 批量发送消息可以减少网络的 IO 开销&#xff0c;让多个消息通过 1 次网络开销就可以发送&#xff0c;提升数据发送的吞吐量 虽然批量发送消息可以减少网络 IO 开销&#xff0c;但是一次也不能发送太多消息 批量消息直接将多个消…

C#基础——类、对象和属性

类&#xff1a;是具有相同属性和行为特征的集合 对象&#xff1a;对象是类的实例化&#xff0c;它具有类定义的所有特征和行为。 类的语法格式&#xff1a; 访问修饰符 class关键字 类名 两种创建类的方式 第一种方式就是在类的下面再创建一个类 第二种方式是在文件中添加一个…

【员工工资册】————大一期末答辩近满分作业分享

前言 大家好吖&#xff0c;欢迎来到 YY 滴项目系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C语言的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; PS&#xff1a;以下内容是部分展示&am…

springboot升级到3.2导致mybatis-plus启动报错

在springboot升级到3.2时&#xff0c;服务启动报错 java.lang.IllegalArgumentException: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String&#xff1a; java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanOb…

Raspberry PI + Codesys + EtherCAT步进驱动ECR60 Motion功能测试

原文连接&#xff1a;Raspberry PI Codesys EtherCAT步进驱动ECR60 Motion功能测试 – 个人资料收集 (rtplc.com) <div class"post_info_wrapper "> <p class"has-drop-cap">运动控制功能是codesys及EtherCAT通讯的重要功能&am…

55 代码审计-JAVA项目注入上传搜索或插件挖掘

目录 必备知识点演示案例:简易Demo段SQL注入及预编译IDEA审计插件FindBugs安装使用Fortify_SCA代码自动审计神器使用Ofcms后台SQL注入-全局搜索关键字Ofcms后台任意文件上传-功能点测试 涉及资源&#xff1a; 我们一般针对java项目&#xff0c;进行漏洞分析的话&#xff0c;主要…

4-Docker命令之docker build

1.docker build介绍 docker build命令是用来使用Dockerfile文件创建镜像 2.docker build用法 docker build [参数] PATH | URL | - [root@centos79 ~]# docker build --helpUsage: docker buildx build [OPTIONS] PATH | URL | -Start a buildAliases:docker buildx build…

【计算机视觉--解耦视频分割跟踪任何物体】

UIUC&Adobe开源|无需监督&#xff0c;使用解耦视频分割跟踪任何物体&#xff01;视频分割的训练数据往往昂贵且需要大量的标注工作。这限制了将端到端算法扩展到新的视频分割任务&#xff0c;特别是在大词汇量的情况下。为了在不为每个个别任务训练视频数据的情况下实现“跟…

HPM6750系列--第九篇 GPIO详解(中断操作)

一、目的 在上篇中《HPM6750系列--第九篇 GPIO详解&#xff08;基本操作&#xff09;》我们讲解了GPIO的基本操作&#xff0c;本篇继续讲解GPIO的中断处理。 二、介绍 将一个引脚设置为中断涉及到以下几个步骤&#xff08;此处我们以PZ02举例&#xff09;&#xff1a; 1.设置IO…

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题&#xff08;论文详情请点击阅读原文&#xff09;&#xff0c;分为三个主要集群: 1)驾驶…

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3&#xff1a;社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…

Qt下载地址

下载地址 &#xff08;1&#xff09;windoes 平台 Qt 的下载与安装&#xff1a; Qt 5.15之前的版本可以离线安装&#xff0c;直接下载离线安装包即可&#xff1a; 下载地址&#xff1a;https://download.qt.io/archive/qt/ Qt从5.15开始&#xff0c;不再支持离线安装&#xf…