C++:string相关内容的简单介绍

目录

介绍:

string类的常见接口说明 

1. string类的常见构造

1.1  string(const string& str,size_t pos,size_t len = npos);

1.2  string(const char* s)

1.3  string (const char * s , size_t  n);

 1.4 string(size_t n,char c);

 2.string类对象的容量操作 

 2.1 size  与  length

2.2 capacity 

2.2.1 capacity的扩容机制 

2.3 clear 

2.4 reserve 

2.5 resize 

(1)字符串变短

(2)字符串变长 

(3)修改长度比capacity大 

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

 3.1 operator[] 与 at

3.2遍历操作 

1.使用size 

2.使用operator[] 

3.begin + end 的 迭代器 遍历操作

3.1 反向迭代器 

4.string类对象的修改操作 

4.1push_back 

4.2 append 

4.3 operator +=  (最为常用) 

 4.4 assign

4.5 insert 

 4.6 erase

4.7 replace 

4.7.1 find与replace 

小总结: 


介绍:

  相关内容详细介绍:cplusplus.com/reference/string/string/?kw=string

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string string,所以string 在底层的本质上也是一个模板
  4. 不能操作多字节或者变长字符的序列。
  5. 在使用string类时,必须包含#include头文件以及using namespace std;

string类的常见接口说明 

1. string类的常见构造

1.1  string(const string& str,size_t pos,size_t len = npos);

void test_string()
{string s1;string s2(s1 , 5 ,10);
}提取字符串中的某个区间段的字符,作为一个新的字符串
或者可以说是从一个字符串中提取子字符串
  • str:要从中提取子字符串的源字符串。
  • pos:指定要开始提取子字符串的位置。
  • len:可选参数,指定要提取的子字符串的长度。默认值为 npos,表示提取从 pos 开始到源字符串的末尾的所有字符。

1.2  string(const char* s)

const char* cstr = "Hello, C++";
string str(cstr);  // 使用构造函数将字符串赋值给string的对象strcout << str << endl;  // 输出:Hello, C++接收一个char类型的字符串作为参数,也就是说将一个字符串赋予给string的对象 

1.3  string (const char * s , size_t  n);

const char* cstr = "Hello, World!"; 
size_t n = 5; 
std::string str(cstr, n); // 使用C风格字符串的前n个字符初始化std::string对象
  • 在这个例子中,cstr 指向字符串 "Hello, World!"。
  • 由于 n 被设置为5,std::string str(cstr, n); 会创建一个 std::string 对象 str并只包含 "Hello" 这5个字符,不包含后面的逗号和空格以及终止空字符。

 1.4 string(size_t n,char c);

string s6(10,'#');
cout << s6 << ednl;//输出结果 : ##########本质上是一种初始化

 2.string类对象的容量操作 

 2.1 size  与  length

void test_string()
{string s1("hello world");cout << s1.size() << endl; //输出结果: 11cout << s1.length() << endl; //输出结果: 11}size 与 length 的功能都是返回字符串的实际长度,二者并没有任何的区别

2.2 capacity 

void test_string()
{string s1("hello world");cout << s1.capacity() << endl; //输出结果: 15}返回字符串所处在的空间大小,在一般情况下capacity的返回值并不会包含\0所占用的空间

同时,我们需要直到的是capacity的返回值是比size和lenghth的返回值大的,理由如下:

在C++中,std::string是一个动态数组,它可以根据需要自动调整大小,当你创建一个字符串对象时,它会分配一定的内存空间来存储字符串的字符。

这个内存空间的大小由capacity决定,在例子中,字符串"s"的内容是"hello world",它包含11个字符,然而,为了提高性能,std::string通常会分配比实际字符串长度更大的内存空间。

这个额外的空间被称为capacity,它用于存储未来可能添加到字符串中的字符,以避免频繁的内存重新分配操作。所以,s.size()返回的是字符串实际包含的字符数,即11。而s.capacity()返回的是字符串当前分配的内存空间大小,即15。

2.2.1 capacity的扩容机制 

如上代码想要表达的意思如下:

  • 使用变量 sz 获取当前 字符串中的 空间大小,随后进入for循环中使用了 同为 string 的一种接口,push_back 对字符串内部的内容进行添加,随后,判断当前 sz 与 当前的capacity 大小相比较。
  • 由于,在字符串中添加了内容,以及在字符串内部添加了内容,导致了capacity 会因为字符串内容的添加进行空间的对策扩充。
  • 而这个扩充的机制便是,第一次扩充到原来空间的两倍左右,而之后则扩充到当前空间的1.5倍

2.3 clear 

void test_string()
{string s1("hello world");cout << s1  << endl; //输出结果: hello worlds1.clear();cout << s1  << endl; //输出结果:一行空格}清除数据,但仅仅只是数据的清除,空间并不一定清理掉
也就空间不会被释放或者空间不会被销毁!只是清除了空间内部的数据void test_string()
{string s1("hello world");cout << s1  << endl; //输出结果: hello worldcout << s1.capacity() << endl ; // 输出结果:15s1.clear();cout << s1  << endl; //输出结果:一行空格cout << s1.capacity() << endl;//输出结果:15
}如果想要释放空间或者在情况数据后释放空间,可以使用shrink_to_fit
但是这个只是缩小空间大小,但还是会保留一定量的空间,总之不会变成0

2.4 reserve 

string s;//创建一个string 的变量s
s1.reserve(100);//提前为 s 进行空间的开辟
cout << s1.capacity() <<endl;//输出结果是 111reserve的功能是开辟空间,或者说是预留空间
当我们知道所需要的空间大小时,可以使用reserve进行空间的开辟
使得在内存空间中提前为我们需要的数据开辟空间当然,使用了reserve后,因为编译器的问题,有些编译器为了灵活分配内存空间问题
会对reserve开辟的空间进行二次的开辟,也就说进行空间的二次预留这样就导致开辟出来的空间可能比我们需要的空间还要多

同时,如果使用了reserve 进行空间的扩容,是完全可以的,但是要注意,reserve进行扩容的大小必须要比当前空间的大小还要大,不然reserve是无效扩容 

void test1()
{string s1("hello world xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")cout << s1.capacity() << endl;s1.reserve(10);cout << s1.capacity() << endl;//因为reserve扩容的大小比capacity小,所以扩容无效}void test2()
{string s1("hello world xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")cout << s1.capacity() << endl;s1.reserve(200);cout << s1.capacity() << endl;//因为reserve扩容的大小比capacity大,所以扩容成功//输出的结果,应该是两百左右的大小}

2.5 resize 

resize的主要作用是改变一个字符串的实际长度,但是resize改变长度的情况分为三种:

(1)字符串变短
string s("hello world");
cout << s.size() << endl; // 长度是 11
sout << s.capacity() << endl; // 空间大小是 15s.resize(5);
cout << s.size() << endl; //长度是5
sout << s.capacity() << endl;//空间大小是15

当resize修改的长度比原本的长度还要小时,那么resize会保留前面的长度,删除后面的数据内容,以此达到相对因的长度,不包含\0 

(2)字符串变长 
string s("hello world");
cout << s.size() << endl; // 长度是 11
sout << s.capacity() << endl; // 空间大小是 15s.resize(13);
cout << s.size() << endl; //长度是13
sout << s.capacity() << endl;//空间大小是15

当resize修改的长度比原本的长度还长,且resize修改的长度比capacity的空间大小要小时,字符串的长度会被添加至resize修改的长度,而多出来的部分则是用\0进行填充,或者被指定字符填充,以上的代码是默认情况,使用了\0填充 

(3)修改长度比capacity大 
string s("hello world");
cout << s.size() << endl; // 长度是 11
sout << s.capacity() << endl; // 空间大小是 15s.resize(20);//修改的长度比空间大小还大
cout << s.size() << endl; //长度是20
sout << s.capacity() << endl;
//空间大小是31,因为修改长度超过了原来的空间大小,所以进行了扩容

当resize修改的长度大小比capacity还要大时,capacity会进行扩容处理 


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

 3.1 operator[] 与 at

void test()
{string s1("hello world");cout << s[2] <<endl; //结果是 ecout << s.at(2) << endl; //结果是 e}

 at和[]的功能是类似的,二者虽然访问的功能是一样的,但是二者的检查越界的方式是不一样的。

如以上两张图,图1是[]的越界访问,是一个断言警告,图二是at的越界访问,是一个异常处理 

3.2遍历操作 
1.使用size 

2.使用operator[] 

而由于operator []的本质是返回当前位置的字符,所以可以利用它的特性对字符串中的字符进行++或者--等相关的加减操作

3.begin + end 的 迭代器 遍历操作

迭代器的行为像指针一样的类型对象,begin是返回第一个有效位置的迭代器,end是返回最后一个有效数据的下一个位置,这里的最后一个有效数据的下一个字符是\0,相当于指针的移动,从当前位置移动到\0位置结束

时使用迭代器也可以进行字符串中的字符修改操作  

3.1 反向迭代器 

 反向迭代器使用的是 rbegin 和 rend 进行字符串的反向输出操作 


4.string类对象的修改操作 

4.1push_back 

主要功能是在字符串的尾部插入字符,且只能插入一个字符 

void test()
{string s("hello world");s.push_back("!");cout << s << endl; //输出结果:hello world!}

4.2 append 

append(const & char*s)这个功能和push_back的功能类似,但是比push_back更强,因为它可以添加字符串

void test()
{string s("hello world");s.append(" hello bit");cout << s << endl; //输出结果:hello world hello bit}

4.3 operator +=  (最为常用) 

void test()
{string s("hello world");s += " " ;s += "apple" ;cout << s << endl; //输出结果:hello world apple}

 4.4 assign

 最常见的功能是字符的覆盖,将空间内部内容进行删除,然后在添加所需要的内容

void test()
{string s("hello world");s.assign("xxx");cout << s << endl; //输出结果:xxx}

4.5 insert 

 主要功能在当前位置之前插入字符串

void test()
{string s("hello world");s.insert(0,"xxx");cout << s << endl; //输出结果:xxxhello world}

 4.6 erase

 从某个位置开始删除几个字符,如果字符不够删,则有多少删多少

void test()
{string s("xxxhello world");s.erase(0,3);//前面的 0 是位置,后面的3是需要删除的字符个数cout << s << endl; //输出结果:hello worlds.erase();cout << s << endl;//erase的默认是全部删除,只留下一行空格当作还要空间存在没有释放}

4.7 replace 

 主要功能是字符的替换,某个区间位置的字符进行替换

void test()
{string s("hello world");s.replace(5,1,"%")//5是位置,1是替换的字符个数,%是替换的内容cout << s << endl; //输出结果:hello%world}

4.7.1 find与replace 

find的功能是寻找字符串内部需要查询的字符,找到后返回字符所处在的位置下标,找不到则返回-1

如图配合了replace使用,就可以查询字符串中的空格符号,并且将空格符号进行替换,直到字符串内的所有空格符号都替换完成,其中的npos其实表示的是find找不到字符后的返回值。也就是-

小总结:

insert replace erase 这几个能少用就少用,因为基本都需要挪动数据,它们的底层代码就是挪动数据,所以效率不是很高,建议多使用operator += 


 

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

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

相关文章

图搜索基础-深度优先搜索

图搜索基础-深度优先搜索 参考原理引入流程解析手推例子 代码实现运行结果结果分析 参考 理论参考&#xff1a;深蓝学院 实现参考&#xff1a;github项目 原理 引入 对于这样一个图&#xff0c;我们试图找到S到G的通路&#xff1a; 计算机程序不会像人眼一样&#xff0c;一…

npm淘宝镜像报错certificate has expired

1、概述 vue项目使用npm install命令时&#xff0c;突然报错&#xff1a;“...certificate has expired” 2、解决 1.清空缓存&#xff1a;npm cache clean --force 2.修改镜像&#xff08;管理员运行命令行&#xff09;&#xff1a;npm config set registry https:/…

测评ONLYOFFICE 8.0版本:办公利器再升级

测评ONLYOFFICE 8.0版本&#xff1a;办公利器再升级 前言注册使用升级功能速览全新外观设计wordexcelPPTPDF 协作功能强化更强大的功能复杂表单的填写 移动端优化结语 前言 随着科技的不断发展&#xff0c;办公软件在提升用户体验和工作效率方面扮演着越来越重要的角色。作为一…

element el-date-picker 日期组件置灰指定日期范围、禁止日期范围日期选择

JS如何将当前日期或指定日期转时间戳_javascript技巧_脚本之家 小于指定日期前的日期置灰 比如这里 指定日期是 2024-02-20 10:48:15 disabledDate(time) time是一个函数提供的时间用于比较 他是一个时间戳↓ 理解为我们想要置灰的时间 time.getTime() < timeStamps- 1 *…

可视化图文报表

Apache Echarts介绍 Apache Echarts是一款基于Javascript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网&#xff1a;Apache ECharts 入门案例&#xff1a; <!DOCTYPE html> <html>…

06 Qt自绘组件:Switch动画开关组件

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

SD-WAN助力企业数据传输安全

随着企业网络需求的不断增长&#xff0c;SD-WAN成为企业网络组网的首选方案&#xff0c;能够实现多种网络拓扑结构的无缝连接&#xff0c;其中包括总部-分支、总部-分支-数据中心、总部-数据中心、总部-分支-云服务等。如何确保企业数据在传输过程中的安全性成为企业关注的重要…

对话式 AI 简化业务的 5 种方式

告别繁琐工作&#xff0c;对话式AI让内部沟通更高效 对话式人工智能正在彻底改变企业与客户互动、简化运营并增强客户体验的方式。 对话式人工智能可以通过以下五种方式改变您的业务&#xff1a; 1. 对话式人工智能&#xff1a;增强客户服务对话式人工智能通过聊天机器人和虚拟…

SpringMVC(2)

目录 SSM整合统一异常处理项目异常处理方案异常解决方案前后端协议联调拦截器 SSM整合 统一异常处理 异常的种类及出现异常的原因: 框架内部抛出的异常&#xff1a;因使用不合规导致数据层抛出的异常&#xff1a;因外部服务器故障导致&#xff08;例如&#xff1a;服务器访问超…

UE 贴地绘制/日历/鼠标光标滚轮位置缩放图片/UMG滚动数据从前后添加新UI/多图片批量下载 收费项目源码资源

基本里面的内容本人CSDN发的都有现成代码.里面大部分是功能实现思路.这里面是把这几个功能合成了一个完整5.1项目源码.拿到即用.收费项目源码资源. 1.贴地绘制 2.日历 3.鼠标光标滚轮位置缩放图片 \ 4.UMG滚动数据从前后添加新UI思路 5.多图片批量下载 这是整合的懒人源码包收…

逆向案例一:AES解密基于数位观察城市数据

import requests import json from Crypto.Cipher import AES # 开始解密 from Crypto.Util.Padding import unpad #去填充的逻辑 import base64 url https://app.swguancha.com/client/v1/cPublic/consumer/baseInfo data {current: 1,"dimensionTime": "20…

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解&#xff1a;什么是机器学习扩展阅读&#xff1a;机器学习的流程 LangChain Introduction LLM的限制 大型语言模型&#xff0c;比如ChatGpt4&#xff0c;尽管已经非常强大&#xff0c;但是仍然存在一些限制&#xff1a; 知识更新&#xff…

jvm常用参数配置

一、 常用参数 -Xms JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时&#xff0c;JVM会减小heap的大小到-Xms指定的大小&#xff0c;可通过-XX:MaxHeapFreeRation来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同…

torch3d mented_sort.cuh(338): error: invalid combination of type specifiers

安装pytorch3d时&#xff0c; mented_sort.cuh(338): error: invalid combination of type specifiers cuda自带的cub编译报错&#xff1a; C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/include\cub/device/dispatch/dispatch_segmented_sort.cuh(338): erro…

加盟户用光伏赚钱吗?

光伏发电是一个新兴的投资领域,其中所蕴含的财富商机是非常多的,并且大多可靠效益显著,让无数创业投资者看到了生财的希望。 一、什么是户用光伏&#xff1f; 户用光伏&#xff0c;顾名思义&#xff0c;是在居民区安装的光伏发电系统。它利用太阳能电池板将光能转化为电能&…

TikTok矩阵系统的功能展示:深入解析与源代码分享!

今天我来和大家说说TikTok矩阵系统&#xff0c;在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、交流思想和娱乐放松的重要渠道&#xff0c;其中&#xff0c;TikTok作为一款全球知名的短视频社交平台&#xff0c;凭借其独特的创意内容和强大的算法推荐系统&#…

数据分析案例-社交媒体情绪数据集可视化分析(文末送书)

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

NFC智能家电解决方案国产NFC远距离读卡芯片DP1363F

智能家电工作原理 用户只需打开手机NFC功能&#xff0c;并把手机靠近同样具有NFC功能的电器设备&#xff0c;轻触一下,便能与家电快速自动配对&#xff0c;进而通过手机直接控制此家电设备。 物联网&#xff08;IoT&#xff09;是一个连接日常物品和互联网的系统&#xff0c;它…

跨境电商与支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…

2024年3月2日(星期六)骑行香杆箐

2024年3月2日 (星期六&#xff09;骑行香杆箐&#xff0c;早8:30到9:00&#xff0c; 郊野公园后门集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:郊野公园后门集合 &#xff0c;家住东&#xff0c;南&#xff0c;北…