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

C++:string类(1)

一.初步了解STL

STL是Standard Template Library的缩写,中文译为标准模板库,是C++标准库的重要组成部分。它本质上是一套基于模板的通用编程工具,通过模板技术实现了数据结构和算法的抽象与复用,让开发者无需重复编写基础功能,直接使用标准化的组件来处理数据。

其核心设计思想是泛型编程(Generic Programming),即通过模板让代码不依赖于具体数据类型,从而适用于多种场景。

 

 以上是C++标准模板库(STL)的核心架构图,清晰呈现其六大组件:

- 容器:如 vector (动态数组)、 map (键值映射 ),提供多样数据存储结构。

- 算法:涵盖 sort (排序)、 find (查找)等,借迭代器操作容器数据。

- 迭代器:像 iterator (普通迭代)、 reverse_iterator (反向迭代 ),是容器与算法的“桥梁”。

- 仿函数:以 greater 、 less 为代表,自定义操作逻辑,辅助算法执行。

- 空间配置器: allocator 负责内存分配与释放,优化容器内存管理。

- 配接器:如 stack (栈)、 queue (队列),基于基础容器封装特定接口,适配不同使用场景。

这些组件相互配合,让STL成为高效、通用的编程工具,助力开发者快速实现复杂数据处理逻辑。

 

二.初识string

1.STL中的string类

C++ 里的  string  是处理字符串的核心工具,本质是  basic_string<char>  类模板的特化定义在  <string>  头文件,位于  std  命名空间。

它解决了 C 语言字符数组(以  \0  结尾)的诸多痛点:无需手动管理内存,自动分配、释放空间,规避缓冲区溢出等问题;还封装丰富成员函数,像  append (拼接)、 find (查找子串 )、 substr (提取子串)等,操作便捷。

使用时,需包含头文件,可通过  using namespace std;  或  std::string  方式引入。构造灵活,支持默认构造(空串)、用 C 风格字符串/其他  string  对象构造,还能指定字符范围、重复字符构造。

日常开发中, string  常用于处理 ASCII 或 UTF - 8 编码文本,能轻松实现输入输出、拼接、查找替换等操作,是高效、安全的字符串处理方案,大幅简化文本相关编程工作。

 

2.auto和范围for

早期 C/C++ 中, auto  用于修饰具自动存储的局部变量,后意义弱化。C++11 起, auto  变为类型指示符,让编译器编译期推导变量类型 :

- 指针用  auto  或  auto*  无区别,引用需显式加  & ;

- 同行声明多变量,类型需一致,因仅推导首个变量类型;

- 可作函数返回值,慎用作参数;

- 无法直接声明数组 。

使用 auto 有这些注意点:声明变量必须有初始化值,保证编译期能明确推导类型;默认推导会忽略引用、const/volatile 修饰,若需保留要显式写 auto&、const auto& 等;简单类型(如 int、double )直接声明类型更清晰,复杂场景(模板、迭代器 )用 auto 提升可读性。

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

示例代码如下:

 以上这段代码通过  Test_String03  函数演示 C++ 中  auto  类型推导与范围 for 循环的用法。先利用  auto  推导  x (int 型)、 y (double 型)并输出;接着用范围 for 遍历数组  a ,分别以值传递( auto e  ,输出原数组元素)、引用传递( auto& e  ,修改元素为 0 后输出 );最后用范围 for 遍历  string  对象  str  ,逐个输出字符。右侧 VS 调试控制台呈现各步骤输出结果,清晰展现  auto  简化类型声明、范围 for 便捷遍历容器的特性 。

 

3.string类的常用借口

3.1string类对象的常用构造

 以上是 C++  string  类的构造函数说明,展示 7 种初始化方式:

①从默认空串、

②拷贝已有  string ,

③到截取子串、

④转换 C 风格字符串,

⑤还支持用字符填充、

⑥迭代器范围构造 。

不同构造函数适配多样场景,帮开发者灵活创建  string  对象。

示例代码如下:

 以上 C++ 代码聚焦  string  类构造与赋值操作 。通过  Test_String01  函数,演示多种初始化方式:默认构造  s1  、用字符串字面量构造  s2  ,还有拷贝构造( s3  拷贝  s2  、 s4  按范围拷贝  s2  、 s5  从指定下标拷贝  s2  子串 )、基于 C 风格字符串构造( s6  拷贝  str  、 s7  取  str  前 6 字符 )、用字符填充构造  s8  。输出验证构造结果后,展示赋值操作: s1  先赋  s2  值,再赋字符串字面量  "xyz"  ,最后赋字符  'c'  ,完整呈现  string  类灵活的初始化与赋值能力,借助 VS 调试窗口输出结果,直观体现代码逻辑执行效果 。

 

3.2string类对象的容量操作

对于字符串结构的简单理解:可以认为字符串是存储字符数组的顺序表。

如下图所示

 定义了  my_string  类,私有成员包含动态字符指针  a ,以及记录长度的  size  和容量的  capacity ,为后续实现字符串的动态管理(如内存分配、扩容等)奠定基础,这些成员是构建自定义字符串类的核心要素 。

string容量操作相关的函数

注意:
 1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
2. clear()只是将string中有效字符清空,不改变底层空间大小。
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
4. reserve(size_t res_arg=0): 为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。

以下是代码示例 展示:

 以上代码聚焦  std::string  的基础方法实践。 Test_String04  函数里,先初始化  s1  为  "hello world"  ,通过  length 、 size  确认有效字符数(结果均为 11 ), capacity  查看总空间(初始 15 )。调用  resize(20, 'b')  扩展有效字符到 20 ,多余位置用  'b'  填充,遍历输出验证。接着用  s1  拷贝构造  s2  , s2.clear()  清空有效字符( size  归 0 ,但  capacity  保留原空间 31 ),再次输出  size  和  capacity  体现变化。整个过程清晰展示  string  类管理长度、空间的核心逻辑,借助 VS 调试控制台输出,直观呈现函数调用后的状态 。

 

 

http://www.lqws.cn/news/548137.html

相关文章:

  • 临床项目计划框架
  • java代码规范
  • 机器学习2——贝叶斯理论下
  • 【Linux手册】进程终止:进程退出和信号的响应机制
  • 微软全新开源的Agentic Web网络项目:NLWeb详解
  • 【C/C++】单元测试实战:Stub与Mock框架解析
  • 【世纪龙科技】吉利博瑞汽车车身诊断与校正仿真教学软件
  • window显示驱动开发—DirectX 图形内核子系统(二)
  • Ai大模型 - ocr图像识别形成结构化数据(pp-ocr+nlp结合) 以及训练微调实现方案(初稿)
  • 第六章 总线
  • 四大高频设计题深度解析:【LRU缓存】、【LFU缓存】、最大频率栈、餐盘栈
  • 论面向服务的架构设计
  • Java项目:基于SSM框架实现的宠物综合服务平台管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
  • MySQL在C中常用的API接口
  • 楼宇自控系统以智能化管控,全方位满足建筑节约、安全与可靠运行需求
  • 嵌入式项目:基于QT与Hi3861的物联网智能大棚集成控制系统
  • 模型部署和推理架构学习笔记
  • <script setup> 语法糖
  • 中高端服装品牌开展全渠道零售业务,如何选OMS订单管理系统?|商派
  • 成都芯谷金融中心·文化科技产业园:绘就区域腾飞新篇章
  • 【Pandas】pandas DataFrame resample
  • 疲劳检测与行为分析:工厂智能化实践
  • 解剖智能运维三基石:Metrics/Logs/Traces
  • 广东广电U点-创维E900-S-海思MV310芯片-海兔线刷烧录固件包
  • 香港 8C 站群服务器买来可以做哪些业务?
  • TCP/IP协议简要概述
  • linux初阶---一些指令
  • day49-硬件学习之I2C(续)
  • Tomcat Maven 插件
  • 第六章 STM32内存管理