当前位置: 首页 > news >正文

Lesson08---string类(1)

  • 1. 为什么要学习string
  • 2. 标准库中的string
  • 3. string类的模拟实现
  • 4. 扩展阅读

1. 为什么学习string类?

1.1 C语言中的字符串

在c语言中没有string类型只有char类型,char类型只能是一个字符非常的不好用,想要字符串还必须要弄一个char的数组非常的容易越界出现随机值

string就是字符串,string类其实就是在原来的基础上添加了增删查改扩容这些东西的,c语言里面的不符合面向对象编程

1.2 两个面试题(暂不做讲解)

牛客网-题目已下线_牛客网 (nowcoder.com)

. - 力扣(LeetCode)

OJ 中,有关字符串的题目基本以 string 类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string 类,很少有人去使用 C 库中的字符串操作函数。

2. 标准库中的string 

2.1 string(了解)

cplusplus.com/reference/string/string/?kw=string

1. 字符串是表示字符序列的类
2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
单字节字符字符串的设计特性。
3. string 类是使用 char( 即作为它的字符类型,使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信
息,请参阅 basic_string)
4. string 类是 basic_string 模板类的一个实例,它使用 char 来实例化 basic_string 模板类,并用 char_traits
allocator 作为 basic_string 的默认参数 ( 根于更多的模板信息请参考 basic_string)
5. 注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( UTF-8) 的序列,这个
类的所有成员 ( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。
总结:
1. string 是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。
3. string 在底层实际是: basic_string 模板类的别名, typedef basic_string<char, char_traits, allocator>
string;
4. 不能操作多字节或者变长字符的序列。
使用 string 类时,必须包含 #include 头文件以及 using namespace std

2.2 string类的常用接口说明(注意下面我只讲解最常用的接口)

sting类的默认成员函数

(1) empty string constructor (default constructor)

(1)默认构造函数

Constructs an empty string, with a length of zero characters.

构造一个长度为零个字符的空字符串。

 

 (2) copy constructors

(2) 复制构造函数

3) substring constructor

(3) 子字符串构造函数

Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is basic_string::npos).复制从字符位置 pos 开始并跨越 len 字符的 str 部分(或者直到 str 的末尾,如果 str 太短或 len 为 basic_string::npos)。

这里要注意的是 下标是从0开始 

注意看这里len是缺省参数,

 这里就可以理解成假如没有写这个参数就把后面所有的都拷贝过来,有多少拷多少

如果第三个参数明显大于被拷贝的,那么也是有多少烤多少

他的底层就类似于拷贝到char数组的/0,然后就停止拷贝

 

(4) from c-string

(4) 从 C 字符串

 

 (5) from buffer

(5) 来自缓冲区

Copies the first n characters from the array of characters pointed by s.

从 s 指向的字符数组中复制前 n 个字符。

 

 这里的第一个参数必须是要是在代码段上面的字符串

如果这里采用变量的形式就会和第四个冲突

和第四个的缺省会产生冲突 

(6) fill constructor 

(6) 填充构造函数

 string的赋值重载=这里给提供了三种         

3.string的赋值               

 4.string的底层

string的底层其实就是char数组封装成了类

它可以直接用下标直接修改访问

5.迭代器(iterator)

如果想遍历一个字符串我们可以这样

 

用下标的方式遍历

还可以用迭代器来遍历 

 这样也可以用来遍历,这里可以把迭代器理解成string类中是char的数组,那么这里面每一个char的地址就是迭代器,然后我们让string++是无法完成这种功能的

熟悉了以后可以直接这样写 

但是这里并不一定是一个指针 ,只是可以这样理解

迭代器可以用在后面的二叉树和链表里面

范围for的底层其实就是迭代器

6.反向迭代器

 如果想反着遍历一个字符串显然auto就不够用用了这里就需要用反向迭代器了

 

7.排序

如果想给一个string排序(给char的数组按字典序排序)

 

 

 只排序前俩个

8.string的尾插

这里有做限制只能插入一个字符不能插入字符串双引号下就不行 

 如果要添加字符串要用append

但是这俩种都不好用,string还提供了运算符重载 

 

9.string的尾删 

这里只可以删除一个字符

如果要删除一段字符的话需要 用erase

#include <iostream>  
#include <string>  int main() {  std::string str = "Hello, World!";  // 删除从索引5开始的所有字符  str.erase(5);  std::cout << str << std::endl; // 输出: Hello  // 重新赋值  str = "Hello, World!";  // 删除从索引5开始的7个字符  str.erase(5, 7);  std::cout << str << std::endl; // 输出: Hello!  // 重新赋值  str = "Hello, World!";  // 删除从索引5到索引12的字符  str.erase(str.begin() + 5, str.begin() + 12);  std::cout << str << std::endl; // 输出: Hello!  return 0;  
}

 


http://www.mrgr.cn/news/17591.html

相关文章:

  • Android 10.0 mtk平板camera2横屏预览旋转90度功能实现
  • .NET 环境中的数据库交互OLE DB与SqlClient
  • 【Python百日进阶-Web开发-Feffery】Day500 - dash使用秘籍
  • 从理论层面设计简单的电池管理系统(BMS)
  • 数据结构(五)——哈希表,数据排序方法
  • SpringBoot 引入使用消息队列RabbitMQ通信 配置连接 无路由模式
  • 灾难性遗忘问题(Catastrophic Forgetting,CF)是什么?
  • [Leetcode] 接雨水(相向双指针)
  • 如何在 CentOS 7 上安装 Nagios 4 并监控您的服务器
  • linux小程序-进度条
  • 详解JavaScript
  • Yolov5 AI学习笔记
  • MySQL唯一索引大小写敏感性问题及字符集深入解析
  • linux udev
  • Codeforces Round 970 (Div. 3) A~F
  • 深度学习速通系列:贝叶思和SVM
  • STM32+W5500实现以太网通信
  • [创业之路-145] :做项目做产品,50米/100米短跑与马拉松长跑,跑法不同,几人的小分队作战与兵团战役,打法不同
  • 【Kubernetes】持久卷声明 PVC
  • 机器学习之监督学习(二)逻辑回归(二元分类问题)