当前位置: 首页 > news >正文

C++入门小馆: 深入string类

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!

我的博客:yuanManGan

我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记  闲言碎语小记坊 题山采玉 领略算法真谛

目录

1.为什么我们要学习string类?

2.标准库中的string类

2.1string类(了解)

2.2 auto和范围for

auto 关键字:

范围for

2.3 string类的常用接口说明

1. string类对象的常见构造

2. string类对象的容量操作

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

4. string类对象的修改操作

5. string类非成员函数


我们学习一个类或者STL,都要经历几个过程,先了解一个类怎么使用,了解里面最常用的接口,了解一个类的底层怎么实现的,根据自己的理解优化改造类。一般能到第二部就很不错了。

1.为什么我们要学习string类?

回想一下我们在c语言中怎么存储字符串呢?没错就是字符数组,还提供了很多关于str的库函数但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。

2.标准库中的string类

2.1string类(了解)

string类的文档介绍  这个网站有很多类的库函数的使用和实例,可以收藏起来,但这个网站,并不是C++官方的网站,而是几个有志青年觉得官网并不好,而做出来的网站。

2.2 auto和范围for

在C++11中多了两个功能,一个是auto关键字,一个是范围for。

auto 关键字:

auto关键字用来作为一个新的类型标识符,可以用auto来声明变量,auto声明的变量必须由编译器推导而来。简而言之auto用来声明的变量会自动匹配你给的右值的类型。

比如这个x变量的类型就是int类型。

当我们想用auto来自动匹配指针类型时我们使用auto和auto*是一个意思,没有区别,但我们用auto声明引用类型时必须加&。

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

我们使用auto声明变量时,必须要进行初始化

如果使用auto一次声明多个变量时,变量的类型必须一致。

auto类型不能声明数组变量

有人问了这个有什么用啊,我自己知道变量类型,那我用这个干嘛啊,不要紧我们学到后面又它的用武之地,我们不要因为自己学习的不够深入就否定这个玩意。

范围for

范围for的作用是对一个有范围的集合进行遍历,用法是for(类型 变量 : 集合),第一部分也就是冒号前面的是用于迭代的变量,第二部分则是范围。

范围for可以对数组和容器对象进行遍历:

2.3 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类型我们对它的<<运算符也进行了重载。

2. string类对象的容量操作

函数名称功能说明
size(重点)
返回字符串有效字符长度
length返回字符串有效字符长度
capacity
返回空间总大小
empty (重点)
检查字符串是否为空串,是返回true,不是返回false
clear (重点)
清空有效字符
reserve (重点)
为字符预留空间
resize (重点)
将有效字符个数改为n个,多余的字符用c填充

有心细的宝宝发现length和size的功能是一样的,然后它的底层实现其实也是一样的。length是由于历史的原因,string存在的历史很久,然后为了和STL里面的类的保持一致所以有了size,后者更常用一点。

前三个

empty,clear:

 reserve

这里扩容的规则,以后再慢慢讲。

resize

这里resize之后的s后面全是'\0' 。

注意:

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

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

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

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

函数名称
功能说明
operator[] (重
点)
返回 pos 位置的字符, const string 类对象调用
begin + end
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位
置的迭代器
rbegin + rend
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位
置的迭代器
范围 for
C++11 支持更简洁的范围 for 的新遍历方式

这里就可以使用auto来声明就很舒服 。

4. string类对象的修改操作

函数名称
功能说明
push_back

在字符串后面加个字符c

append 在字符串后面追加一个字符串
operator+=在字符串后可追加字符或者字符串
c_str返回C格式字符串
find + npos从字符串pos位置开始找字符c,返回该字符在字符串中的位置
rfind 从字符串pos位置开始反着找。
substr在str中从pos位置开始,截取n个字符,然后将其返回
push_back
append
operator+=
c_str
find
substr
1. string 尾部追加字符时, s.push_back(c) / s.append(1, c) / s += 'c' 三种的实现方式差
不多,一般情况下 string 类的 += 操作用的比较多, += 操作不仅可以连接单个字符,还可
以连接字符串。
2. string 操作时,如果能够大概预估到放多少字符,可以先通过 reserve 把空间预留
好。
更加具体,更加详细的讲解在文档里,可以自己查阅,这里就不一一赘述了。

5. string类非成员函数

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

我们发现我们输入空格或者换行时,cin就会停止读取,那我们真的想要读取空格字符该怎么办呢?这是就该我们的getline出场了。

 

getline函数有两个重载,第一个参数都是输入流,即cin,第二个参数是string类型,第三个参数就重要了,如果不传的话就是默认'\n'换行,你也可以指定结束字符。

 

相关文章:

  • 藏品馆管理系统
  • Spring Boot 中基于 Reactor 的服务器端事件(SSE)推送机制实践
  • Linux系统:详解进程等待wait与waitpid解决僵尸进程
  • TensorFlow 实现 Mixture Density Network (MDN) 的完整说明
  • 【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(16):ReactExecutor
  • 蓝桥杯之递归
  • Python异常处理
  • ArcPy Mapping 模块基础
  • 【Unity】bug记录——部分物体突然不受animator控制
  • 释放 Mac 存储空间:Ollama 模型迁移到外接 NVMe 磁盘
  • 验证Kubernetes的服务发现机制
  • kafka的零拷贝技术
  • 【大疆dji】ESDK开发环境搭建(软件准备篇)
  • LangChain框架-检索器详解
  • swagger的简介及使用方法
  • 文字的力量
  • 2021-11-10 C++蜗牛爬井进3退1求天数
  • MySql 三大日志(redolog、undolog、binlog)详解
  • 交换机与路由器的主要区别:深入分析其工作原理与应用场景
  • Ubuntu开启自启动PostgreSQL读取HDD失败处理思路
  • 亚振家居半年内第二次筹划变更控制权:控股股东正与收购方商谈交易核心条款
  • 万斯偕印裔妻子访问印度,4天行程能否推进美印贸易谈判?
  • 秦洪看盘|新热点涌现,A股活力渐显
  • 文旅部:今年中国旅游日活动合作单位扩大至60多家
  • 跨市调任:李强已任河北唐山市检察院党组书记
  • 海南医科大学继续开展部门正职竞聘上岗,致力营造“谁有本事谁来”