C++入门 string(2)

目录

string类的常用接口说明

string类对象的容量操作  

 size & max_size & length & capacity

empty & clear 

reserve & resize

 string类对象的元素访问

 at & back & front

string类对象的修改操作(字符串操作)

substr & find & rfind

find_first_of & find_last_of

find_first_not_of & find_last_not_of

compare


string类的常用接口说明

string类对象的容量操作  

函数名称功能说明
size(重点)返回字符串有效字符长度(不包括\0)
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间**
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

 size & max_size & length & capacity

void test_string7()
{string s1 = "hello world";cout << s1.size() << endl;		//输出11cout << s1.length() << endl;	//输出11cout << s1.capacity() << endl;  //输出15string s2;cout << s2.size() << endl;		//输出0cout << s2.length() << endl;	//输出0cout << s2.capacity() << endl;  //输出15
}

这三个相当简单,不过多赘述,注意的是size返回字符串有效字符长度(不包括\0)

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

max_size返回字符串可以达到的最大长度,没啥用处,不用深度学习。


empty & clear 

void test_string8()
{string s1 = "hello world";if (s1.empty())//输出nocout << "yes" << endl;elsecout << "no" << endl;s1.clear();if (s1.empty())//输出yescout << "yes" << endl;elsecout << "no" << endl;
}

empty函数判度字符串是否为空,clear函数清空字符串。

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


reserve & resize

在了解这两个函数之前先了解编译器是怎么存储string类的数据的:

vs下string的结构

  1. string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字 符串的存储空间:
  2. 当字符串长度小于16时,使用内部固定的字符数组来存放 ;当字符串长度大于等于16时,从堆上开辟空间。

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内 部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。  

g++下string的结构

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

 

reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserve不会改变容量大小。 再三强调reserve和reverse的拼写区别!!

void TestPushBack()
{string s;// 知道需要多少空间,提前开好s.reserve(200);//s[100] = 'x'; //无法赋值
}

 注意:这里的开辟了200个空间只是提前预留好的,不能进去访问,否则会出错

void test_string9()
{string s1;// reserve 保留// reverse 逆置 反转s1.reserve(100);cout << s1.capacity() << endl;s1.reserve(20);cout << s1.capacity() << endl;
}

 另外注意不同编译器下reserve的处理方式不同,可能会缩容也可能不会。

 

如果要缩容,也只是另外开辟一半的空间,将原先空间的值拷贝一半进去,不能够在原来空间上缩容,归根结底还是空间换时间。


resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间

void test_string11()
{string s1;//s1.resize(5, '0');s1.resize(5);s1[4] = '3';s1[3] = '4';s1[2] = '5';s1[1] = '6';s1[0] = '7';cout << s1 << endl;// 76543// 插入(空间不够会扩容)string s2("hello world");s2.resize(20, 'x');cout << s2 << endl;//hello worldxxxxxxxxx// 删除s2.resize(5);cout << s2 << endl;//hello
}

注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

 string类对象的元素访问

operator [ ]在上文已经详细解释,不再过多描述。 

 at & back & front

at 能获取字符串中的字符,返回对字符串中位置 pos 处的字符的引用。

void test_string12()
{string s2("hi");//  该函数会自动检查 pos 是否是字符串中字符的有效位置// (即 pos 是否小于字符串长度)//  如果不是,则抛出out_of_range异常。try{s2.at(10);//非法访问}catch (const exception& e){cout << e.what() << endl;//输出 invalid string position}
}

front 访问第一个字符,back 访问最后一个字符

void test_string13()
{string s = "hello world";s.back() = 'D';s.front() = 'H';cout << s << endl;//输出Hello worlD
}

string类对象的修改操作(字符串操作)

substr & find & rfind

void test_string14()
{string file("string.cpp.zip");// 在字符串中搜索其参数指定的序列的第一次出现项size_t pos1 = file.find('.');// 在字符串中搜索其参数指定的序列的最后一次出现项size_t pos2 = file.rfind('.');// 子字符串是对象中从字符位置开始并跨越字符(或直到字符串末尾,以先到者为准)的部分// string suffix = file.substr(pos, file.size() - pos);string suffix1 = file.substr(pos1);	//默认到结束cout << suffix1 << endl;//输出  .cpp.zipstring suffix2 = file.substr(pos2);cout << suffix2 << endl;//输出  .zipstring suffix3 = file.substr(pos1,4);//从pos1开始跨越四个字符cout << suffix3 << endl;//输出  .cpp
}

find_first_of & find_last_of

void test_string15()
{// strtokstd::string str("Please, replace the vowels in this sentence by asterisks.");std::size_t found1 = str.find_first_of("aeiou");//在字符串中搜索与其参数中指定的任何字符匹配的第一个字符std::size_t found2 = str.find_last_of("aeiou");//在字符串中搜索与其参数中指定的任何字符匹配的最后一个字符str[found1] = '*';str[found2] = '*';std::cout << str << '\n';//输出 Pl*ase, replace the vowels in this sentence by aster*sks.
}

find_first_not_of & find_last_not_of

void test_string16()
{// strtokstd::string str("Please, replace the vowels in this sentence by asterisks.");std::size_t found1 = str.find_first_not_of("aeiou");//在字符串中搜索与其参数中指定的任何字符匹配的第一个字符std::size_t found2 = str.find_last_not_of("aeiou");//在字符串中搜索与其参数中指定的任何字符匹配的最后一个字符str[found1] = '*';str[found2] = '*';std::cout << str << '\n';//输出 *lease, replace the vowels in this sentence by asterisks*
}

compare

void test_string17()
{string str1("green apple");string str2("red apple");if (str1.compare(str2) != 0)std::cout << str1 << " is not " << str2 << '\n';// 输出 green apple is not red apple
}

C++98设置的类型过多,个人绝对记忆太过于繁琐,只需要了解几个有用的即可,比较是按照字典序大小比较的(ascii码比较

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

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

相关文章

ls命令(Linux)

一.ls命令的作用&#xff1a;列出目录下的内容 二.ls命令的构成 ls [-a -l -h] [路径] 其中ls作为命令的主体而存在 所以我们当然可以不使用选项和参数&#xff0c;直接使用ls命令来列出当前工作目录下的内容 注意&#xff1a;当前工作目录指的是我们目前所处于的目录位置&…

FlowUs息流:新媒体运营者的智能协作解决方案

新媒体和自媒体运营者在日常工作中经常面临信息管理复杂、创意记录不便、团队协作效率低等痛点。FlowUs作为一款多功能的协作工具&#xff0c;能够针对性地解决这些问题。 FlowUs息流是一款专为新媒体从业者设计的协作文档工具&#xff0c;它具备以下功能特色&#xff1a; 中文…

VMware Workstation Ubuntu server 24 (Linux) 磁盘扩容 挂载硬盘

1 Ubuntu server 关机,新增加磁盘 2 启动ubuntu虚拟机,分区和挂载磁盘 sudo fdisk /dev/sdb #查看磁盘UUID sudo blkid #创建挂载目录 sudo mkdir /mnt/data # sudo vi /etc/fstab /dev/disk/by-uuid/0b440ed0-b28b-4756-beeb-10c585e3d101 /mnt/data ext4 defaults 0 1 #加…

下载使用nginx发布html自定义页面

在浏览器搜索nginx.org&#xff0c;然后点击download&#xff0c;接着点击 stable and mainline 选择自己所使用系统对应的信息后点击&#xff08;我用的是CentOS&#xff0c;所以需要点击RHEL and derivatives&#xff09; vim /etc/yum.repos.d/nginx.repo [nginx-stable] n…

从文本文件中读取博客数据并将其提取到文件中

通常情况下我们可以使用 Python 中的文件操作来实现这个任务。下面是一个简单的示例&#xff0c;演示了如何从一个文本文件中读取博客数据&#xff0c;并将其提取到另一个文件中。 假设你的博客数据文件&#xff08;例如 blog_data.txt&#xff09;的格式 1、问题背景 我们需…

携手华为,微想科技正式启动“720云”鸿蒙原生应用开发

5月31日&#xff0c;"创兴汇聚&#xff0c;干帆领航”——“走进华为”系列活动北京站&#xff0c;在华为北京研究所举行&#xff0c;华为战略研究院、华为开发者联盟承办。微想科技创始人兼CEO刘博受邀出席此次会议&#xff0c;并在鸿蒙原生系统启动仪式上与华为达成合作…

如何判断代理IP池的优劣

判断代理IP池的优劣主要从以下几个方面入手&#xff1a; 1.IP池数量&#xff1a;IP池的大小直接关系到代理IP池的使用频次和可靠性&#xff0c;通常情况下&#xff0c;IP池的大小越大&#xff0c;代理IP池的可靠性就越高。 2.IP池质量&#xff1a;IP池的质量关系到代理IP池的使…

福派斯猫粮,让猫咪更健康,你做到了吗?

猫粮的选择对于猫咪的健康和幸福有着极大的影响。猫粮是猫咪日常摄入营养的主要来源&#xff0c;因此选择一款适合猫咪的猫粮非常重要。福派斯猫粮凭借其卓越的品质和全面的营养价值&#xff0c;成为了许多宠物主人的首选&#xff0c;尤其是福派斯旗下的福派斯三文鱼猫粮、福派…

轻兔推荐 —— Snipaste

via&#xff1a;轻兔推荐 - https://app.lighttools.net/ 简介 Snipaste 是一个简单但强大的截图工具&#xff0c;支持Windows和Mac&#xff0c;允许用户快速截图并进行编辑&#xff0c;如添加标注、文字和马赛克。 - 它还具有贴图功能&#xff0c;可以将截图或剪贴板内容固定…

文件IOoooo

1.1 文件路径 文件路径分为两种&#xff1a; 1、绝对路径&#xff1a;以C:、D:等盘符开头的&#xff0c;就是我们所说的绝对路径&#xff0c;根据它可以直接找到文件的具体位置。 2、相对路径&#xff1a;需要先指定一个目录作为基准目录&#xff0c;从基准目录出发&#xf…

音视频封装的总接

1、封装涉及的基本概念 2、音视频封装基础3、封装总结 4、PS/TS码流封装层次图

redis 主从同步时,是同步主节点的缓存积压区的数据,还是同步主节点的aof文件

Redis 的主从同步&#xff08;replication&#xff09;是同步主节点的数据到从节点上&#xff0c;但它既不是直接同步 AOF 文件&#xff0c;也不是同步缓存积压区。 当一个 Redis 从节点启动并连接到主节点时&#xff0c;会发生以下步骤&#xff1a; 同步数据集&#xff1a;从…

Web前端开发缺点:深入剖析与反思

Web前端开发缺点&#xff1a;深入剖析与反思 在数字化浪潮中&#xff0c;Web前端开发作为构建互联网世界的基石之一&#xff0c;其重要性不言而喻。然而&#xff0c;正如任何技术都有其局限性一样&#xff0c;Web前端开发也存在一些不容忽视的缺点。本文将从四个方面、五个方面…

【Linux】如何查看网卡驱动

如何查看网卡驱动&#xff1f; 要查看机器的网卡驱动程序&#xff0c;您可以使用以下几种方法。这些方法可以帮助您查找并识别当前正在使用的网卡驱动程序。 方法1&#xff1a;使用 ethtool ethtool 可以显示网络接口的详细信息&#xff0c;包括驱动程序名称。 sudo ethtoo…

MyBatis总结(2)- MyBatis实现原理(三)

核心配置 JavaBeanMapper.xml&#xff08;sql映射&#xff09; 作用 JavaBeanMapper.xml实现&#xff1a; 用来干什么&#xff1f; 定义Sql语句映射。相对照JDBC的实现&#xff0c;是将原本的Sql代码提取出来&#xff0c;最终根据映射关系执行Sql操作。 好处&#xff1f; 解…

判断电势高低的方法_电势的公式介绍

电势是描述电场中某点电势能的物理量&#xff0c;与电场中的电荷无关&#xff0c;仅与电场本身和所选的零电势点有关。以下是判断电势高低的方法和电势的公式介绍&#xff1a; 判断电势高低的方法 根据电场线的方向判断&#xff1a; 正电荷在电场中受到的电场力方向是电场线的…

海外盲盒小程序背后的技术支撑与实现

海外盲盒小程序之所以能够迅速崛起并受到全球消费者的喜爱&#xff0c;除了其独特的商业模式和营销策略外&#xff0c;更重要的是其背后的技术支撑和实现。本文将深入探讨海外盲盒小程序背后的技术支撑及其实现方式。 一、多语言与本地化技术 为了满足全球不同地区消费者的需…

python调用天气接口并解析json数据

""" 使用python调用请求 使用pip install requests安装requests """ import jsonimport requestsresp requests.get(urlhttps://apis.tianapi.com/tianqi/index,params{key: 4a9ce7c2516a223ewe323dwe323ew323eq1, city: 101020100, type: 1} )…

使用mysqldump迁移MySQL数据

将Windows系统中MySQL数据导出到其他系统中MySQL数据库中 1.导出数据 进入MySQL安装目录的bin目录下&#xff0c;打开dos窗口执行以下命令 --single-transaction 参数表示不锁表 1.1 指定部分表导出 mysqldump -u用户名 -p密码 数据库名 表1 表2 表3 --single-transact…

Android之实现两段颜色样式不同的文字进行富文本方式的显示

一、使用SpannableString进行拼接 1、显示例子 前面文字显示红色&#xff0c;后面显示白色&#xff0c;显示在一个TextView中&#xff0c;可以自动换行 发送人姓名: 发送信息内容2、TextView <TextViewandroid:id"id/tv_msg"android:layout_width"wrap_c…