一.初步了解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 调试控制台输出,直观呈现函数调用后的状态 。

 

3.3string类对象的访问以及遍历操作

 示例代码: 以上代码展示了C++中字符串(`std::string`)的几种常见操作方式,包括访问、修改和遍历。

1. operator[] 示例:

   - 展示了如何使用`[]`运算符访问和修改字符串中的字符

   - 演示了const字符串只能读取不能修改的特性

 

2. begin + end 示例:

   - 使用正向迭代器遍历字符串

   - 通过解引用迭代器修改字符串内容

   - 将字符串转换为大写

 

3. rbegin + rend 示例:

   - 使用反向迭代器遍历字符串

   - 将字符串转换为小写

   - (注意:代码中有拼写错误`rand()`应为`rend()`)

 

4. 范围for循环示例:

   - 展示了C++11的范围for循环语法

   - 演示了只读遍历和通过引用修改的两种方式

 

 

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

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

相关文章

如何避免静态变量初始化中的异常

确保初始化表达式的安全性 基本数据类型初始化 对于基本数据类型&#xff08;如int、double、boolean等&#xff09;的静态变量初始化&#xff0c;要确保赋值的表达式是合法的。例如&#xff0c;在初始化一个int类型的静态变量时&#xff0c;避免出现除数为零的情况。 class Sa…

【151】基于Springboot+Vue实现的校园订餐管理系统小程序(有文档+PPT+视频)

系统介绍 视频演示 基于SpringbootVue实现的校园订餐管理系统小程序&#xff08;有文档PPT视频&#xff09; 基于SpringbootVue实现的校园订餐管理系统小程序采用前后端分离的架构方式&#xff0c;系统设计了管理员、商家、用户三种角色&#xff0c;系统分为管理端、小程序端&…

从 0 到 1:基于 Qwen3 Embedding 的 RAG 智能问答系统搭建指南

RAGFlow 是一个基于深度文档理解的开源 RAG&#xff08;检索增强生成&#xff09;引擎。 与 LLM 集成后&#xff0c;它能够提供真实的问答功能&#xff0c;并以来自各种复杂格式数据的可靠引用为支撑。 教程链接&#xff1a;OpenBayes 控制台 使用云平台:OpenBayes signup -…

Prompt Distillation for Efficient LLM-based Recommendation

题目 基于LLM的高效推荐的快速蒸馏 论文地址&#xff1a;https://dl.acm.org/doi/10.1145/3583780.3615017 摘要 大语言模型&#xff08;LLM&#xff09;在各种任务上表现出了无与伦比的建模能力&#xff0c;例如多步推理&#xff0c;但是这些模型的输入大部分仅限于纯文本&am…

JDBC 工具类:1.0到3.0版本

一、引言 在 Java 开发中&#xff0c;与数据库的交互是一项常见且重要的任务。JDBC&#xff08;Java Database Connectivity&#xff09;作为 Java 语言访问数据库的标准 API&#xff0c;为我们提供了统一的接口来操作各种数据库。然而&#xff0c;每次进行数据库操作都编写大…

实验室建设案例 | 洛阳职业技术学院—人工智能实验室

院校简介 洛阳职业技术学院位于千年古都、牡丹花城、丝路起点洛阳&#xff0c;是一所由洛阳市政府举办的公办高职院校&#xff0c;成立于2011年&#xff0c;办学历史可追溯到1945年的豫西公学。学校全面贯彻党的教育方针&#xff0c;围绕落实立德树人根本任务&#xff0c;秉承“…

vue2中,修改对象数组中元素对应的属性,页面不更新的问题解决

有如下代码&#xff1a; // 有一个数组 let dataAry [{name: haha, age: 20},{name: hello, age: 21} ] // 这个数组在模板中使用了v-for进行循环 v-for"one of dataAry" :name"one.name" :address"one.address"// 子组件中使用如下&#xff…

代理模式:控制对象访问的守门员[特殊字符],优雅实现功能增强与访问控制!

代理模式&#xff1a;控制对象访问的守门员&#x1f510;&#xff0c;优雅实现功能增强与访问控制&#xff01; 文章目录 代理模式&#xff1a;控制对象访问的守门员&#x1f510;&#xff0c;优雅实现功能增强与访问控制&#xff01;前言&#xff1a;为什么需要代理&#xff1…

《人间词话》PPT课件

《人间词话》简介 《人间词话》是王国维所著的一部文学批评著作。《人间词话》作于1908&#xff5e;1909年&#xff0c;最初发表于《国粹学报》。该作是作者接受了西洋美学思想之洗礼后&#xff0c;以崭新的眼光对中国旧文学所作的评论。 《人间词话》PPT课件下载 夸克网盘分享…

解剖智能运维三基石:Metrics/Logs/Traces

3秒知识卡 三基石关系&#xff1a; Metrics&#xff08;指标&#xff09;→ 系统脉搏&#xff08;CPU/错误率&#xff09; Logs&#xff08;日志&#xff09;→ 事件日记&#xff08;错误堆栈/用户行为&#xff09; Traces&#xff08;追踪&#xff09;→ 血缘地图&#xff08;…

从代码学习深度学习 - 情感分析:使用卷积神经网络 PyTorch版

文章目录 前言加载数据集一维卷积最大时间汇聚层textCNN模型定义模型加载预训练词向量训练和评估模型总结前言 在之前的章节中,我们探讨了如何使用循环神经网络(RNN)来处理序列数据。今天,我们将探索另一种强大的模型——卷积神经网络(CNN)——并将其应用于自然语言处理…

深入解析分布式训练基石:ps-lite源码实现原理

分布式机器学习框架是现代推荐、广告和搜索系统的核心支撑。面对海量训练数据和高维稀疏特征&#xff0c;参数服务器&#xff08;Parameter Server, PS&#xff09; 架构应运而生。作为早期经典实现的ps-lite因其简洁性和完整性&#xff0c;成为理解PS原理的绝佳切入点。本文将…

IDEA 插件开发:Internal Actions 与 UI Inspector 快速定位 PSI

在开发 IntelliJ 平台插件的过程中&#xff0c;你常常需要搞清楚 某个 IDE 弹框背后是如何操作 PSI&#xff08;Program Structure Interface&#xff09; 的。下面这篇笔记将介绍如何通过 Internal Actions、UI Inspector 以及调试技巧快速定位 PSI 调用链。 1. 启用 Internal…

26考研|数学分析:多元函数微分学

前言 本章我们将进行多元函数微分学的学习&#xff0c;多元函数微分学与一元函数微分学相对应&#xff0c;涉及到可微性、中值定理、泰勒公式等诸多问题的探讨与研究&#xff0c;本章难度较大&#xff0c;在学习过程中需要进行深度思考与分析&#xff0c;才能真正掌握这一章的…

数星星--二分

https://www.matiji.net/exam/brushquestion/17/4498/F16DA07A4D99E21DFFEF46BD18FF68AD 二分思路不难&#xff0c;关键的区间内个数的确定 #include<bits/stdc.h> using namespace std; #define N 100011 #define inf 0x3f3f3f3f typedef long long ll; typedef pair&…

Oracle/PostgreSQL/MSSQL/MySQL函数实现对照表

函数列表清单 函数作用OraclePOSTGRESQLMSSQLMYSQL求字符串长度LENGTH(str)LENGTH(str)LEN(str)LENGTH(str)字符切割SUBSTR(str,index,length)SUBSTR(str,index,length)SUBSTRING(str,index,length)SUBSTRING(str,index,length)字符串连接str1||str2||str3...strNstr1||str2||…

pycharm客户端安装教程

二、 pycharm客户端安装 打开pycharm官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 选择其他版本 选择2018社区版本&#xff0c;点击下载 双击下载的安装程序(第一个弹框允许)&#xff0c;选择下一步 更改安装路径&#xff0c;在pycah…

博图SCL语言中用户自定义数据类型(UDT)使用详解

博图SCL语言中用户自定义数据类型&#xff08;UDT&#xff09;使用详解 一、UDT概述 用户自定义数据类型&#xff08;UDT&#xff09;是TIA Portal中强大的结构化工具&#xff0c;允许将多个相关变量组合成单一数据结构。UDT本质是可重用的数据模板&#xff0c;具有以下核心优…

Vscode自定义代码快捷方式

首选项>配置代码片段 >新建全局代码片段 (也可以选择你的语言 为了避免有的时候不生效 选择全局代码) {"console.log": { //名字"prefix": "log",//prefix 快捷键 &#xff1a; log"body": ["console.log($1);", //b…

ESP32 008 MicroPython Web框架库 Microdot 实现的网络文件服务器

以下是整合了所有功能的完整 main.py(在ESP32 007 MicroPython 适用于 Python 和 MicroPython 的小型 Web 框架库 Microdot基础上)&#xff0c;实现了&#xff1a; Wi‑Fi 自动连接&#xff08;支持静态 IP&#xff09;&#xff1b;SD 卡挂载&#xff1b;从 /sd/www/ 读取 HTML…