【C++】STL之string类(1)

news2024/10/7 20:32:13

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

前言

接下来就开始STL部分的学习了,本文先来学习一下C++中STL的string类

目录

  • 前言
  • 一、什么是string类
  • 二、标准库中的string类
  • 三、string类的常用接口说明
    • (1)string类中的常见构造
      • 3.1默认构造函数(string())
      • 3.2字符指针构造函数(string(const char* s))
      • 3.3字符构造函数(string str("hello");)
      • 3.4重复字符构造函数(string s(size_t n, char c))
      • 3.5拷贝构造函数(string::string(const string& str);)
      • 3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);
      • 字符串的比较
    • (2)std::string类的析构函数
    • (3) string类对象的修改操作
      • push_back()
      • append()
      • operator+=
    • (4)string类对象的访问及遍历操作
      • operator[]
        • 迭代器的小拓展

一、什么是string类

首先,string类是一个管理字符串的类。在日常中,字符串中是非常常见的,但凡是复杂一点的类型,都需要用字符串来进行展示。

在C语言中,我们学习了strxxx的库函数(管理字符串),但是其实C语言中strxxx的库函数不是很好,因为C语言中str系列的库函数只能对字符串进行一些简单的操作,比如说求字符串的长度,字符串的拷贝,很明显不能满足我们日常的需求。

而在C++中的string类中,我们可以对字符串进行各种增删查改和一些算法操作。日常中一些很复杂的信息都是用字符数组来进行展示的,故C++中的string类就是用来管理字符数组的

这里推荐一下学习C++文档的网址:

网址1
网址2(推荐用网址2),ctrl+F进行搜索。

二、标准库中的string类

在这里插入图片描述

我们如果想要使用string类的话就需要包头文件,STL本身就属于C++标准库中的一部分,而标准库中的内容都在std的命名空间中
所以如果我们想要使用string类的话,我们可以展开std的命名空间(即string s1),如果我们不展开std的命名空间的话,我们可以这样使用:std::string s2
我们先来简单使用一下string类:

#include<iostream>
using namespace std;

int main()
{
	string s1;//展开了命名空间就是这样使用
	std::string s2;//没有展开命名空间就这样使用就可以

	std::string name("李四");
	name = "李四";
	return 0;
}

这里是string类的成员函数,其实就是string类的默认成员函数
在这里插入图片描述
我们可以看到这里constructor中实现了7个构造函数,请看:
在这里插入图片描述
我们在来看destructor中的析构函数,请看:
在这里插入图片描述
我们在来看operator=中里一共有3个赋值运算符重载,请看:
在这里插入图片描述

三、string类的常用接口说明

(1)string类中的常见构造

3.1默认构造函数(string())

string str:创建一个空字符串对象
在这里插入图片描述

3.2字符指针构造函数(string(const char* s))

字符指针构造函数:从一个指向字符串的字符指针str中创建字符串对象。

const char *s = "Hello, World!";
string str(s); // 字符指针创建字符串

在这里插入图片描述

3.3字符构造函数(string str(“hello”)😉

字符构造函数:一组字符创建字符串对象,比如string str("hello");
在这里插入图片描述

3.4重复字符构造函数(string s(size_t n, char c))

重复字符构造函数(string s(size_t n, char c)):创建一个包含n个字符c的字符串对象。第一个参数是所需长度,第二个参数是重复的字符。

比如:string str(5, 'x'); // 创建一个包含5个重复字符'x'的字符串
在这里插入图片描述

3.5拷贝构造函数(string::string(const string& str);)

重复构造函数:从一个已存在的字符串对象创建新的字符串对象。
语法:string::string(const string& str);
拷贝构造函数的参数是一个常量引用,它引用了要被复制的字符串对象。拷贝构造函数会创建一个新的字符串对象,该对象的内容与被复制的字符串对象相同。

请看举例: 在这里插入图片描述

3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);

string(const string& str, size_t pos, size_t len = npos)是字符串类std::string的构造函数之一,它有三个参数

  • const string& str:一个常量引用,表示要从中截取子串的原字符串。
  • size_t pos:一个整数,表示从哪个位置开始截取子串。
  • size_t len = npos:一个整数,表示要截取的子串的长度,默认值为std::string::npos,表示截取从pos开始到结尾的所有字符。

该构造函数的作用:创建一个新的字符串对象,其中包含从原字符串的pos位置开始,长度为len的子串。如果len没有指定或者指定为std::string::npos,则截取到原字符串的结尾。

例如:假设有一个字符串str=“Hello,
world!”,我们想要从中截取子串"world",可以通过如下方式使用该构造函数:std::string sub_str(str, 7, 5); // 从位置7开始截取长度为5的子串

其中,7表示从第8个字符开始,5表示指定的子串长度。在这个例子中,sub_str 的值为 “world”。

需要注意的是,在使用该构造函数时,pos和len都必须是有效的,否则可能导致未定义的行为。例如,如果len的值超过原字符串的长度,可能会访问非法内存。为了避免这种情况,可以使用std::string::substr()函数来截取子串。

string (const string& str, size_t pos, size_t len = npos);
在这里插入图片描述
这里npos是什么呢?我们来看一下:
在这里插入图片描述

npos是一个静态成员变量
在这里插入图片描述
在这里插入图片描述

再举一些比较有趣的例子,请看:
在这里插入图片描述

字符串的比较

现在来看一下比较字符串的内容,请看:
在这里插入图片描述
在这里插入图片描述

好了,以上就是string类中的常见的默认构造函数,用到比较多的构造函数:无参的构造,带参的字符串构造和拷贝构造。

(2)std::string类的析构函数

std::string类的析构函数会自动释放字符串所占用的内存,其定义如下:

~string();

因为std::string类是基于动态内存分配来实现字符串的,因此在对象被销毁时,它所占用的内存也需要被释放。std::string类的析构函数会自动调用delete[]来释放动态分配的内存,确保不会出现内存泄漏的情况。

需要注意的是,当在std::string对象的作用域结束时,析构函数会被自动调用,对应的内存也会被释放。在删除对象时,不需要显式调用析构函数。

(3) string类对象的修改操作

push_back()

push_back():用于在字符串的末尾添加一个新的字符。
例如:

string str = "hello";
str.push_back('!');
// 现在str的值为 "hello!"。

append()

append():用于在字符串的末尾添加新的字符或字符串。
例如:

string str = "hello";
str.append(" world");
// 现在str的值为 "hello world"

在这里插入图片描述

operator+=

operator+=:在字符串后追加字符串str。
在这里插入图片描述
在这里插入图片描述

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

operator[]

在这里插入图片描述

operator[]:用于访问字符串中每一个字符的下标运算符。
第一种语法:用于非常量对象,返回一个指向字符串中位置 pos 的字符的引用。可以对该引用进行修改,从而改变字符串中该字符的值。

在这里插入图片描述
在这里插入图片描述
第二种语法:用于常量对象,返回一个指向字符串中位置 pos 的字符的常引用。由于该引用是常量引用,因此不能对它进行修改,只能用于读取字符串中的字符。
在这里插入图片描述
这里我们表面上看着str1[0]++str2[0]++是一样的,但实际上是不一样的。
在这里插入图片描述

迭代器的小拓展

下面是迭代器的一个小拓展,这里先了解一下:
在这里插入图片描述
在这里插入图片描述
我们也可以对迭代器进行修改,请看:
在这里插入图片描述

范围for底层就是一个迭代器:
在这里插入图片描述

任何容器都支持迭代器

int main()
{
	list<int> lt;
	lt.push_back(520);
	lt.push_back(521);
	lt.push_back(522);
	lt.push_back(523);
	list<int>::iterator lit = lt.begin();
	while (lit != lt.end())
	{
		cout << *lit << ' ';
		lit++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

总结一下
迭代器是一个像指针一样的类型,有可能是指针,有可能不是指针。
iterator提供了一种统一的方式来访问修改容器的数据。
算法可以通过迭代器去修改容器中的数据。

好了,本文就到这里了,主要介绍了string类中的常见接口函数。算是打开了string类的一个大门。
一起加油吧,各位友友们!再见啦!!!
在这里插入图片描述

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

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

相关文章

19项网络与数据安全新国标全文公开免费下载

根据2023年5月23日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2023年第2号&#xff09;&#xff0c;全国信息安全标准化技术委员会归口的19项网络安全国家标准正式发布。近日&#xff0c;标准全文正式公开&#xff0c;博主第一时…

【社区图书馆】疯狂 Java 讲义:但凡种种,不一而足

虽说酒香不怕巷子深&#xff0c;但是千里之外并不一定能闻到&#xff0c;有人看到这可能会感觉这不免有些杠的味道&#xff0c;其实我想表达的是好酒也需要宣传&#xff0c;比如今天我所要讲的这本书《疯狂Java讲义》。 这不是【赠书活动】&#xff0c;这不是赠书活动… …&…

ChatGPT辅助学Qt6.2——1.Qt安装及编写登录界面

本文旨在帮助读者理解如何使用ChatGPT来辅助安装和学习Qt 6.2。我们将从Qt 6.2的基本概念开始&#xff0c;然后深入了解其安装过程&#xff0c;并探讨如何使用ChatGPT作为一个强大的辅助工具。对于那些寻求在学习和使用Qt 6.2中找到有效支持的人来说&#xff0c;这篇文章将提供…

中国电子学会2023年05月份青少年软件编程Python等级考试试卷五级真题(含答案)

2023-05 Python五级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 有列表L[UK,china,lili,"张三"]&#xff0c;print(L[-2])的结果是&#xff1f;&#xff08; C&#xff09; A. UK B.…

华为防火墙基础知识

1.什么是防火墙 墙&#xff0c;始于防&#xff0c;忠于守。自古至今&#xff0c;墙予人以安全之意。防火墙&#xff0c;顾名思义&#xff0c;阻挡的是火&#xff0c;这一名词起源于建筑领域&#xff0c;其作用是隔离火灾&#xff0c;阻止火势从一个区域蔓延到另一个区域。 而…

Spring常见问题

包含内容 单例bean线程是安全的吗&#xff1f; Spring框架中的bean是单例的吗&#xff1f; 是单例的 这个默认是单例的但是可以在Bean注解类文件使用Scope注解进行配置 singleton&#xff1a;bean在每个Spring IOC容器中只有一个实例prototype&#xff1a;一个bean的定义可以…

C语言指针入门学习、知识点梳理(三)

本篇继续深入介绍C语言指针的基本概念与知识点&#xff0c;以经典指针程序--------”互换两个数字“进行阐述&#xff0c;基础不牢地动山摇&#xff0c;有关指针的基础概念&#xff0c;需要提前学习的&#xff0c;可以通过链接跳转至第一、第二篇。 C语言指针入门学习、概念梳…

Linux常见指令

Linux常见指令 引言Linux常见指令查指令——man文件管理相关指令lspwdcdtouchmkdirrmdir与rmrmdirrm cpmvfind 文件查看类catmorelesshead 与 tailheadtail使用管道显示某段内容 grep 打包压缩相关指令zip/unziptar 总结 引言 Linux与我们熟悉的Window都是操作系统&#xff0c…

C语言之指针详解(6)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指向函数指针数组的指针 指向函数指针数组的指针是一个指针指针指向一个数组 &#xff0…

【Shiro】第三章 Shiro入门

目录 1、身份认证 2、Realm 3、编码、散列算法 4、Realm使用散列算法 1、身份认证 【1】基本流程 流程如下: 1、Shiro把用户的数据封装成标识token,token一般封装着用户名&

《C++程序设计原理与实践》笔记 第19章 向量、模板和异常

本章将完成最常见、最有用的STL容器vector的设计与实现。我们将展示如何实现元素数量可变的容器&#xff0c;如何以参数形式指定容器的元素类型&#xff0c;以及如何处理越界错误。本章使用的技术依赖模板和异常&#xff0c;因此我们将介绍如何定义模板&#xff0c;并给出资源管…

糖化学试剂:4594-52-9,1,3,5-三乙酰基-2-脱氧-D-赤式戊呋喃糖,试剂用途说明

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;4594-52-9 中文名&#xff1a;1,3,5-三乙酰基-2-脱氧-D-赤式戊呋喃糖 英文名&#xff1a;1,3,5-Tri-O-acetyl-2-deoxy-D-erythro-pentofuranose 沸点 &#xff1a;329.342.0 C at 760 m…

vue2、vue3分别配置echarts多图表的同步缩放

文章目录 ⭐前言⭐使用dataZoom api实现echart的同步缩放&#x1f496; vue2实现echarts多图表同步缩放&#x1f496; vue3实现echarts多图表同步缩放 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享在vue2和vue3中配置echarts的多图表同步缩放 背景&#xf…

进程描述+PCB+fork用法介绍

进程控制块PCB 进程id&#xff1a;系统中每个进程有唯一的id,在c语言中用pid_t 表示&#xff0c;其实就是非负整数进程的状态&#xff1a;就绪&#xff0c;运行&#xff0c;挂起&#xff0c;停止&#xff0c;僵尸等状态进程切换是需要保存和恢复的一些cpu寄存器描述虚拟地址空…

微调Hugging Face中图像分类模型

前言 本文主要针对Hugging Face平台中的图像分类模型&#xff0c;在自己数据集上进行微调&#xff0c;预训练模型为Google的vit-base-patch16-224模型&#xff0c;模型简介页面。代码运行于kaggle平台上&#xff0c;使用平台免费GPU&#xff0c;型号P100&#xff0c;笔记本地址…

【惯性导航】隧道、高架桥、高楼林立弱信号环境室外定位_惯导模块

汽车行驶在路上&#xff0c;视野可能会受到周边的树木、同行的卡车、城市楼群的遮挡&#xff0c;卫星导航系统容易受到周围环境的影响&#xff0c;例如树木楼房等&#xff0c;造成多路径效应&#xff0c;使得定位结果精度降低甚至丢失&#xff0c;尤其是在隧道或者室内环境中&a…

树莓派开Samba协议和Windows电脑共享资料

文章目录 1. 前言2. 树莓派安装和配置Samba2.1. 更新源2.2. 安装Samba软件2.3. 修改Samba配置文件2.4. 重启Samba服务2.5. 添加用户到Samba 3. Windows访问共享目录3.1. 查看树莓派的地址3.2. 打开这个IP地址 4. 报错4.1. 用户名或者密码不正确 1. 前言 虽然出门派很方便&…

C++算法————二分查找

又是鸽了三千万年 马上要打csp了&#xff0c;开始回流学j组的知识了&#xff0c;浅说一下二分吧&#xff08;&#xff09; --------------------------------------------------------------------------------------------------------------------------------- 二分查找 …

tsx写法

1.安装插件 npm install vitejs/plugin-vue-jsx -D vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx; // https://vitejs.dev/config/ export default defineConfig({plugins: [vue(),v…

TC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4

STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 Proteus仿真小实验&#xff1a; STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 LCD1602显示器DS18B20温度传感器蜂鸣器 1.单片机读取DS18…