『C++成长记』string使用指南

🔥博客主页:小王又困了

📚系列专栏:C++

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、string类介绍

二、string类的常用接口说明

📒2.1string类对象的常见构造

📒2.2string类对象的容量操作

📒2.3string类对象的访问及遍历操作

📒2.4string类对象的修改操作

​编辑

📒2.5string类对象的查找接口

📒2.6string类非成员函数


🗒️前言:

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。C++中引入了string类,给我们提供了便利。

一、string类介绍

  • string是表示字符串的字符串类
  • string类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  • string在底层实际是:basic_string模板类的别名,typedef basic_string string;
  • 不能操作多字节或者变长字符的序列。

小Tips:在使用string类时,必须包含#include头文件以及using namespace std;

二、string类的常用接口说明

📒2.1string类对象的常见构造

🎀string()

    构造空的string类对象,即空字符串。

int main()
{string s1;cout << s1 << endl;return 0;
}

🎀string(const char* s)

    用一个C的字符串(或字符数组)来构造一个string类的对象。

int main()
{string s1("hellow world");cout << s1 << endl;return 0;
}

🎀string(size_t n, char c)

    用 个字符来构建string类对象。

int main()
{string s1(5, 'x');cout << s1 << endl;return 0;
}

🎀string(const string&s)

     string类的拷贝构造,用于构建一个和存在的s1一模一样的对象。

int main()
{string s1(5, 'x');string s2(s1);cout << s2 << endl;return 0;
}

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

    复制strpos位置开始len个字符的部分,使用一个已存在的string类对象的一部分来创建一个新的string类对象。

小Tips:nopsstring类里面的一个静态成员变量,它是size_t类型,初始化为-1,即表示整型的最大值。

int main()
{string s1("hellow world");string s2(s1, 7, 5);cout << s2 << endl;return 0;
}

🎀string(const char* s,size_t n)

    用 s 所指向字符串(或字符数组)的前 n 个字符来初始化创建一个string类对象。

int main()
{char s[] = "hellow ,world";string s1(s, 6);cout << s1 << endl;return 0;
}

📒2.2string类对象的容量操作

🎀size()

    返回字符串有效字符长度

int main()
{string s1("hellow world");string s2("hellow C++");cout << s1.size() << endl;cout << s2.size() << endl;return 0;
}

🎀length()

    返回字符串有效字符长度

int main()
{string s1("hellow world");string s2("hellow C++");cout << s1.length() << endl;cout << s2.length() << endl;return 0;
}

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

🎀capacity()

    返回string对象空间的总大小。

int main()
{string s1("hellow world");string s2("hellow world xxxxxxx");cout << s1.capacity() << endl;cout << s2.capacity() << endl;return 0;
}

小Tips:capacity()会返回对象空间的总大小,这个空间是存储有效字符的空间,实际上会多开辟一个空间,存储‘\0’。同一个对象在不同的环境开辟的空间不同,在不同环境下扩容机制也不同。

📖VS下的扩容机制

int main()
{string s1("hellow world");size_t old = s1.capacity();cout << old << endl;for (size_t i = 0; i < 100; i++){s1.push_back('x');if (old != s1.capacity()){cout << s1.capacity() << endl;old = s1.capacity();}}return 0;
}

VS下默认开辟15个空间用来存储数据(本质上是开16个空间,因为还要存‘/0’),第一次扩容是2倍,后面都是以1.5倍的大小去扩容。 

📖Linux下的扩容机制

在Linux环境下最初对象需要多少空间就开多少,后面一次按照2倍的大小进行扩容。

🎀reserve(size_t n = 0)

    为字符串预留空间。直接一次开辟n个空间,可以用来存储n个有效字符,可以避免每次都要去扩容。

int main()
{string s1("hellow world");s1.reserve(100);size_t old = s1.capacity();cout << s1.capacity() << endl;for (size_t i = 0; i < 100; i++){s1.push_back('x');if (old != s1.capacity()){cout << s1.capacity() << endl;old = s1.capacity();}}return 0;
}

小Tips:当我们确定需要多少空间,就可以使用reserve()提前开辟好空间即可,可以减少扩容次数, 大部分的扩容都是异地扩容,扩容次数过多会影响效率。

🎀resize(size_t n = 0, char c)

    resize(size_t n)resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,当n小于当前字符串的长度size(),会保留前n个字符,将第n个字符后面的所以字符删除;当n大于当前字符串的长度size(),先会进行扩容,不同的是当字符个数增多时:resize(size_t n)用‘\0’来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。

int main()
{string s1("hellow world");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(100,'x');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}	

小Tips:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。 reserve只会影响容量,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小,即不会缩容。

  • reserve只影响容量,不影响数据
  • resize既影响容量,也影响数据

🎀clean()

    清理有效字符,不改变容量大小

int main()
{string s1("Hello C++!");cout << "清空之前的size:" << s1.size() << endl;cout << "清空之前的capacity:" << s1.capacity() << endl;s1.clear();cout << "清空之后的size:" << s1.size() << endl;cout << "清空之后的capacity:" << s1.capacity() << endl;return 0;
}	

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

📒2.3string类对象的访问及遍历操作

🎀operator()

    返回pos位置的字符

int main()
{string s1 = "hellow world";for (size_t i = 0; i < s1.size(); i++){cout << s1[i];}cout << endl;return 0;
}

小Tips:如果字符串是const限定的,则该函数返回const char&。否则,它将返回char&at借口与operator[]借口功能类型,operator[]接口发生越界访问,程序会直接报错;at接口发生越界访问的时候会抛出异常。

🎀begin、end/rebegin、rend

    begin获取对象第一个字符的迭代器,end获取对象最后一个字符下一个位置的迭代器

int main()
{string s1 = "hellow world";string::iterator it = s1.begin();while (it != s1.end()){cout << *it;it++;}cout << endl;string::reverse_iterator it = s1.rbegin();//反向迭代器while (it != s1.rend()){cout << *it;it++;}cout << endl;return 0;
}

如上代码我们看到迭代器和指针的使用方法类似,都可以解引用和++,对象也可以修改。但迭代器的这些操作都是通过运算符重载来实现的。

小Tips:迭代器区间永远都是左闭右开,迭代器类型作为类的内置类型可以通过类名::itertator直接访问,例如:string::itertator就表示string类里面的迭代器类型。普通迭代器可读可写,const迭代器限制的是其指向的内容,只能读不能写,而const迭代器本身可以修改。

🎀范围for

int main()
{string s1("Hello world");for (auto it : s1){cout << it;}cout << endl;return 0;
}

 小Tips:范围for就是基于迭代器实现的,在底层范围for会转化成正向迭代器。

📒2.4string类对象的修改操作

🎀push back

    在字符串后尾插字符c

int main()
{string s1("Hello world");cout << "追加前:" << s1 << endl;s1.push_back('x');cout << "追加后:" << s1 << endl;return 0;
}

🎀append

    在字符串后追加一个字符串,它有六种重载形式,如下图所示:

int main()
{string s1("Hello world");cout << "追加前:" << s1 << endl;s1.append("xxxxxxx");cout << "追加后:" << s1 << endl;string s2 = "abcdefg";cout << "追加前:" << s1 << endl;s1.append(s2, 2, 4);cout << "追加后:" << s1 << endl;return 0;
}

🎀operator+=

    通过重载运算符+=实现追加,该运算符重载有三种重载实现形式,如下图所示:

int main()
{string s1("Hello world");cout << "追加前:" << s1 << endl;s1 += "xxxxxx";cout << "追加后:" << s1 << endl;string s3 = "abcdefg";string s2("Hello world");cout << "追加前:" << s2 << endl;s2 += s3;cout << "追加后:" << s2 << endl;return 0;
}

小Tips:string尾部追加字符的三种方式中,+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

📒2.5string类对象的查找接口

🎀find

    从字符串的pos位置开始往后查找字符或字符串,返回其在当前字符串中的位置。

int main()
{string s1 = "hellow world";string s2 = "world";size_t pos = s1.find(s2);cout << pos << endl;return 0;
}

 🎀substr

     在str中从pos位置开始,截取n个字符,然后将其返回

int main()
{string s1 = "test.txt.cpp";size_t pos = s1.rfind('.');if (pos != string::npos){string s2 = s1.substr(pos);cout << s2 << endl;}return 0;
}

📒2.6string类非成员函数

函数名称功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较

小Tipsoperator>>getline的区别在于,前者遇到空格‘  ’和换行‘\n’会截止,而后者默认只有遇到换行‘\n’才截止,因此当我们需要从键盘读取一个含有空格的字符串是,只能用getline


🎁结语: 

     本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

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

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

相关文章

Sg7050ccn晶体振荡器spxo规格书

SG7050CCN是一款CMOS输出石英晶体振荡器&#xff0c;小体积尺寸7.0x5.0mm,四脚贴片&#xff0c;额定频率2.5MHz ~ 50MHz&#xff0c;电源电压4.5V至5.5V,工作温度范围B : -20 C to 70 C / G : -40 C to 85 C C&#xff0c;具有小体积轻薄型&#xff0c;低抖动&#xff0c;低功耗…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

vit细粒度图像分类(八)SIM-Trans学习笔记

1.摘要 细粒度视觉分类(FGVC)旨在从相似的从属类别中识别物体&#xff0c;这对人类准确的自动识别需求具有挑战性和实用性。大多数FGVC方法侧重于判别区域挖掘的注意机制研究&#xff0c;而忽略了它们之间的相互依赖关系和组成的整体对象结构&#xff0c;而这些对模型的判别信…

解锁文档处理的全新维度:ONLYOFFICE 文档开发者版

前言 相信大家对于 ONLYOFFICE 这款办公软件可能已经有所耳闻&#xff0c;最近因工作需要&#xff0c;我在众多办公协作工具中选择了 ONLYOFFICE&#xff0c;原因主要是它开源经济实惠&#xff0c;可以部署在自己的服务器上并且能够轻松集成到我们的平台中。在数字化信息时代&…

torch与cuda\cudnn和torchvision的对应

以上图片来源于这篇博客 于是&#xff0c;我需要手动下载0.9.0torchvision 直接在网站https://pypi.tuna.tsinghua.edu.cn/simple/后面加上torchvision&#xff0c;就不用ctrlF搜torchvision了&#xff0c;即进入下面这个网站&#xff0c;找到对应版本的包下载安装即可 https…

Github设置clone慢的解决方案

Github设置代理clone依然慢的解决方案 1、前提&#xff1a; 注意&#xff1a; 必须要有科学上网&#xff01;必须要有科学上网&#xff01;必须要有科学上网&#xff01;重要的事情说三遍&#xff1b; 2、http/https方案&#xff08;git clone时使用http&#xff09;&#x…

MirrorLayer可以正常触摸屏幕原理分析

背景&#xff1a; 上次blog分享了给学员朋友们布置的作业&#xff0c;今天来进行简单的揭秘。 问题&#xff1a; 在多屏互动时候有一个屏幕的画面是一个MirrorLayer&#xff0c;另一个屏幕画面是真实的&#xff0c;即2个屏幕上有一个是MirrorLayer&#xff0c;这个时候疑问就…

【C++基础入门】四、程序流程结构(水仙花数、乘法口诀、七和七的倍数、随机数猜数字)

四、程序流程结构 C/C支持最基本的三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构 顺序结构&#xff1a;程序按顺序执行&#xff0c;不发生跳转选择结构&#xff1a;依据条件是否满足&#xff0c;有选择的执行相应功能循环结构&#xff1a;依据条件是否满足&…

Virtual DOM的实现原理

Virtual DOM的实现原理 课程目标 了解什么是虚拟DOM,以及虚拟DOM的作用Snabbdom的基本使用&#xff08;Vue内部的虚拟Dom是改造了开源库Snabbdom&#xff09;Snabbdom的源码解析 在面试的时候经常会问到虚拟DOM是怎么工作的&#xff0c;通过查看Snabbdom源码&#xff0c;可以…

机器学习---半监督学习(基于分岐的方法)

1. 基于分歧的方法 与生成式方法、半监督SVM、图半监督学习等基于单学习器利用未标记数据不同&#xff0c;基于分歧的方 法(disagreement--based methods)使用多学习器&#xff0c;而学习器之间的“分歧”(disagreement)对未标记 数据的利用至关重要。 1.2 协同训练 “协同…

实验一 古典密码算法的设计与实现

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;简单外包单 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

猫什么时候发腮?猫咪发腮指南!这些生骨肉冻干发腮效果好

猫什么时候发腮是许多猫主人非常关心的问题。在猫咪的成长过程中&#xff0c;发腮是一项重要的体征&#xff0c;也是猫咪成熟的标志。主人需要在适龄的年龄段加强营养补给&#xff0c;可以让让猫咪拥有可爱的肉嘟嘟脸型&#xff0c;不要错失最佳发腮期。那么&#xff0c;什么时…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url&#xff1a;https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

【论文阅读笔记】Advances in 3D Generation: A Survey

Advances in 3D Generation: A Survey 挖个坑&#xff0c;近期填完摘要 time&#xff1a;2024年1月31日 paper&#xff1a;arxiv 机构&#xff1a;腾讯 挖个坑&#xff0c;近期填完 摘要 生成 3D 模型位于计算机图形学的核心&#xff0c;一直是几十年研究的重点。随着高级神经…

第96讲:MySQL高可用集群MHA的核心概念以及集群搭建

文章目录 1.MHA高可用数据库集群的核心概念1.1.主从复制架构的演变1.2.MHA简介以及架构1.3.MHA的软件结构1.4.MHA Manager组件的启动过程1.5.MHA高可用集群的原理 2.搭建MHA高可用数据库集群2.1.环境架构简介2.2.搭建基于GTID的主从复制集群2.2.1.在三台服务器中分别搭建MySQL实…

Prometheus 企业级监控使用总结

一、监控概念&误区 监控是管理基础设施和业务的核心工具&#xff0c;监控应该和应用程序一起构建和部署&#xff0c;没有监控&#xff0c;将无法了解你的系统运行环境&#xff0c;进行故障诊断&#xff0c;也无法阻止提供系统性的性能、成本和状态等信息。 误区&#xff…

法兰缺损零件设计加工替换盾构机扫描建模厂家抄数修图出CAD图纸

在现代工业生产中&#xff0c;法兰缺损零件的问题时有发生&#xff0c;这不仅会影响设备的正常运行&#xff0c;还会给企业带来巨大的经济损失。为了解决这一问题&#xff0c;CASAIM中科广电三维扫描和3D打印设计加工技术的运用成为了关键。 首先&#xff0c;CASAIM中科广电需要…

“与客户,共昂首”——Anzo Capital昂首资本尽释行业进取之姿

“以匠心&#xff0c;铸不凡” 活动的现场&#xff0c;Anzo Capital 作为演讲嘉宾分享“以匠心&#xff0c;铸不凡”的产品理念。Anzo Capital积淀九载&#xff0c;匠心打造出“STP”和“ECN”两大核心账户&#xff0c;以光之速度将交易中的订单直达市场和流动性提供商&#…

Unity通过物理带动实现传输带运输物品

前言&#xff1a;遇到个听起来挺简单的需求&#xff0c;就是实现一个传输带&#xff0c;传输物品。但细想发现如果是直接设置物品的速度&#xff0c;或者通过设置父物体的方式带动物品&#xff0c;都挺不好&#xff0c;关联性太强。最后选择用到一个很实用的API, Rigidbody.M…

Vue+OpenLayers7入门到实战:OpenLayers7加载天地图

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上加载天地图. 天地图瓦片访问需要先到天地图申请key。天地图官网链接 本文使用xyz方式加载天地图,并且介绍如何加载xyz格式天地图url,包括天地图纯底图(无标记)、卫星影像图…