【STL】带你了解string类

string类

  • 为什么学习string类
  • 什么是string
  • 标准库中的string类
    • sting类的常用接口
      • 构造接口
      • string类对象的容量操作接口
      • string类对象的访问及遍历操作接口
      • string类对象的修改操作
      • string类非成员函数
  • vs和g++下string结构的说明(了解即可)
    • vs下stirng的结构
    • g++下string的结构

为什么学习string类

在c语言中,字符串是以’\0’结尾的一些字符集合,为了操作方便,c语言提供了一些str系列的库函数,但是这些库函数是于字符串分离开的,不太符合oop思想,而且底层需要用户自己管理,稍不留神可能还会越界访问

什么是string

string 就是字符串的意思,是 C++ 用来代替 char 数组 的数据结构。里面封装了一些常用的方法,方便我们对其进行一些操作,而且string的空间大小是动态变化的,大大减小了不必要的花销

标准库中的string类

string底层本质上还是一个顺序表,我们可以理解为是一个封装了char*的容器。
只不过:

  • char* 是一个指针

  • string本质上是一个类,类的内部封装了char*,即**string是一个char***型的容器

  • **string管理char***所分配的内存,不用担心复制越界和取值越界等

typedef basic_string<char> string;

在这里插入图片描述

在使用string这个容器时,需要包含头文件

sting类的常用接口

构造接口

  1. 无参构造
  2. 字符串构造
  3. n个字符c构造
  4. 拷贝构造
    在这里插入图片描述
string s1;//无参构造
**************************
string s1("hello world");//字符串构造
stirng s2(s1);//拷贝构造
**************************
string s1(10,'c');//n个字符构造
  • 下面我会贴出运行图以便更好的理解:
    在这里插入图片描述
    在这里插入图片描述

string类对象的容量操作接口

  1. size();
  2. lenth();->与size()方法底层实现原理完全相同
  3. capacity()
  4. empty()
  5. clear()
  6. reserve()
  7. resize()
  • 下面我会对这些接口进行演示

① size(),lenth(),capacity()

string s2("hello world");
cout << s2.size() << endl;
cout << s2.length() << endl;
  • size()lenth()返回的是字符串有效字符个数,而capacity()返回的是当前对象空间大小
    在这里插入图片描述
  • 为什么size()lenth()这两个接口的功能是一样的呢?这是因为某些历史原因遗留下来的,原本string类使用的是lenth()接口,但是后面为了与其他STL容器保持统一,便有了size()接口,那c++为什么不删了lenth()这个接口呢?很简单,大白话讲就是:在size()接口出来前,很多项目使用的是lenth这个接口,如果删了这个接口,那些项目不就得全崩了吗?所以c++每次更新都是“向前兼容”,不会把之前不好的设定删除掉。

②empty()

  • 这个接口的作用是判断该对象是否为空,为空在返回真,否则返回假。
    在这里插入图片描述
  • 下面是接口演示
    在这里插入图片描述

③clear()

  • 这个接口的作用是清空存储的字符串。
    ->注意,是把字符清楚,不会影响到空间,也就是capacity()。
    在这里插入图片描述
  • 下面是接口演示
    在这里插入图片描述
    在这里插入图片描述
  • 它只是清空字符串,不会影响到空间
  • 咱们来看下是不是真的清空了字符串
    在这里插入图片描述

④reserve()

  • 调整空间,若大于原空间,则进行扩容,若小于原空间,则不进行操作
    在这里插入图片描述
  • 下面是接口演示
    . 当大于原空间时
    在vs平台下,string类初始空间是15(平台不同开辟的空间也不同)
    在这里插入图片描述
    . 当小于原空间时
    在这里插入图片描述

⑤resize()

  • 调整字符串的长度,这个接口不仅会影响到size(),还会影响到capacity()
  • 若大于原长度,但小于原空间,则会增加有效字符个数,直到达到给定的长度,多出来的部分则是用’\0’填充
  • 若大于原长度,并且大于原空间,则会增加有效字符个数,直到达到给定的长度,并进行扩容
  • 若小于原长度,则会减少有效字符个数,并且减去的部分可以理解为被删除了。

第一种情况
在这里插入图片描述
第二种情况
在这里插入图片描述
第三中情况
在这里插入图片描述

string类对象的访问及遍历操作接口

  • operator[]—>返回pos位置字符的引用
  • begin()+end()—>迭代器
  • rbegin()+rend()—>反向迭代器
  • 范围for—> C++11支持更简洁的范围for的新遍历方式

前面讲到string的底层本质是一个顺序表,既然是顺序表,那就能用下标引用操作符来访问与遍历。
operator[] ->下标引用操作符重载

在这里插入图片描述在这里插入图片描述

  • 既然我们能通过下标引用来遍历string类的对象,那我们是不是也能借此来修改string类对象中存储的值呢?
    答案是“肯定的”
    在这里插入图片描述
  • 另外,我们还能单独的对某一位置进行自增操作
    在这里插入图片描述

begin()+end()迭代器
begin()获取第一个字符的迭代器 + end()获取最后一个字符下一个位置的迭代器
在这里插入图片描述

  • 下面是接口演示
    在这里插入图片描述

什么是迭代器
概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。但记住,它只是类似于指针,但不是指针

接下来,我就来具体的讲讲begin()end()

  • bengin(),返回指向容器第一个元素位置的迭代器
  • end(),返回容器最后一个元素的下一个位置的迭代器
    在这里插入图片描述
  • 现在来分析下前面的那段代码
	string s1("hello world");//string::iterator是迭代器类型,不同的容器,迭代器类型不同string::iterator it1 = s1.begin();//it1存储s1.begin()返回的迭代器位置while (it1!=s1.end())//当it1没到s1.end()位置时{//如前面所说,我们可以暂且把迭代器当作指针来理解。在这里输出迭代器位置的值时,用到了"*"//和指针不同的是,这里的解引用操作符是被重载过的cout << *it1 << " ";//输出迭代器当前位置的值++it1;//然后迭代器后移}

rbegin()+rend()反向迭代器
rbegin()返回指向容器最后一个元素的迭代器,rend()返回指向容器第一个元素的前一个位置的迭代器。
在这里插入图片描述
在这里插入图片描述

  • 接口演示以及代码讲解
    在这里插入图片描述
string s1("hello world");
//string::reverse_iterator是反向迭代器的类型
string::reverse_iterator it1 = s1.rbegin();//it1存储s1.rbegin()的位置
while (it1!=s1.rend())//当没到s1.rend()位置时
{cout << *it1 << " ";//输出当前位置的值++it1;//前移
}

范围for
范围for,又称“语法糖”,它是在c++11时才出来的。
范围for的底层本质也是迭代器。

  • 先演示下范围for的用法
    第一种,可以用auto让编译器来推导类型。
    关于auto,可以到这篇文章中进行了解
    在这里插入图片描述
    第二种,自己给出类型。
    在这里插入图片描述
    前面说了,范围for本质还是迭代器,上面代码中遍历s1,实际是将*it1的值赋值到x中。下面来看下底层
    在这里插入图片描述

string类对象的修改操作

接口使用说明
push_back()在字符串后尾插字符c
append()在字符串后追加一个字符串
operator+= (重点)在字符串末尾追加字符串str
c_str()(重点)返回c格式的字符串
find()从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

push_back()
在字符串后尾插字符c
在这里插入图片描述

  • 接口演示
string s1("hello");
s1.push_back('w');
for (char x : s1)
{cout << x;
}

在这里插入图片描述

append()
在字符串后追加一个字符串

string s1("hello");
s1.append("world");
for (char x : s1)
{cout << x;
}

在这里插入图片描述
③operator+= (重点)
在字符串末尾追加字符串、字符或者一个对象
在这里插入图片描述

string s1("hello");
s1 += "world";
for (char x : s1)
{cout << x;

在这里插入图片描述
④c_str()(重点)
返回c格式的字符串
在这里插入图片描述

string s1("hello");
cout << s1.c_str() << endl;

在这里插入图片描述
⑤find()
从字符串pos位置开始往后找字符c、字符串s或者一个对象,返回该字符在字符串中的位置
在这里插入图片描述

  • 代码演示
    在这里插入图片描述
    ⑥substr
    在str中从pos位置开始,截取n个字符,然后将其返回
    在这里插入图片描述
  • 接口演示
string s1("hello world");
string s2 = s1.substr(0,5);
for (auto x:s2)
{cout << x;
}

在这里插入图片描述

string类非成员函数

接口使用说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)流插入重载
operator<< (重点)流提取重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

①operator+
在字符串后拼接字符、字符串或者对象
在这里插入图片描述
operator+与operator+=的区别是前者不会影响自身,后者会影响到自身
在这里插入图片描述
在这里插入图片描述

②operator>> 、operator<< (重点)(重点)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**③getline **
从流中获取一行放到字符串中
在这里插入图片描述

  • 接口演示
    在这里插入图片描述

getline与流插入的区别
流插入遇到空格就会停止,也就是说,如果要输入hello world,那么它只会接收到hello这部分,但是getline则会全部都接收到
在这里插入图片描述

vs和g++下string结构的说明(了解即可)

vs下stirng的结构

1.当字符串长度小于16时,使用内部固定的字符数组来存放

2.当字符串长度大于等于16时,从堆上开辟空间

其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的 容量 最后:还有一个指针做一些其他事情。 故总共占16+4+4+4=28个字节。

union _Bxty{   
// storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing} _Bx;

g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个 指针,该指针将来指向一块堆空间,内部包含了如下字段:

  • 空间总大小

  • 字符串有效长度

  • 引用计数

  • 指向堆空间的指针,用来存储字符串。

struct _Rep_base{size_type               
size_type               
_Atomic_word            
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11647.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

谭滨锴:《唤醒内在的智慧》人生要学会正确看待世界

在这个充满挑战的现实世界中&#xff0c;如何才能获得内心的平静呢&#xff1f;又该如何避免生活中的陷阱和障碍&#xff0c;顺利前行于正确的道路&#xff1f;在追求物质成功的同时&#xff0c;是否还能够实现自我价值&#xff0c;感受到内心的满足与成就感&#xff1f;谭滨锴…

基于Faster-RCNN的水下垃圾检测系统,支持图像、视频和摄像实时检测【python源码、pytorch框架】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于Faster-RCNN的水下垃圾检测系统&#xff0c;支持图像、视频和摄像实时检测【python源码、pytorch框架】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于Faster-RCNN的水下垃圾检测系统…

CSS查缺补漏one

11.6~11.11CSS查缺补漏 一、熟记1.CSS引入方式1&#xff09;外部样式表&#xff08;写在第一个肯定最常用的啦&#xff01;~&#xff09;2&#xff09;内部样式表3&#xff09;行内样式 2.选择器3.重点重点重点来咯&#xff08;混&#xff09;1&#xff09;单行文字垂直居中&am…

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…

ARL506-ASEMI汽车专用整流二极管ARL506

编辑&#xff1a;ll ARL506-ASEMI汽车专用整流二极管ARL506 型号&#xff1a;ARL506 品牌&#xff1a;ASEMI 封装&#xff1a;BUTTON 正向电流&#xff1a;50A 反向电压&#xff1a;600V 正向压降&#xff1a;1.08V 引线数量&#xff1a;2 芯片个数&#xff1a;1 芯片…

一文解析离线数据仓库和实时数据仓库!

一、离线数仓是什么&#xff1f; 离线数仓&#xff08;Offline Data Warehouse&#xff09;是一种数据仓库架构&#xff0c;主要用于存储和处理历史的、静态的数据。它是对企业内外部各种数据源的数据进行抽取、清洗、转换、加载&#xff08;ETL&#xff09;后&#xff0c;按照…

java里面使用groovy案例+详解

场景&#xff1a; 最近有一个计算商品运费的&#xff0c;如果商品的数量大于快递公司设置的数量 10 那么超出部分也需要计算额外运费&#xff0c;那么这些计算过程代码我能不能不在java里面写呢&#xff0c;用一种可配置化的方式来根据不同的传参计算出运费&#xff1f; 页面传…

iframe页面嵌套把子页面的modal显示在父页面层级

使用iframe父页面嵌套子页面时&#xff0c;如果子页面有modal&#xff0c;默认modal的包裹范围是在子页面的body上&#xff0c;子页面有多大&#xff0c;modal的包裹就有多大&#xff0c;并且不能fixed&#xff0c;会随着鼠标滚动。 处理方法&#xff1a;将modal的body挂载在页…

18.头文件的用法注意事项

//2.cpp中编写多个方法&#xff0c;方法多了后没法一个个声明&#xff0c;就需要使用头文件 int daguai() {return 1; } int paoshang() {return 1; } int guaji() {return 1; } int jiaxue() {return 1; }右键头文件 新建项 新建头文件 在头文件中声明2.cpp中的方法 #pr…

充电宝哪个牌子好用?2024年充电宝十大品牌排行榜推荐!

充电宝哪个牌子好用&#xff1f;2024年充电宝十大品牌排行榜推荐&#xff01;如今&#xff0c;外出时手机电量耗尽是许多人都会遇到的问题&#xff0c;尤其是在关键时刻&#xff0c;电量不足更是令人焦虑不已。此时&#xff0c;一款性能可靠且耐用的移动电源便成了我们的救命稻…

Python爬虫精准获取京东(JD)商品SKU信息

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是对于电商行业来说&#xff0c;精准获取商品信息成为了市场分析、价格比较、库存管理等环节的基石。本文将通过Python爬虫技术&#xff0c;详细解析如何精准获取京东(JD)商品的SKU信息&#xff0c;包括商品详情、价…

漏洞利用exp[banner]

源码 import requestsbanner """________________________________________________/ \\| _________________________________________ || |\033[1;39m _,. \0…

MYSQL视图

由于我们上讲复习了前面的所有知识点&#xff0c;所以今天不再去复习之前的知识了&#xff0c;我们直接开始正题。 1.什么是视图&#xff1f; 视图是⼀个虚拟的表&#xff0c;它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据&#xff0c;⽽是通过执⾏查…

【软件设计师中级】2024.11.09软考备考

备考时候的一些笔记&#xff0c;可能会有不对或者个人主观的知识点 文章目录 前言一、计算机内数据的表示1.1 原反补移码1.2 浮点数1.3 校验码1.3.1奇偶校验1.3.2 CRC冗余校验码(理解特点即可)1.3.3 海明校验码 二、 计算机系统组成2.1 冯诺依曼结构2.2 Flynn分类法2.3 指令系统…

springboot生成二维码和条形码

目录 springboot生成二维码和条形码引入依赖生成二维码&#xff0c;在controller层生成条形码controller springboot生成二维码和条形码 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version&…

RTSP播放器EasyPlayer.js无插件直播流媒体音视频播放器使用http与https的区别

在当今数字化时代&#xff0c;视频播放体验的重要性日益凸显&#xff0c;而EasyPlayer.js无插件H5播放器作为一款现代Web环境下的播放器&#xff0c;其对HTTP和HTTPS的支持成为了许多用户关注的焦点。本文将探讨EasyPlayer.js播放器在使用HTTP与HTTPS时的区别。 1、从安全性角度…

组态软件基础知识

一、组态软件基础知识 1、概述 &#xff08;1&#xff09;、组态软件概念与产生背景 “组态”的概念是伴随着集散型控制系统&#xff08;Distributed Control System简称DCS&#xff09;的出现才开始被广大的生产过程自动化技术人员所熟知的。在工业控制技术的不断发…

国标GB28181公网直播EasyGBS国标GB28181视频平台与海康GB28181对接需要做哪些测试?

在当今的视频监控系统中&#xff0c;国标GB28181协议已成为视频监控设备互联互通的标准。特别是在公网直播的应用场景中&#xff0c;国标GB28181公网直播EasyGBS国标GB28181视频平台与海康威视设备的对接显得尤为重要。为了确保对接的顺利进行&#xff0c;需要进行一系列详尽的…

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; 有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务器查询…

【QML】QML图表(ChartView)改变坐标轴(ValueAxis)标题(titleText)的文字颜色

1. 需求 改变titleText的颜色&#xff0c;将下图mV的颜色改为红色 2.代码 关键代码&#xff1a;titleText: "<font colorred>mV</font>" //坐标轴 mv ValueAxis{id: _mAxisMvmin: 0max: 20tickCount: 6labelsFont.pixelSize: 15labelFormat: %.1ft…