C++初阶 String类详解(上)

简介: C++初阶 String类详解(上)

本章目标


1.熟悉String类

2.熟悉各种String函数用法

3.能够熟练运用String类解决题目


一. String类的介绍


1.1 String类的由来


C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函

数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。


oop思想: 指的是面向对象编程


C++中对于string的定义为:typedef basic_string string; 也就是说C++中的string类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型。


至于我们为什么不直接用String标准数据类型而用类是因为一个叫做编码的东西


我们每个国家的语言不同 比如说英语使用26个英文字母基本就能表述所有的单词 但是对于中文的字符呢?是不是就要用其他编码方式啊(比如说utf-8)


1.2 String函数接口


常用函数如下


我们会讲解大部分重要的函数

896e6e790c6e436189fe34c8a5479d0e.png


二. String类读写


2.1 访问两种方式


我们这里有两种访问方式


下标访问


使用operator[]实现数组下标式的访问


但是在这之前 我们首先来看看这一段代码


string s1("hello world");
  cout << s1.size() << endl;


这里第一行代码的意思是初始化构造一个string类 初始化赋值为 hello world


s1.size()是表示的s1字符串的大小(这里使用s1.length())

bd8b26e149d94e60b9c8699014515ce3.png


之后我们开始使用下标进行访问 代码表示如下


string s1("hello world");
  //cout << s1.size() << endl; // s1.length()
  for (size_t i = 0; i < s1.size(); i++)
  {
  cout << s1[i] << ' ';
  }


这里其实等价于这一行代码


cout << s.operator[](i) << " ";


函数重载嘛

c8f084fe48ac4455891e096dcca179a9.png


at访问


代码表示如下

for (size_t i = 0; i < s1.size(); i++)
  {
  cout << s1.at(i) << ' ';
  }


运行结果如下


eb39ee3a94ee45058f9233793f6c4631.png


两种访问方式的区别


唯一的区别就是报错的时候

下标访问报断言错误

at访问报异常


81d74acf0bfb4e5eb2d014db514238a3.pngbcfa2d70ece8431499d0177aaa03bf49.png

2.2 迭代器读写


正向迭代器


老规矩 我们先来看迭代器的语法


string::iterator it = s.begin();


我们首先写个String类名 后面跟上iterator(迭代器) 再后面加上一个it


等于号的右边写上对象的begin() 或者 end()


我们目前将它当作指针来看待 目前这个阶段这样子理解就好


使用方式如下


string s("hello world");
  string::iterator it = s.begin();
  while (it != s.end())
  {
  cout << *it;
  it++;
  }


当然我们也可以来修改迭代器里面的内容


f4330bbe74a948909f9433c8bab57ecc.png


反向迭代器


我们先来看语法格式


string::reverse_iterator it = s.rbegin();


我们这里可以看到 其实变化的就是一个 reverse 还有最后的rbegin()


代码表示如下


string s("hello world");
  string::reverse_iterator it = s.rbegin();
  while (it != s.rend())
  {
  cout << *it;
  it++;
  }

27fde2cd5fbb45d4bc18406801bbb152.png

我们发现 这里是不是代码有很多啊 那么我们练习到之前的知识 是不是就能想起来一个auto关键字


那么我们试试行不行


fb2201fb5d1847d6a7590f62294a4878.png

所以这里是不是更能明确一点了 知识之间不是相互孤立的


const正向迭代器


相比于迭代器 其实这里的改变就是不能写了 只能读(权限缩小)


代码表示如下


int main()
{
  const string s("hello world");
  string::const_iterator it = s.begin();
  while (it != s.end())
  {
  cout << *it;
  it++;
  }
  return 0;
}

6ebbc1aca2ce4c4fa4db78fdc00bb0d8.png


这里肯定就不能修改啦 不然肯定会报错的

e5237cba5fab4b4d9b7ecbeaade20959.png


const反向迭代器


和正向迭代器一样 这里就不多解释了


代码跟运行图如下


int main()
{
  const string s("hello world");
  string::const_reverse_iterator it = s.rbegin();
  while (it != s.rend())
  {
  cout << *it;
  it++;
  }
  return 0;
}

f740c1e6a22840b880177da06ed146da.png


2.3 语法糖 范围for读写


这个我们也是在之前的auto语法里面讲过了 代码表示如下


string s("hello world");
  for (auto x : s)
  {
  cout << x << ' ';
  }

3dd2132373ef451197e1dc4b7456229d.png



那么我们想要修改呢?


是不是也讲过 直接使用他们的引用就可以了(不引用肯定是不可以的 因为这里只是一个简单的赋值)


42ea9e490b0242b28ece8dcb5d3123fe.png


三. String类的构造函数


构造函数几种重要的格式如下


e341aea561c44633a96d0da194222658.png


这里只讲解三个重点构造函数


无参构造


代码表示如下


string s;


我们debug来看看是什么效果

7a3dbfd2b7f9469d881aad493114ce1b.png


这里就是一个空字符串了


有参构造


和无参构造差不多 代码表示如下


string s("hello world");


还是一样debug看看

bd1b161101d84ceea3438221d265ab5b.png


这里可以发现 字符串的大小(size)变成了11 然后字符串里面的内容变成了 hello world


拷贝构造


代码表示如下


string s("hello world");
  string s1(s);


还是一样 debug看看

d3e09193dd0740d4a077d18931e83583.png


s1也变成了hello world捏


四. String容量接口函数

f579b4bc691d445fb1126c9af02fcb88.png


还是一样捏 咱们挑重点的介绍


size


首先还是一样 上代码


cout << s.size();


我们输出之后可以发现大小是11


这里是不是有点眼熟 我们debug看到的size是不是也是11啊 所以说这里就是将debug的值返回而已


empty


这个也很简单 判断是否为空的


比如说我们创建两个字符串 一个为空 一个不为空试试看

bef7aa0f7a754762827d901a1179210d.png


这里表示的很清楚了


clear


这里的clear函数可以和empty联动一下


我们发现清除之后两个字符串就变成全空了


62c7bfd1717b418d9ee23e12df2cb483.png


reserve


这个函数用于预先开空间 因为每当字符串长度大于容量的时候都会扩容


所以如果我们知道我们需要的空间是多少我们就可以使用这个函数了


我们可以发现 这里的空间变成了1007 (因为是按照1.5倍开空间的)


66aac8ae95a6406b92ae277722a57a2c.png


resize


我们这里使用resize可以改变size的大小 假如说我们size的大小大于字符串的size 后面就会以‘\0’结尾


baacddc2f8984c4298bc00efbb435fcb.png


假如我们resize的大小小于原来的大小 后面的字符就会截断

2187393e796644bebac21bae4e81078a.png

相关文章
|
11天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
51 18
|
11天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
37 13
|
11天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
37 5
|
11天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
28 5
|
11天前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
33 4
|
11天前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
26 3
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
101 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
78 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
129 5
|
3月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
81 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性

热门文章

最新文章