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

简单了解string类的特性及使用(C++)

string的特性

string类不属于STL,它属于标准库

但由于它具有数据结构的特性,所以从归类的角度,可以将string类归类到容器里面去

在C++标准库中,std::string 是一个特化的类型,实际上是 std::basic_string 的别名。std::basic_string 是一个模板类std::basic_string属于C++标准模板库(STL)的一部分),它允许指定字符类型和其他特性(如分配器),而 std::string 则是专门为处理 char 类型字符序列设计的一个具体实例。

所以底层可以认为 string类就是 管理char类型 字符数组的顺序表

(以下图片由cplusplus.com - The C++ Resources Network网站得来)

可以看出不仅有char 字符类型,还有char16_t 等等字符类型,本质上是由于不同编码存在的差异

我们用得最多的是utf-8,它是变长编码,兼容ascll,string就更适用于utf-8

使用string之前,记得要包含<string>头文件

string的构造函数分为7种,赋值重载分为3种

string的构造函数

默认构造函数

  • 语法:string s;

  • 作用:创建一个空字符串。

初始化构造函数

  • 语法:string s("hello");

  • 作用:使用字符串常量初始化字符串对象。

拷贝构造函数

  • 语法:string s1(s2);

  • 作用:使用一个已存在的字符串对象初始化新对象。

指定字符数构造函数

  • 语法:string s(5, 'a');

  • 作用:创建一个包含5个字符'a'的字符串。

子字符串构造函数

其中pos是postition的缩写,意思是 从string类型变量 str 的pos位置 开始的len个字符进行构造

len是半缺省参数,使用npos作为默认值

npos是类里的静态成员变量,定义为-1,指得是整型的最大值(也就意味着如果不给第二个参数,默认取到字符串结尾,因为单个字符串很难达到 -1 这么大的长度)

同时,如果给的长度超过了指定字符串的长度,也默认取到字符串结尾

比如下图中的字符串 c,要取20个字符,就只会输出从下标为2位置开始的后面所有字符

拷贝字符串的前n个

  • 语法:string s("hello", 2);

注意要与 子字符串构造函数 相互区分

迭代器范围构造函数

  • 语法:string s(s2.begin(), s2.end());

  • 作用:使用迭代器范围初始化字符串对象。

string的赋值

分别是string类型的赋值,字符串类型的赋值和字符类型的赋值

string的遍历

1、下标加方括号

分别分为 被const修饰 和没有被const修饰 的方括号操作符

编译器调用时会通过string类型 自动调用最匹配的

2、迭代器

使用string的内置迭代器,也可以进行string的遍历

由于迭代器一般会使用类的形式进行实现,相当于在类里面再定义一个类(嵌套类),所以在外部进行访问迭代器时,需要使用类作用限定符指定所在类(string类的迭代器就在string类)

begin函数 返回的是指向开始位置的迭代器,end是结束位置(有效字符 不包括‘\0’)的下一个位置的迭代器(左闭右开)

由于每个容器底下都有个迭代器类型,因此可以实现与底层结构的解耦,以及与算法的解耦

insert头插

有七种,这里只介绍其中三种

意思就是在pos位置前插入 s 字符串

可以看到字符串“hello”成功的插入到了下标为0的位置 ‘w‘ 前面

接下来就是单个字符插入

分为两种形式

第一种形式没有使用迭代器,意思为,在pos位置前 插入 n个 c字符(这个n在实际使用的时候 很容易忘记,需要注意一下)

第二种与第一种类似,只是pos变成了迭代器形式

第三种:迭代器形式的头插 字符还有一种形式

意思就是在p的位置前插入一个字符 c,不用额外说明字符个数

http://www.lryc.cn/news/2396790.html

相关文章:

  • FastAPI+Pyomo实现线性回归解决饮食问题
  • 16.FreeRTOS
  • Redis最佳实践——购物车优化详解
  • 【计算机网络】传输层UDP协议
  • 安全漏洞修复导致SpringBoot2.7与Springfox不兼容
  • 从法律层面剖析危化品证书:两证一证背后的安全逻辑
  • C语言——获取变量所在地址(uint8和uint32的区别)
  • 2 Studying《Effective STL》
  • 深入理解复数加法与乘法:MATLAB演示
  • 【设计模式-3.6】结构型——桥接模式
  • 【前端】性能优化篇
  • 【redis实战篇】第六天
  • 力扣题解654:最大二叉树
  • 手写ArrayList和LinkedList
  • Android bindservice绑定服务,bindServiceAsUser补充
  • [蓝桥杯]交换次数
  • 95套HTML高端大数据可视化大屏源码分享
  • 系统架构设计综合知识与案例分析
  • scale up 不能优化 TCP 聚合性能
  • Python-matplotlib库之核心对象
  • Linux 脚本文件编辑(vim)
  • 学习BI---基本操作---数据集操作
  • 初学大模型部署以及案例应用(windows+wsl+dify+mysql+Ollama+Xinference)
  • AI Agent企业级生产应用全解析
  • RocketMQ 学习
  • 【前端】html2pdf实现用前端下载pdf
  • Redis部署架构详解:原理、场景与最佳实践
  • 前端开发知识体系全景指南
  • C++哈希表:unordered系列容器详解
  • vue-13(延迟加载路由)