C++初阶学习第六弹——探索STL奥秘(一)——标准库中的string类

news/2024/9/20 7:27:52/ 标签: c++, 学习, 开发语言

前言:

在前面,我们学习了C++的类与对象,认识到了C++与C语言的一些不同,今天,我们将进入C++的 关键部分——STL学习完这部分之后,我们就可以清楚的认识到C++相比于C语言的快捷与便利

目录

一、为什么有string类

二、标准库中的string类

1、什么是string类

2、string的常用接口函数

2.1 string类对象的构造

2.2 string的容量操作

2.3 string类的访问与遍历

2.4 string类对象的修改

2.5 string类常用的非成员函数

三、总结


一、为什么有string类

在我们学习C语言的时候,有一个点是非常难处理的,那就是字符串,在我们对字符串访问,增删查改时都是非常不便的,所以我们封装了一个string类主要来处理字符串有关的问题

二、标准库中的string类

1、什么是string类

我们可以简单的把string类理解为变长的字符数组,我们可以对它进行增删查改等一系列操作,同时有一些列封装的接口函数提供给我们可以让我们直接使用,一般我们需要的功能函数都有

string类的成员函数:

class string
{
private:char* a;int _capacity;int _size;
};

2、string的常用接口函数

在使用string类时,必须包含#include头文件以及using namespace std;

这些接口函数的原理我们在后面再讲,下面我们就先讲一下这些接口函数的用法,学会了用法就可以直接使用string类来做题了,这部分内容没啥重点讲解的,下面主要是直接给出代码示例

2.1 string类对象的构造

代码实例:
#include<string>
#include<iostream>
using namespace std;
int main()
{string();               //1、构建了一个空的string对象,这个对象只在本行起作用,除非加const修饰string s1("abc");       //2、直接构造cout << "s1:" << s1 << endl;char arr[] = "abc";string s2(arr);         //3、用一个字符串的首地址来构造cout << "s2:" << s2 << endl;string s3 = s1;         //4、拷贝构造(用一个已经存在的类对象给另一个对象初始化)cout << "s3:" << s3 << endl;string s4(3, 'x');      //5、构造时将前N个赋值为同一个字符cout << "s4:" << s4 << endl;return 0;
}

运行结果:

2.2 string的容量操作

代码实例:
#include<string>
#include<iostream>
using namespace std;
int main()
{string s1("abcdef");cout <<"s1:"<< s1 << endl;cout << "size:" << s1.size() << endl;        //有效字符的个数cout << "length:" << s1.length() << endl;    //有效字符的个数//上面这两个功能上差别不大,一般我们用size()用的多一点cout << "capacity:" << s1.capacity() << endl;   //开辟的空间大小(当空间不够时会自动扩容,扩容空间为原空间的1.5倍(与环境有关))cout << "empty:" << s1.empty() << endl;     //检查字符串是否为空,0表示非空,1表示空s1.clear();                                 //清空字符串cout <<"s1:"<< s1 << endl;s1.reserve(100);                            //开辟指定大小空间(一般会多一点)cout << "capacity:" << s1.capacity() << endl;s1.resize(5, 'a');cout << "size:" << s1.size() << endl;cout << "s1:" << s1 << endl;return 0;
}

运行结果:

2.3 string类的访问与遍历

代码实例:

#include<iostream>
using namespace std;
#include<string>
int main()
{string s1("abcdef");//访问方法:下标访问法cout << s1[0] << endl;cout << s1[3] << endl;s1[0] = 'h';//1、下标遍历法cout << "下标遍历法:";for (int i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;//2、迭代器法(正向)cout << "迭代器法(正向):";string::iterator it = s1.begin();for (; it != s1.end(); it++){cout << *it << " ";}cout << endl;//3、迭代器(反向)cout << "迭代器(反向):";string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";rit++;}cout << endl;//范围for法cout << "范围for法:";for (auto e : s1){cout << e << " ";}cout << endl;return 0;
}

运行结果:

2.4 string类对象的修改

代码实例:

#include<iostream>
using namespace std;
#include<string>
int main()
{string s1("zhan");cout << s1 << endl;//push_back  在末尾加入字符cout << "push_back后:";s1.push_back('g');cout << s1 << endl;//append     在末端加入字符串cout << "append后:" ;s1.append(" san");cout << s1 << endl;//operator+= 在末端随意添加cout << "+=后:";s1 += " 18";cout << s1 << endl;//c_str    返回C格式字符串cout << "c_str:";const char* m = s1.c_str();cout << m << endl;//find  从pos位置开始查找字符并返回其位置cout << "find:";int npos1 = s1.find('a');cout << npos1 << endl;//rfind  从pos位置开始往前查找字符并返回其位置cout << "rfind:";int npos2 = s1.rfind('a');cout << npos2 << endl;//substr  从pos位置开始截取n个字符并返回cout << "substr后:";string tmp = s1.substr(npos1, npos2 - npos1);cout << tmp << endl;return 0;
}

运行结果:

2.5 string类常用的非成员函数

代码实例:

#include<iostream>
using namespace std;
#include<string>
int main()
{string s1("hello ");string s2("world");//operator+    涉及深层拷贝,不建议多用cout << "operator+后:";cout << operator+(s1, s2) << endl;//operator>>   输入运算符重载cout << "operator>>:";string s3;operator>>(cin,s3);cout << s3 << endl;//operator<<    输出运算符重载cout << "operator<<:";operator<<(cout, s1) << endl;//getline      获取一行字符串cout << "getline:";string s4;getline(cin, s4);    //这个在这个程序中测不出来,需要单独测试cout << s4 << endl;//relational operators   比较大小//这个函数库中有各种各样的比较函数(==、>、<......),函数类型为bool,感兴趣的可以自己探索一下return 0;
}

运行结果:

三、总结

上面的就是我们常用的string类的类成员函数以及类外函数,由于这些函数已经封装好了,所以我们平时可以直接使用,至于如何实现这些函数,我们下章再讲

感谢各位大佬观看,创作不易,还请一键三连!!!


http://www.ppmy.cn/news/1462164.html

相关文章

Mysql 事务隔离级别

前言 在数据库管理系统中&#xff0c;事务&#xff08;Transaction&#xff09;是保证数据一致性和完整性的重要机制。在并发环境下&#xff0c;多个事务同时操作相同的数据可能会引发各种问题&#xff0c;如脏读、不可重复读、幻读等。为了解决这些问题&#xff0c;MySQL提供…

[力扣题解]55. 跳跃游戏

题目&#xff1a;55. 跳跃游戏\ 思路 贪心法&#xff1b; 本题不考察怎么样到达终点的&#xff0c;只关注能不能到达终点&#xff1b; Method 1 自己写的 // 本题不考察怎么到达终点的&#xff0c;而是能不能到达; class Solution { public:bool canJump(vector<int>…

三相电子负载:技术创新与发展

随着科技的不断发展&#xff0c;电力系统的需求也在不断增长。为了满足这些需求&#xff0c;充电三相电子负载技术也在不断创新和发展。这种技术主要用于测试和验证电源、充电器、电池等设备的性能和可靠性&#xff0c;以确保它们能够在各种条件下正常工作。 充电三相电子负载的…

《QT实用小工具·六十三》QT实现微动背景,界面看似静态实则动态

1、概述 源码放在文章末尾 该项目实现了微动背景&#xff0c;界面看似静态实则动态&#xff0c;风动&#xff0c;幡动&#xff0c;仁者心动&#xff0c;所以到底是什么在动&#xff1f;哈哈~ 界面会偷偷一点一点改动文字颜色的颜色填充。 虽然是动态&#xff0c;但是慢到难以…

python手写数字识别(PaddlePaddle框架、MNIST数据集)

python手写数字识别&#xff08;PaddlePaddle框架、MNIST数据集&#xff09; import paddle import paddle.nn.functional as F from paddle.vision.transforms import Compose, Normalizetransform Compose([Normalize(mean[127.5],std[127.5],data_formatCHW)]) # 使用tran…

MPLAB X IDE编译attiny1616工程报错却无报错信息

MPLAB X IDE(XC-8编译器)编译报错&#xff0c;无具体错误内容&#xff0c;仅显示需要xc-8 pro的警告。 内存占用率显示为81%&#xff0c;未超标。 原因&#xff1a;软件使用了microchip的bootloader功能。应用程序起始地址&#xff08;也是bootloader结束地址&#xff09;设置错…

FileLink如何实现金融行业跨网文件传输

在金融行业&#xff0c;跨网文件传输一直是一个备受关注的问题。由于金融数据的敏感性和重要性&#xff0c;如何确保文件在传输过程中的安全性、稳定性和合规性成为了金融机构急需解决的难题。而FileLink作为一款跨网文件交换系统&#xff0c;凭借其强大的功能和优势&#xff0…

python学习-使用pandas库分析excel表,并导出所需的表

核心代码 # 导入pandas库 import pandas as pd # 导入正则表达式包 import re# 指定Excel文件的路径&#xff0c;这个data.xlsx表为原始表&#xff0c;表内有40个sheet子表 file_path data.xlsx # 读取各个子表 allDf pd.read_excel(file_path, sheet_nameNone) # 获取各个子…

AndroidStudio中如何配置共享变量,以便于方便配置共享

文章目录 一、定义共享变量二、引入通用配置三、在Module中使用这个通用配置 Android studio Gradle配置通用配置 在使用Android studio Android开发中Gradle通常会遇到很多相同的配置例如在不同的module中都要配置相同的compileSdkVersion、buildToolsVersion等 这时我们可以…

低代码在物品领用领域数字化转型的案例分析

办公用品管理数字化不仅代表了企业管理模式的革新&#xff0c;更是提升运营效率和成本控制的关键举措。通过数字化手段&#xff0c;企业能够实现采购、库存、领用等流程的自动化和智能化管理&#xff0c;大幅减少人工操作&#xff0c;提高处理速度&#xff0c;确保数据的准确性…

职责链模式

职责链模式 文章目录 职责链模式什么是职责链模式通过示例了解职责链模式 什么是职责链模式 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链&#xff0c;并沿着这条链传递该请…

element 表格滚动条滑动,表格错位

解决办法&#xff08;主要是根据滚动条的宽度决定的&#xff0c;可自行调整&#xff09; 1、.el-table__header-wrapper { width: 99.3% !important; } 2、.el-table__header-wrapper { padding-right: 10px!important; }

【MySQl】MySQL概述 | 数据库的操作 | MySQL的编码问题 | 连接器的工作流程

文章目录 一、MySQL概述1.数据库的概念MySQLMySQL中支持的数据类型&#xff1a; 2.数据库的操作1.创建数据库2.查看数据库3.选中数据库4.删除数据库 3.数据表的操作1.创建表2.查看当前数据库中的所有表3.查看指定表的结构4.删除表 二、MySQL的编码问题常见的编码类型 连接器的工…

nacos与spring cloud gateway 一起的使用的时候uri: lb://server-name配置不起用

首先我们将uri配置成本地地址测试服务是否可以调通 spring:cloud:nacos:discovery:server-addr: xxx.xxx.xxx.xxx:8848gateway:routes:- id: angular_appuri: http://localhost:8082predicates:- Path/angular/**filters:- StripPrefix1xxx.xxx.xxx.xxx:8848 切换成你的nacos服…

python高级爱心代码

python高级爱心代码实现&#xff1a; import turtle import random # 设置画布 screen turtle.Screen() screen.bgcolor("black") # 创建画笔 pen turtle.Turtle() pen.speed(0) pen.color("red") pen.penup() # 移动画笔到起始位置 pen.goto(0, -20…

视频剪辑批量转码技巧:如何将MP4视频快速转换为MP3音频的方法

在视频剪辑和音频处理的领域中&#xff0c;经常需要将视频文件转换为音频文件&#xff0c;特别是将MP4视频转换为MP3音频。这样的转换不仅可以减少文件大小&#xff0c;方便传输和存储&#xff0c;还可以在不损失音频质量的情况下&#xff0c;方便在各种设备上播放。下面&#…

无独立显卡如何安装Pytorch

以前我是直接在colab中使用pytorch&#xff0c;非常方便&#xff0c;今天折腾了一上午&#xff0c;终于搞定了pytorh的安装和环境设置&#xff0c;分享下我的安装流程&#xff0c;遇到的问题和解决方案。 1. 用pip安装Pytorch 打开cmd窗口&#xff08;按win R&#xff09;&a…

Acwing2024蓝桥杯BFS

AcWing 1355. 母亲的牛奶 bfs: #include<iostream> #include<queue> using namespace std; const int N21; int A,B,C; bool flag[N][N][N]; struct node{int a,b,c; }; queue<node>q; void check(int a,int b,int c){if(!flag[a][b][c]){q.push({a,b,c})…

【大数据】计算引擎MapReduce

目录 1.概述 1.1.前言 1.2.大数据要怎么计算&#xff1f; 1.3.什么是MapReduce&#xff1f; 2.架构 3.工作流程 4.shuffle 4.1.map过程 4.2.reduce过程 1.概述 1.1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;专栏地址&#xff1a; https://blog.csdn.ne…

Risk Of Rain 雨中冒险2服务器开服联机教程

1、购买后登录服务器&#xff08;百度莱卡云&#xff09; 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、设置游戏端口 由于雨中冒险2的设置需要两个端口&#xff0c;它们用于游戏端口&#xff0c;查询端口&am…