C++中的string的介绍(从string到STL)

news2024/9/23 5:33:30

C++中的string的介绍

文章目录

  • C++中的string的介绍
    • 1. 从string到STL
    • 2. string 的构造函数
    • 3. string 的iterator(迭代器)
    • 4. string 中的元素访问
    • 5. string 中容量相关
    • 6. string 中的插入删除
    • 7. string 中的查找
    • 8. string 的剩余函数

1. 从string到STL

  严格来说string不是Containers 容器,也就不属于STL C++ 标准模板库,因为string是早于STL的,所以没有作业可以抄,导致string中有很多,约100多个,有很多功能是相似的,所以只介绍一些常用的函数,虽然Containers 容器 中有很多不同类模板,但函数命名以及函数的形参是类似的,读懂一个类模板就基本明白了

string本质上就是一个存储char类型的顺序表
类似:

  • char* _ptr
  • size_t _size
  • size_t _capacity

2. string 的构造函数

在这里插入图片描述

  • (1) string的默认构造(用户不写由编译器自动生成的),生成空字符串
    string s;

  • (2)string的拷贝构造,用另一个string拷贝构造
    string s1(s2);

  • (3) 用string pos位置开始,向后 len个长度的部分,拷贝构造string
    pos为缺省参数,不写则为 0
    len为缺省参数,不写则为nposstring的成员常量,为size_t npos = -1,也就是整型的最大值
    string s1(s2,0,10);

  • (4) 用一个字符串构造
    string s("hello world");

  • (5) 用一个字符串的前N个构造
    string s("hello world",5);

  • (6) 用N个c构造
    string s(5,'x');

  • (7) 用迭代区间构造(下面会提到)

3. string 的iterator(迭代器)

在这里插入图片描述
  迭代器是C++标准模板库(STL)中的一个核心概念,用来遍历容器中的元素,类似于指针,可以说指针是一种迭代器,但不能说迭代器是指针,因为你不知道迭代器的底层是什么

VS2022 x86下的迭代器类型
在这里插入图片描述

  • begin 返回指向第一个元素的迭代器,提供了const和非const两个版本(其他的也一样)
    在这里插入图片描述

  • end返回指向最后一个元素的下一个位置的迭代器

  • rbegin是逆序迭代器,返回指向最后一个元素的下一个位置

  • end返回指向第一个元素的迭代器

4. string 中的元素访问

在这里插入图片描述

  • operator[]是通过像数组一样,用下标的方式来访问
    s[5];
  • at类似于operator[],只不过at会进行边界的强制检查,越界则会抛出异常,而operator[]不会对边界进行检查
    s.at(5);
  • backfront返回最后/第一个元素的引用
    s.back() / s.front();

遍历string的三种方法

    1. operator[] 通过下标来访问数据
string s("hello wolrd");
for (int i = 0; i < s.size(); ++i)\
{
	cout << s[i] << " ";
}
cout << endl;
    1. iterator 通过迭代器来访问 迭代器需配对使用,正序对正序,逆序对逆序
string s("hello wolrd");
//正序打印
string::iterator it = s.begin();
while (it != s.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;
//逆序打印
string::reverse_iterator it = s.rbegin();
while (it != s.rend())
{
	cout << *it << " ";
	++it;
}
cout << endl;
//const的string打印
const string s("hello wolrd");
string::const_iterator it = s.begin();
while (it != s.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;
    1. 范围for 通过自动判断开始和结束,以及自动++
	string s("hello wolrd");
	for (auto ch : s)
	{
		cout << ch << " ";
	}
	cout << endl;

5. string 中容量相关

在这里插入图片描述

  • size length 返回string的字符个数,length 是只针对string ,而size 是所有容器都有的成员函数

  • max_size 返回最大能容纳的长度

  • capacity 返回string 的容量

  • clear 清空string

  • empty 判断string是否为空

  • shrink_to_fitstring缩小至合适的容量,避免空间浪费

  • resize 调整string 的大小,会删除多余的元素

  • reserve 调整string 的容量,一般情况下,如果调整的容量要小于原本的容量,编译器不会进行缩容的

	string str("Hello World.");
	str.reserve(111);//扩容至111
	str.resize(5);  //调整元素个数为5,删除多余元素
	str.reserve(50); //不改变大小

6. string 中的插入删除

在这里插入图片描述

  • operator+= 在结尾添加一个string/一个字符串/一个字符
    在这里插入图片描述

  • append 在结尾追加一个string/string的一部分/一个C字符串/一个C字符串的前N个/N个c字符/一个迭代区间
    在这里插入图片描述

  • push_back 尾插一个字符

  • insertpos位置开始插入一个string/从pos位置开始插入一个string的一部分/从pos位置开始插入一个C字符串/从pos位置开始插入一个C字符串的前N个/从pos位置开始插入N个c字符/从迭代器位置开始插入N个c字符/从迭代器位置开始插入一个字符/从迭代器位置开始插入一段迭代区间
    在这里插入图片描述

  • assign用一个string的值修改原string/用string的一部分来修改原string/用一个C字符串来修改原string/用一个C字符串的前N个来修改原string/用N个c字符来修改原string/用一个迭代区间的值来修改原string
    在这里插入图片描述

  • erase默认全删除(或者传一段范围,如果len大于pos之后的长度则删除pos之后的全部字符)/删除一个迭代器指向的字符/删除一段迭代区间的字符
    在这里插入图片描述

  • swap 交换两个string

  • pop_back尾删一个字符operator+=

可以看到在string中有许多重复功能的函数,例如push_back appendoperator+=,都使用operator+=来尾插字符不是更好嘛,所以string在设计上有很多重复的地方,只需要了解常见的函数即可

7. string 中的查找

在这里插入图片描述

  • c_str 返回字符串首元素的地址

  • find 查找第一个符合要求下标
    str.find("hello")//找到单词hello

  • rfind 逆序查找第一个符合要求下标

  • find_first_of find_last_of查找任意一个符合要求的下标(可以有多个要求)
    str.find_first_of("aeiou")//找到a e i o u任意一个第一次出现的下标

  • find_first_of find_last_of查找任意一个不符合要求的下标

  • substr 生成子串(从pos向后len个字符,并返回这部分string

8. string 的剩余函数

在这里插入图片描述

  • operator>> operator<< 允许string像内置类型一样输入输出

在这里插入图片描述

  • operator=string的赋值重载,类似与assign的功能,将新的值赋值给string

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

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

相关文章

crm客户管理系统有哪些?盘点大家使用最广泛的15款

将对比的客户管理CRM系统包括&#xff1a;纷享销客、Zoho CRM、销售易、用友CRM、Salesforce、Microsoft Dynamics 365、销帮帮CRM、HubSpot、Oracle CRM、悟空CRM、神州云动CRM、红圈CRM、SAP CRM、Odoo、OroCRM。 一个合适的CRM系统可以极大地提高你的销售效率和客户满意度&a…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义 预处理 编程的流程分为&#xff1a;编辑、编译、运行、调试四个阶段&#xff1b; 预处理属于编译阶段&#xff0c;编译过程又可以分为&#xff1a;预处理、编译、汇编、链…

新160个crackme - 022-CM_2

运行分析 需破解Name和Serial&#xff0c;输入的小写字母都会变为大写字母 PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 发现关键字符串 ida动态调试&#xff0c;发现Name和Serial长度需要大于5&#xff0c;且Serial前6位明文爆出&#xff0c;6287-A …

YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切

原文:YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切 - 知乎 (zhihu.com) 一、SAM 分割任何模型 (Segment Anything Model - SAM) 是一种突破性的图像分割模型,可实现具有实时性能的快速分割。 项目地址 https://github.com/facebookresearch/segment-…

第 8 章 虚拟文件系统(5)

目录 8.4 处理VFS对象 8.4.1 文件系统操作 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 8.4 处理VFS对象 8.4.1 文件系统操作 文件系统可以编译为模块。 使用文件系统前需先注册。 1. 注册文件系统 int register_filesystem( struct file_…

Scrapy爬虫框架介绍、创建Scrapy项目

Scrapy官网&#xff1a;https://scrapy.org/ 什么是Scrapy Scrapy 是一个基于 Python 的快速的高级网页抓取和网页爬取框架&#xff0c;用于抓取网站并从其页面中提取结构化数据。它可用于多种用途&#xff0c;从数据挖掘到监控和自动化测试。 Scrapy核心组件 1. Scrapy Engin…

【Linux学习】文件系统 - 第二篇

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 文章目录 &#x1f4a1;文件操作的系统接口&#x1f351;open系统调用⚡close系统调用&#x1f988;write系统调用&#x1f985;read系统调…

在开关电源转换器中充分利用碳化硅器件的性能优势

在过去的几十年中&#xff0c;半导体行业已经采取了许多措施来改善基于硅 MOSFET &#xff08;parasitic parameters&#xff09;&#xff0c;以满足开关转换器(开关电源)设计人员的需求。行业效率標準以及市场对效率技术需求的双重作用&#xff0c;导致了对于可用于构建更高效…

Mysql中事务的读一致性问题,以及如何用MVCC解决

事务四大特性的实现&#xff1a; 原子性事务具有回滚的能力&#xff0c;InnoDB引擎使用undo log日志表来进行回滚操作。 持久性InnoDB引擎使用redo log日志表来保证数据的持久性。 事务的隔离性产生的问题&#xff1a; 脏读&#xff1a;一个事务读取到了另一个事务未提交的数…

Qt WebEngine播放DRM音视频

Qt WebEngine播放DRM受保护视频&#xff0c;前提是Qt WebEngine开启音视频编码器&#xff0c;能够支持网页上普通视频的播放。开启音视频编码器需要自己编译源码&#xff0c;这里不做介绍。 什么是DRM音视频 DRM视频是指数字版权管理&#xff08;Digital Rights Management&a…

70.加载功能菜单功能设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;69.搭建分析工具界面 以 69.搭建分析工具界面 它的代码为基础进行修改 效果图&#xf…

gif压缩大小但不改变画质?为网站性能加速的必备知识

在互联网时代&#xff0c;GIF 动图以其生动的表现力和视觉效果&#xff0c;在社交媒体、网站设计、数字营销等领域被广泛应用。然而&#xff0c;随之而来的一个问题是&#xff0c;GIF 文件的体积往往较大&#xff0c;这可能会导致网站加载速度变慢&#xff0c;影响用户体验。因…

练习实践-基础设施:搭建时钟同步服务器-基于chrony软件在centos7系统上的实现

参考来源&#xff1a;B站视频&#xff1a;up主&#xff1a;林哥讲运维 【一分钟学会&#xff1a;使用 chrony 部署企业 NTP 时间服务器】 https://chrony-project.org/comparison.html --chrony组织的比较 https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

基于全切片图像的结直肠癌肿瘤浸润性淋巴细胞和肿瘤-基质比率自动量化技术|文献精析·24-08-05

小罗碎碎念 今天分享的这一篇文章是一篇20年发表的文章&#xff0c;研究的是免疫组化相关的病理AI课题&#xff0c;当时用的是还是支持向量机和随机森林&#xff0c;在展望的部分提出CNN是未来的发展趋势。但是根据时间节点来看&#xff0c;当时Transformer已经发表了&#xf…

Sentine 源码分析之--ParamFlowSlot

前言&#xff1a; 上一篇我对 Sentinel 中的 AuthoritySlot、SystemSlot、GatewayFlowSlot 的相关源码进行了分析&#xff0c;本篇我们开始分析 ParamFlowSlot 相关的源码。 Sentinel 系列文章传送门&#xff1a; Sentinel 初步认识及使用 Sentinel 核心概念和工作流程详解…

实时数仓分层架构详解

首先&#xff0c;我们从数据仓库说起。 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员提出了商业数据仓库的概念。数据仓库概念的提出&#xff0c;是为了解决和数据流相关的各种问题&#xff0c;特别是多重数据复制带来的高成本问题。 数据仓库之父Bill …

敏捷与DevOps有什么不同?

在软件开发领域&#xff0c;敏捷和DevOps因其对效率、协作和交付高质量产品的关注而受到欢迎。尽管它们有不同的目标&#xff0c;敏捷和DevOps常常被交替使用。本文旨在阐明这些方法之间的区别和共性&#xff0c;展示它们如何无缝协同以产生结果。 图源自Browser Stack 了解敏捷…

uniapp开发微信小程序出现【错误: xx.js 已被代码依赖分析忽略,无法被其他模块引用】解决办法

报错信息 VM5208:9 app.js错误:Error: config.js 已被代码依赖分析忽略&#xff0c;无法被其他模块引用。你可根据控制台中的【代码依赖分析】告警信息修改代码&#xff0c;或关闭【过滤无依赖文件】功能。详情请查看&#xff1a;https://developers.weixin.qq.com/community/…

滑台模组如何满足特定生产需求?

滑台模组是一种可以进行近乎直线运动的自动化设备&#xff0c;用于将物体沿着平面上的轨道滑动。由导轨、传动结构和导向结构等组成。滑台模组可以通过电机驱动、气动驱动或液压驱动等方式进行移动。滑台模组的结构紧凑、操作简便&#xff0c;具有高精度、高稳定性和高可靠性的…