【C++】string

【C++】string

个人主页:NiKo 

C++专栏:C++程序设计

目录

一、标准库中的string类

二、string的遍历

三、string容量

四、string修改


一、标准库中的string类

1、string类

        C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。 

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

#include <string> using namespace std;

2、string的构造方法

string一共有5种构造方法。string()无参构造,初始化为空串string(const string& str) 用str拷贝构造string(size_t n,char c)用n个字符c初始化string(const char* s,size_t n)用字符串s的前n个字符初始化string(const string& str,size_t pos,size_t len=npos)将字符串str,从下标pos位置开始,选取长度为len个的字符,来初始化注:上面的缺省值npos,定义为:size_t npos=-1. npos为最大值,表示不传参数时,会用str中pos位置开始后的所有字符来初始化

二、string的遍历

1、auto和范围for(C++11支持)

补充auto的相关语法:

        1、在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

        2、用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

        3、auto不能作为函数的参数,可以做返回值,但是建议谨慎使用

        4、auto不能直接用来声明数组        5、auto的用武之地

范围for:        对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。范围for可以作用到数组和容器对象上进行遍历。

2、迭代器(iterator)

  • string 中的迭代器主要分为正向迭代器和反向迭代器,其中又可以细分为 const 和 非const类型的,共计四种。
  • const迭代器仅定义方式与非const不同,且在循环内部不能对元素进行修改,其余的都相同
begin+end
begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器('\0')
rbegin+rend
rend获取第一个字符的前一个位置迭代器 + rbegin获取最后一个字符下一个位置的迭代器

正向迭代器

非constconst

反向迭代器

非constconst

3、operator[]

通过索引访问类中的字符数据

三、string容量

1、length和size

返回字符串中有效字符的长度size()与length()方法底层实现原理完全相同,二者没有本质的区别,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2、capacity

返回字符串存储有效字符的空间大小(不包含'\0')capacity的扩容机制

       capacity()在不同平台上的扩容方式不同。先展示Windows下capacity的扩容过程。

        在Windows系统上,使用Visual Studio 2022编译器时,容器的capacity首次扩容遵循二倍增长策略(例如,从16扩展到32),而随后的扩容则调整为1.5倍增长。

        相比之下,在Linux系统上,当采用g++ 4.8编译器且演示代码保持完全一致的情况下,容器的初始capacity被设置为1,并且无论是首次还是后续的扩容操作,均严格遵循二倍增长模式。

3、reserve

用于预分配足够的内存空间以容纳指定数量的字符。这个函数不会改变字符串的内容或长度,但它可以影响字符串的 capacity

        reserve()函数在字符串管理中的主要作用是预分配足够的内存空间,以减少因后续操作(如添加字符)导致的频繁扩容,从而提升性能。这一功能在不同平台上可能因标准库实现的具体细节而有所差异。

        在Visual Studio环境下,当传入的参数n大于字符串当前的容量时,reserve()函数会确保字符串的容量增加至至少n个字符或更大。如果n小于或等于当前容量,调用reserve(n)通常不会有任何效果,因为字符串已经有足够的空间来存储n个字符。

        在Linux平台上,使用g++等编译器时,reserve()函数的行为通常与Visual Studio相似。当n大于当前容量时,它会将字符串的容量调整为至少n个字符。然而,与Visual Studio不同的是,在Linux平台上,如果n小于或等于当前容量,字符串的容量将会缩减(至少为size)。

四、string修改

1、push_back

void push_back (char c);在字符串的末尾添加一个字符

2、append

​​​​​​string& append (const string& str);​在字符串的末尾添加另一个字符串的内容

3、operator+=

string& operator+= (const string& str);将右侧字符串的内容追加到左侧字符串的末尾

 4、insert

string& insert (size_t pos, const string& str);在字符串的指定位置插入另一个字符串的内容

5、erase

string& erase (size_t pos = 0, size_t len = npos);从字符串中删除字符

6、find 

size_t find (const string& str, size_t pos = 0)在string中查找字符并返回指定字符串的下标(如果找不到则会返回-1

Read more

交通系统容灾演练:Java模拟灾难场景,90%团队都错了!

交通系统容灾演练:Java模拟灾难场景,90%团队都错了!

🔥关注墨瑾轩,带你探索编程的奥秘!🚀 🔥超萌技术攻略,轻松晋级编程高手🚀 🔥技术宝库已备好,就等你来挖掘🚀 🔥订阅墨瑾轩,智趣学习不孤单🚀 🔥即刻启航,编程之旅更有趣🚀 交通系统容灾演练的"3重困境" 1.1 困境一:灾难场景"不可见" 问题后果案例无法直观展示演练效果难以评估无法判断"信号故障"会导致多少车辆延误缺乏真实感人员参与度低演练时"走过场",无真实压力无法量化影响无法优化应急预案

By Ne0inhk
Elasticsearch核心概念与Java客户端实战 构建高性能搜索服务

Elasticsearch核心概念与Java客户端实战 构建高性能搜索服务

目录 🎯 先说说我被ES"虐惨"的经历 ✨ 摘要 1. 为什么选择Elasticsearch? 1.1 从数据库的痛苦说起 1.2 Elasticsearch的优势 2. ES核心架构解析 2.1 集群架构 2.2 索引与分片 3. Java客户端实战 3.1 客户端选型对比 3.2 RestHighLevelClient配置 3.3 Spring Data Elasticsearch配置 4. 索引设计最佳实践 4.1 索引生命周期管理 4.2 映射设计技巧 5. 查询优化实战 5.1 查询类型对比 5.

By Ne0inhk
【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案

【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案

🔥个人主页: 中草药  🔥专栏:【Java】登神长阶 史诗般的Java成神之路 一、单机架构         单机架构的核心是 “单点部署”:后端服务的所有功能模块(从接收请求到返回响应)都在一台机器内完成,不存在跨机器的网络通信(如分布式中的服务调用、跨节点数据库访问)。 诞生于互联网发展早期阶段:当时用户访问量小、业务场景简单,单机的计算(CPU、内存)与存储(磁盘)能力,足以支撑业务需求,无需多机分布式协作。 可以用一个简单的类比理解: * 单机架构 ≈ 一家 “夫妻小店”:老板(应用服务)、仓库(数据库)、收银台(Web 服务器)、货架(静态资源)都在同一个店面里,顾客(用户)的需求在店内即可全部满足,无需联系外部。 * 分布式架构 ≈ 连锁超市:总部(核心服务)、分店(

By Ne0inhk
# Java 零基础完整入门教程(超详细,循序渐进)

# Java 零基础完整入门教程(超详细,循序渐进)

你想要一套完整的Java编程语言入门教程,这份内容从零基础环境搭建到核心语法+实战案例全覆盖,逻辑清晰、知识点完整,学完能掌握Java基础开发能力,适合纯新手入门学习 ✅ 一、Java 简介 & 核心优势(必知) Java 是一门 面向对象、跨平台、编译型+解释型 的高级编程语言,由Sun公司(现Oracle)推出,诞生至今稳居编程语言排行榜前列。 Java 核心三大特性(灵魂) 1. 跨平台(一次编写,到处运行) :Java代码编译后生成字节码文件(.class),不是直接运行在操作系统,而是运行在 JVM(Java虚拟机) 上。不同操作系统(Windows、Mac、Linux)安装对应版本的JVM,就能运行同一个class文件,这是Java最核心的优势。 2. 面向对象(OOP) :Java纯面向对象,万物皆对象,

By Ne0inhk