STL容器之string(上)

news2024/11/28 8:36:06

目录

什么是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.coloradmin.cn/o/1318631.html

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

相关文章

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包&#xff0c;并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户&#xff0c;并初始化mysql六、启用传输安全七、启动mysql&#xff0c;验证是否安装成功 总结 博主…

若依 ruoyi-vue3+ts-plus+ 宇道 yudao-ruoyi-vue-pro前端显示部门名称

想在 index.vue 上显示列表里对应的部门名称 效果 引入dept import * as DeptApi from "/api/system/dept"; 初始化时 /** 初始化 **/ onMounted(async () > {getList();deptNameList.value await DeptApi.getSimpleDeptList(); }) 加载id 对应的部门名称 …

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…

机器学习项目精选 第一期:超完整数据科学资料合集

大噶吼&#xff0c;不说废话&#xff0c;分享一波我最近看过并觉得非常硬核的资源&#xff0c;包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址&#xff1a;https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…

【基础算法】试除法判定质数(优化)

文章目录 算法优化模板题目代码实现 算法优化模板 bool is_prime(int n){if(n < 2) return false;for(int i 2;i < n / i;i ){ //优化内容if(n % i 0){return false;}}return true; }注意这里的一个总要优化是for循环的终止条件是i<n/i。为什么不是i<n或者i<…

Java EE 网络之网络初识

文章目录 1. 网络发展史1.1 独立模式1.2 网络互连1.3 局域网 LAN1.4 广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 分层的作用2.5.3 OSI七层协议2.5.4 TCP/IP五层协议2.5.5 网络设备所在分层 2.6 分装和分用 …

10天玩转Python第9天:python 面向对象 全面详解与代码示例

今日内容 异常 模块和包 导入模块(导包)if __name__ "__main__": Unitest 框架的学习 了解, 基本组成 异常 异常传递[了解] 异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递. ​ 异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发…

获取MODIS的NDVI/EVI产品

目录 简介源代码运行流程参考博文 简介 本项目是使用MODIS的NDVI产品&#xff08;MOD13Q1&#xff09;,可获取从2000年至今的所有数据&#xff0c;更新频率为16天 MOD13Q1 V6.1产品以每像素为基础提供植被指数(VI)值。这里有两个主要的植被层。第一种是归一化植被指数(NDVI)&a…

LeedCode刷题---滑动窗口问题(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、将X减到0的最小操作数 题目链接&#xff1a;将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目&#xff1a; Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接&#xff1a; https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接&#xff1a; GitHub - facebook…

2024年转行软件测试,报培训班3个月出来就是高薪工作,真的靠谱吗?

作为一个已在IT行业工作8年&#xff0c;分享一下我的经验&#xff0c;供大家参考。 讲真&#xff0c;现在想通过培训班培训几个月就进入IT行业&#xff0c;越来越来难了&#xff1b;如果是在2018年以前&#xff0c;还有机会&#xff0c;一方面&#xff0c;那个时候IT行业还不算…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件&#xff1a; cd /var/log du -s ./* | sort -nr | head 系统日志log文件&#xff1a; ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志&#xff1a; ll -h /var/lo…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架&#xff0c;我们可以利用它快速搭建一个服务&#xff0c;对外提供接口&#xff0c;其他人可以轻松调用我们的服务。这对算法工程师来说比较关键&#xff0c;我们通常不擅长搞开发…

【精选】计算机网络教程(第2章网络层)

目录 前言 第2章网络层 1、编码与调制 2、传输方式 前言 总结计算机网络教程课程期末必记知识点。 第2章网络层 1、编码与调制 信道可以分成传送模拟信号的模拟信道和传送数字信号的数字信道两大类。通常人们将数字数据转换成数字信号的过程称为编码&#xff0c;而将数字…

leetcode刷题日志-383赎金信

思路&#xff1a;分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map&#xff0c;如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false&#xff0c;否则返回true&#xff1b; class So…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上&#xff0c;这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗&#xff0c;你喜欢喝的那瓶香槟酒可能根本不是香槟&#xff0c;而是汽酒&#xff1f;你不是唯一一个认为…

UE虚幻引擎项目更改名字怎么操作?

首先找到项目目录&#xff0c;直接更改项目程序的名字&#xff0c;其次点击项目程序右击使用文本打开&#xff0c;然后将Modules模块中的内容删除即可&#xff0c;然后运行程序就好啦&#xff01;

如何将数据库导入MySQL的办法

在电脑cmd终端进行导入 首先找到MySQL中bin的位置 第一步&#xff1a;找到MySQL 第二步&#xff1a;进入MySQL 第三步&#xff1a;打开bin 第四步&#xff1a;输入cmd进入终端 第五步&#xff1a; 输入mysql -uroot -p 然后会弹出enter password&#xff1a; 输入你的密码…