一.初步了解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循环语法
- 演示了只读遍历和通过引用修改的两种方式