【C++初阶】string 类的认识与学习

简介: 【C++初阶】string 类的认识与学习

 

在学习string类之前,先在这里推荐2个好用的网站,可以用来查阅C++的相关知识

https://cplusplus.com

https://en.cppreference.com/w/

上面的是非官方的,下面的官方的,但是个人感觉还是上面的好用。

一.string 类是什么

简单来说,string 是C++中用来管理字符串的类。

他有很多接口,大致分为:

1.string类对象的构造

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

3.string类对象的容量操作

4. string类对象的修改操作

5.string类非成员函数

下面开始介绍。


二.string类对象的构造

可以看到,库里一共有7种构造方式,但我们常用的是(1),(2),(4),其它并不怎么用,如果想要了解的话,可以自行查看文档。

1. int main()
2. {
3.     string s1;  //不初始化(1)
4. string s2("hello world");  //常量字符串初始化 (2)
5. string s3(s2);   //string 类型初始化  (4)
6. 
7. return  0;
8. }

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

库里重载了 [] 运算符,这就允许我们可以像C语言中一样,用 [] 加下标的方式访问string类对象。

string类的遍历有很多种方法:

1.像C语言中数组的遍历方式

1. string s("hello world");
2. for (int i = 0; i < s.size(); i++)
3.     {
4.         cout << s[i] << endl;
5.     }

2.范围for

1. for (auto ch : s)
2.     {
3.         cout << ch<< endl;
4.     }

注意范围for只能正向遍历

3.迭代器  iterator

1.     std::string::iterator it = s.begin();
2. while (it != s.end())
3.     {
4.         cout << *it << endl;
5.         it++;
6.     }

迭代器是封装在string类里面的,所以要以上述方式使用。

迭代器是像指针一样的类型,但并不完全是指针,它提供了一种统一的方式修改和访问容器的数据,不像前两种方式需要是数组,且范围for是用迭代器实现的。

迭代器有很多接口:

rbegin和rend是反向迭代器的接口,后面的4个并不常用,就不做过多介绍了 。


四.string类对象的容量操作

size和lengh的功能差不多,但还是推荐用size;

resize可以设置size,如果你设置的比你实际的有效数据小,则多的会被舍弃

reserve可以设置capacity,但他实际设置的空间,比你预想的要大

如果想要用reserve实现缩容的操作,则需要先清空有效数据,否则无效


五.string类对象的修改操作

库里提供很多修改string类对象的接口,但我们最常用,用的最爽的还是 += ,这个清楚明了,你不用担心它的容量问题,它会自动扩容的

它支持string类对象,常量字符串,字符

下面再介绍几个常用的:

find与rfind

find可以在一个字符串中从pos处开始寻找字符或是字符串,并返回第一个与之匹配的下标 ,如果没有找到,则返回npos,npos的值其实是-1

rfind顾名思义,就是反向查找,功能和find还是一样的。

substr

截取从 pos 到 len 的子串

例:分离一个网址的协议,域名和资源

1. int main()
2. {
3.  string ur = "https://tsunagarujp.bunka.go.jp/level02/b13";
4. 
5.  size_t pos1= ur.find("://");
6.  string protocol;  //协议
7.  string domain;  //域名
8.  string uri;   //资源
9. 
10.   protocol = ur.substr(0, pos1);
11.   cout << protocol << endl;
12.   size_t pos2 = ur.find("/",pos1+3);
13.   domain = ur.substr(pos1 + 3, pos2 - pos1 - 3);
14.   cout << domain << endl;
15.   uri = ur.substr(pos2 + 1);
16.   cout << uri << endl;
17. 
18.   return 0;
19. 
20. 
21. }

c_str

返回string类中字符串的地址,因为string类既包括了字符串,也包括了size,capacity这些变量,有时为了更好的配合C语言,会使用这个函数。

请看例题:

1. //以下代码的运行结果是什么?
2. int main()
3. {
4. 
5.  string a="hello world";
6.  string b=a;
7.  if (a.c_str()==b.c_str())
8.         cout<<"true"<<endl;
9. else
10.         cout<<"false"<<endl;
11. 
12.     string c=b;
13.     c="";
14. if (a.c_str()==b.c_str())
15.         cout<<"true"<<endl;
16. else
17.         cout<<"false"<<endl;
18. 
19.   a="";
20. if (a.c_str()==b.c_str())
21.     cout<<"true"<<endl;
22. else
23.         cout<<"false"<<endl;
24. 
25.   return 0;
26. 
27. }
28.

答案:false  false  false

getline

获取一行字符串(包括空格)

这个就弥补了cin>> 的不足,cin>> 是遇到空格就停止读取了。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼


目录
相关文章
|
2天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
2天前
|
C++
模拟实现c++中的string
模拟实现c++中的string
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
68 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
50 13
|
1月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
58 16
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
52 5
|
1月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
40 5
|
2月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
67 4
2023/11/10学习记录-C/C++对称分组加密DES
|
1月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
48 4
|
1月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
32 3