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

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

相关文章

游戏运行中突然掉线是什么原因导致的

游戏平稳运行的原因只有一个&#xff0c;掉线的原因各有个的不同。这些不同的原因有常见&#xff0c;也有不常见的。但不管出于什么原因的掉线&#xff0c;带来的损失又是相同的。 首先最常见的原因就是攻击造成的 像CC&#xff0c;DDOS。CC会造成服务器资源的浪费&…

深入理解 Goroutines 和 Go Scheduler

本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。 我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,…

专业面试刷题网站程序源码

介绍&#xff1a; 一个干净的面试刷题网站&#xff01;专业面试刷题网站&#xff0c;助你成为面试达人&#xff01;支持自由组卷、在线刷题、校招社招斩获大厂offer&#xff0c;求职必备! 用这个刷题代码&#xff0c;助你早日打进狼厂、鹅厂等各大厂&#xff0c;薪水直接等级…

Python装饰器新境界:详解装饰器重载内置操作

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python装饰器新境界&#xff1a;详解装饰器重载内置操作&#xff0c;全文3900字&#xff0c;阅读大约15分钟。 Python装饰器重载内置操作&#xff0c;我们通常指的是使用装饰…

P5729 【深基5.例7】工艺品制作

题目描述 现有一个长宽高分别为 w,x,h 组成的实心玻璃立方体&#xff0c;可以认为是由 111 的数个小方块组成的&#xff0c;每个小方块都有一个坐标 (i,j,k)。现在需要进行 &#xfffd;q 次切割。每次切割给出(x1​,y1​,z1​),(x2​,y2​,z2​) 这 6 个参数&#xff0c;保证…

作为一个的软件测试工程师,想拿到自己想要的薪资,需要具备哪些能力?

如果只是想成为一名低薪的测试工程师&#xff0c;只要掌握功能测试就可以。 但是如果想成为一名高薪的测试工程师&#xff0c;那就要打造你的不可替代性。 可是&#xff0c;你可能会说&#xff1a;“我现在就是个普通职员啊&#xff0c;我就是个普通人&#xff0c;我目前还没有…

go原生http开发简易blog(一)项目简介与搭建

文章目录 一、项目简介二、项目搭建前置知识三、首页- - -前端文件与后端结构体定义四、配置文件加载五、构造假数据- - -显示首页内容 代码地址&#xff1a;https://gitee.com/lymgoforIT/goblog 一、项目简介 使用Go原生http开发一个简易的博客系统&#xff0c;包含一下功能…

【动态规划精选题目】2、路径问题模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解路径问题模型中的6道经典题&#xff0c;会在讲解题目同时给出AC代码 目录 1、不同路径 2、不同路径2 3、珠宝的最大价值 4、下降路径最小和 5、最小路径和 6、地下城游戏 1、不同路径 class Solution { publi…

C语言使用posix正则表达式库

在C语言中&#xff0c;你可以使用 POSIX 正则表达式库&#xff08;regex.h&#xff09;来进行正则表达式的模式匹配。POSIX 正则表达式库提供了一组函数来编译、执行和释放正则表达式。 下面是使用 POSIX 正则表达式库的基本步骤&#xff1a; 包含头文件 <regex.h>&…

Ribbon使用

Ribbon &#xff1a;处理客户端负载均衡和容错的解决方案 配置Ribbon的负载均衡 Rule接口&#xff1a; 定义客户端负载均衡的规则 RandomRule :随机选择RoundRobinRuleZoneAvoidanceRule 配置ribbon的负载均衡策略 在配置文件中配置 user-center:ribbon:NFLoadBalancerRul…

Cheat Enginee(CE)详细使用指南

一&#xff0c;下载与安装 首先在CE的官网下载Cheat Engine的软件包&#xff0c;下载完成之后找到文件所在的位置&#xff0c;进入文件运行exe文件&#xff0c;这样就可以进入Cheat Engine的安装界面。进入安装界面后设置好安装路径点击Next即可安装。 或者通过下载压缩包&…

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制&#xff0c;但手动编写Parcela…

Course3-Week3-强化学习

Course3-Week3-强化学习 文章目录 Course3-Week3-强化学习1. 强化学习的问题引入1.1 什么是强化学习1.2 强化学习示例1.3 数学符号 2. 贝尔曼方程2.1 回报2.2 策略2.3 状态-动作价值函数2.4 贝尔曼方程2.5 随机环境(可选) 3. 连续状态空间3.1 连续状态空间的问题示例——登月器…

FastAdmin后台安装出现2054错误的解决办法

用Navicat修改密码验证方式。MySQL Workbench的Server菜单中的Users and Privileges菜单中似乎不支持此项修改。 修改完毕以后也许会报错&#xff1a; Access denied for user ‘root‘‘localhost‘ (using password: YES) 用以下命令无密进入mysql。 C:\Program Files\MySQ…

Mybatis Plus

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…

单片机期末复习

前言 发现很多人都写了单片机原理及接口技术课后习题的答案&#xff0c;但是也就只写了答案而已&#xff0c;可能是他们觉得太简单的缘故吧&#xff0c;我这里对此进行一下我近段时间复习的总结&#xff0c;本篇博客只展示选择题、填空题和判断题的答案&#xff0c;仅供参考&a…

Spring之容器:IOC(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

冒泡排序法

1.数组排序 题目描述 对数组的元素按从小到大进行排序。输入有两行 第一行有一个整数n( 5 < n < 10 ) 第二行有n个整数输出输出更新后的数组 样例 输入复制 8 1 2 3 6 8 7 4 5 输出复制 1 2 3 4 5 6 7 8 #include<iostream> using namespace std; int main(…

MySQL undo日志精讲

事务回滚的需求 我们说过事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; 情况一&#xff1a;事务执行过程中可能遇到各种错误&#xff0c;比如服务器本身…

PAT乙级 1011 A+B 和 C

解题思路 本题非常简单但是一样有坑&#xff0c;c语言写的时候一定要注意范围&#xff0c;如果你只用int型去写的话最大值相加一定溢出&#xff0c;所以你必须扩大字节数量&#xff0c;改成long long int, python没有此问题 c代码&#xff1a; #include<stdio.h> int …