C++---string

String

  • C语言中的字符串和C++中的string类
  • 标准库中的string类
  • string类的常用接口
    • string类对象的常见构造
    • string类对象的容量操作
    • string类对象的访问及遍历操作

C语言中的字符串和C++中的string类

在C语言中,字符串是一个字符数组,它以空字符\0结尾,常用的表示字符串的方式是用字符指针(char *)指向字符串的首地址。因此,在C语言中处理字符串需要使用字符数组和指针,并且需要考虑字符串的结束符\0的处理。

而在C++中,string是一个类,它封装了一个动态大小的字符数组和一组成员函数,用于处理字符串。使用string类可以更方便地进行字符串的操作,并且不需要手动管理内存或考虑结束符的问题。此外,string类还支持重载运算符和类型转换,可以更自然地与其他的C++结构和算法配合使用。

虽然C语言为字符串提供了一系列字符串函数,但是这些函数是和字符串分离的,而且底层空间需要用户自己管理。

标准库中的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)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

    总结:

  6. string是表示字符串的字符串类

  7. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

  8. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;

  9. 不能操作多字节或者变长字符的序列。

别忘了头文件以及using namespace std;

string类的常用接口

  1. string类对象的常见构造

constructor函数名称				功能说明
string()					   构造空的string类对象
string(const char* s)		   用C—string来构造string类对象
string(size_t n, char c) 	   string类对象中包含n个字符c
string(const string& s) 	   拷贝构造函数
string (const string& str, size_t pos, size_t len = npos); 从第pos位置开始,用后面npos个字符构造#include <iostream>                                                                                         using namespace std;int main()
{string a("hello world");//默认构造string();cout << a << endl;string b(a);//拷贝构造string(const string& str);cout << b << endl;string c(a,2,3);//substring,string(const string&str,size_t pos,size_t len = npos);cout << c << endl;//string d(a,100,2);使用substring构造不能越界//cout << d << endl;string d("h");//string(const char* s);cout << d << endl;string e(a,0);cout << e << endl;string f(5,'a');//填充fill,string(size_t n,char c); cout << f << endl;return 0;
}  

在这里插入图片描述

当然,string也可以用=进行初始化

在这里插入图片描述

#include <iostream>using namespace std;int main()
{string a = "hello world";cout << "string a = " << a << endl;//string& operator= (const string& str)string b = "a";//string &operatir= (const char* s)cout <<"string b = " << b << endl;string c = b;//string& operator= (char c)cout << "string c = " << c << endl;return 0;}

在这里插入图片描述


  1. string类对象的容量操作

size	返回字符串的有效长度
length	返回字符串的有效长度
capacity 返回空间总大小
empty	 字符串是否为空
clear    清空字符串
reserve  为字符串预留空间
resize   将有效字符的个数改成n个,多出的空间用字符c填充#include <iostream>using namespace std;int main()
{string a("hello world");cout << "a.size()==" << a.size() << endl;cout << "a.length()==" << a.length() << endl;size_t old = a.capacity();//检查扩容while (a.size() < 100){a += '1';if (old != a.capacity()){cout << "a.capacity==" << a.capacity() << endl;old = a.capacity();}  }string b;cout << b.empty() << endl;//判断是否为空b += '1';cout << b.empty() << endl;a.resize(3);//如果n小于a.size(),就只留下前n个字符,如果n大于a.size(),就将有效字符的个数改为n个,多出的空间用字符c填充b.reserve(100);cout << "b.capacity" << b.capacity() << endl;b.reserve(200);cout << "b.capacity" << b.capacity() << endl;a += '2';a.resize(500);cout << a[100] << endl;return 0;}

在这里插入图片描述

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

  2. clear()只是将string中有效字符清空,不改变底层空间大小

  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。


  1. string类对象的访问及遍历操作

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
和数组一样,可以通过下标去访问iterator begin();
const_iterator begin() const;
返回指向第一个字符的迭代器iterator end();
const_iterator end() const;
返回一个指向最后一个字符的下一个位置的迭代器reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
返回反向迭代器指向的最后一个字符reverse_iterator rend();
const_reverse_iterator rend() const;
返回反向迭代器指向的第一个字符的前一个字符
#include <iostream>using namespace std;int main()
{string str = "123456789";cout << str[2] << endl;//3cout << str[1] << endl;//2auto bg = str.begin();auto ed = str.end();cout << *bg << endl;//1//cout << *ed << endl;auto rbg = str.rbegin();auto red = str.rend();cout << *rbg << endl;//9//cout << *red << endl;return 0;
}

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

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

相关文章

【数据结构】朴素模式匹配 KMP算法

&#x1f387;【数据结构】朴素模式匹配 & KMP 算法&#x1f387; &#x1f308; 自在飞花轻似梦,无边丝雨细如愁 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;【数据结构】朴素模式匹配 & K…

【数据架构】Data Fabric 架构是实现数据管理和集成现代化的关键

D&A 领导者应该了解数据编织架构的关键支柱&#xff0c;以实现机器支持的数据集成。 在日益多样化、分布式和复杂的环境中&#xff0c;数据管理敏捷性已成为组织的任务关键优先事项。为了减少人为错误和总体成本&#xff0c;数据和分析 (D&A) 领导者需要超越传统的数据…

MyBatis操作数据库

1.MyBatis是什么&#xff1f; MyBatis 是⼀款优秀的持久层框架&#xff0c;它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO&#xf…

【机器学习】吃瓜教程 | 西瓜书 + 南瓜书 (1)

文章目录 一、绪论1、什么是机器学习&#xff1f;2、基本术语3、假设空间4、归纳偏好5、发展历程 二、模型评估与选择A、一种训练集一种算法2.1 经验误差 与 过拟合2.2 评估方法a) 留出法b) 交叉验证法c) 自助法d) 调参与最终模型 2.3 性能度量a) 错误率与精度b) 查准率、查全率…

matlab dot()函数求矩阵内积,三维 ,多维 详解

matlab dot()函数求矩阵内积&#xff0c;三维 &#xff0c;多维 详解 Cdot(A,b,X)&#xff0c;这个参数X 只能取1,或者2。1 表示按列&#xff0c;2表示按行&#xff0c;如果没有参数。默认按列。 1&#xff09;按列优先计算 Cdot(A,B)dot(A,B,1)[a1*b1a4*b4 ,a2*b2a5*b5 ,a…

视频拼接得AI三维生成方案-开端(一)

想使用二维得图像生成三维得空间图像&#xff0c;英伟达有完整得方案&#xff0c;开源&#xff0c;但是三维拼接不一样&#xff0c;只需要二维&#xff0c;并且要实时&#xff0c;如何生成是我每天都在思考得东西。 cnn 提取特征器和自编码 在训练细胞神经网络时&#xff0c;问…

大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

jmeter软件测试实验(附源码以及配置)

jmeter介绍 JMeter是一个开源的性能测试工具&#xff0c;由Apache软件基金会开发和维护。它主要用于对Web应用程序、Web服务、数据库和其他类型的服务进行性能测试。JMeter最初是为测试Web应用程序而设计的&#xff0c;但现在已经扩展到支持更广泛的应用场景。 JMeter 可对服务…

AcWing 244. 谜一样的牛—树状数组、二分

题目链接 AcWing 244. 谜一样的牛 题目描述 分析 这道题挺巧妙的&#xff0c;感觉树状数组方面的题就是比较难想&#xff0c;先分析一下样例&#xff0c;样例中每头牛前面比自己低的牛的数量分别为 0 1 2 1 0牛的高度是1~n的排列&#xff0c;如何分析出每头牛的高度呢&…

API Testing 一个基于 YAML 文件的开源接口测试工具

目录 前言&#xff1a; 如何使用&#xff1f; 本地模式 服务端模式 文件格式 后续计划 前言&#xff1a; API Testing 是一个基于 YAML 文件的开源接口测试工具&#xff0c;它可以帮助开发者快速地进行接口测试。 在选择工具时&#xff0c;可以从很多方面进行考量、对比…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 20 日&#xff0c;在 2005 年的今天&#xff0c;时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…

LiveNVR监控流媒体Onvif/RTSP功能-拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明

LiveNVR拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明 1、视频页面集成1.1、关闭接口鉴权1.2、视频广场页面集成1.2.1、隐藏菜单栏1.2.2、隐藏播放页面分享连接 1.3、其它页面集成 2、播放分享页面集成2.1、获取 iframe 代码2.2、html 集成ifr…

ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

线程池的7大参数含义介绍 corePoolSize&#xff1a;池中一直保持的线程的数量。 maximumPoolSize&#xff1a;池中允许的最大的线程数。 keepAliveTime&#xff1a;当线程数大于核心线程数的时候&#xff0c;线程在最大多长时间没有接到新任务就会终止释放&#xff0c; 最终…

Python 集合 union()函数使用详解,Python合并集合

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 union函数使用详解 1、合并多个集合2、合并其他类型2.1、合并字符串2.2、合并列表…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

Hbase基本原理剖析

一、基本原理 数据存储使用HBase来承接&#xff0c;HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。更多关于HBase的信息&#…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章&#xff1a;IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

windows系统安装异构虚拟机arm版的银河麒麟服务器

下载qemu UEFI&#xff08;BIOS的替代方案&#xff09;的下载地址&#xff1a;http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd QEMU 软件的下载地址&#xff1a;https://qemu.weilnetz.de/w64/2021/qemu-w64-setup-20210505.exe …

Sentinel规则持久化到nacos的实现(源码修改)

文章目录 1、Sentinel源码修改2、持久化效果测试 Sentinel规则管理有三种模式&#xff1a; 原始模式pull模式push模式 这是实现push方式&#xff1a; push模式即控制台将配置规则推送到远程配置中心&#xff0c;例如Nacos。Sentinel客户端去监听Nacos&#xff0c;获取配置变更…