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;  
}

 

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值