C++的STL(入门)

发布时间:2026/7/6 15:03:38
C++的STL(入门) STLstandard template library标准模板库是C标准库的重要组成部分而且是一个包罗数据结构与算法的软件框架。“不懂STL不要说你会C”。STL是C中的优秀作品有了它的陪伴许多底层的数据结构以及算法都不需要自己重新造轮子站在前人的肩膀上健步如飞的快速开发。那么如何学习STL呢可以分为以下三个境界自创建以来经历多年的不断改进STL有许多版本其中SGI版本可读性较高我们后续学习其底层时主要参考此版本。STL有六大组件算法、容器、仿函数、空间配置器、迭代器、配接器。而string就是容器的一种因为容器具有许多相同的地方学习一个以后学习其他就很容易了我们从string开始来学习STL。stringauto关键字auto关键字在早期C/C中就有但使用较少C11赋予了新的含义编译器自动推导变量类型在编译时期自动推导不需要手动写类型。1.auto不能作形参2.auto可以做返回类型但需要谨慎使用缺点1可读性变差无法直接通过函数声明看出返回类型需要根据return语句来判断返回类型缺点2多分支return语句必须保证类型相同否则编译报错缺点3不利于接口维护修改 return 表达式的值类型函数返回值隐性改变容易引发调用代码隐性 bug但也有适用场景函数模板返回类型依赖模板参数无法提前写明类型如下总结普通业务函数少用 auto 返回模板泛型场景优先使用 auto 返回。类型包含“auto”的符号必须具有初始值设定项auto e;//编译器会直接报错3.auto和auto*都可以作为指针类型声明但用auto声明引用类型时必须后面加4.当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。5.auto不能用来声明数组范围for对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因此 C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围自动迭代自动取数据自动判断结束。范围for可以作用到数组和容器对象上进行遍历范围for的底层很简单容器遍历实际就是替换为迭代器后续讲解string的常用接口接口就是类内部的public函数由于string出现时间较早经验不足所以内部接口过多冗余我们只需要熟练掌握熟悉的接口即可string类对象的常见构造string()构造空的string类对象即空字符串stringconst char* s用C-string(c语言中的字符串)来构造string类对象stringconst string s拷贝构造函数string(size_t nchar c)了解 构造一个包含n个字符c的string类对象string类对象的容量操作size返回string类对象的有效字符串长度capacity了解返回string类对象的容量clear清空string类对象有效字符串长度也清零容量不变empty判断string类对象是否为空若为空则返回true若不为空返回falseresize自定义有效字符个数reserve为字符串预留空间resize有两个函数重载void resize (size_t n); void resize (size_t n, char c);如果n小于现在有效字符长度字符串长度缩小到n并将多余的字符删除如果n大于现在有效字符长度字符串长度扩大到n如果实参有传递了字符c那么字符串将在源字符串的追加字符c直到长度达到n如果实参没有传递字符c那么字符串将在源字符串的追加空字符直到长度达到n。reserve函数void reserve (size_t n 0);如果n大于现在string类容量那么string类容量扩大到n或者更大如果n小于等于现在string类容量C没有规定string类容量可能缩小也可能不变。string类对象的访问及遍历操作operator[]返回string类对象的pos位置的字符begin和endbegin返回指向string类对象第一个字符的迭代器end返回指向string类对象最后一个字符的下一个字符的迭代器一般是‘\0’不能被解引用。rbegin和rendrbegin返回指向string类对象最后一个字符的迭代器rend返回指向string类对象第一个字符的前一个字符的迭代器不能解引用。范围for前文已介绍上述string类对象的访问及遍历操作的函数除了范围for都有两个函数重载一个是针对普通对象另一个是针对const对象其字符串中的内容不允许修改。有意思的是begin函数的const版本的返回类型是const_iterator这不是迭代器不能改变的意思而是迭代器指向的内容不允许改变。其他三个函数也是如此string类对象的修改操作operator在字符串后追加字符串strc_str返回C格式字符串find从字符串pos下标开始查找所要查找的字符或字符串npos无符号整型中的最大值substr了解返回从字符串pos下标开始跨度为len的字符串push_back和append了解前者只能尾插一个字符后者有数种重载可尾插字符、字符串等rfind了解从字符串pos下标开始往前查找所要查找的字符或字符串string类非成员函数operator输入运算符重载operator输出运算符重载geline自定义输入字符串的结尾relational operatorsstring类的各种大小比较operator了解尽量少用因为传值返回导致深拷贝效率低VS和g下string的结构原始的 string 仅包含「数据指针、当前长度、总容量」三个成员所有字符串内容都存储在堆内存中。但日常开发中绝大多数字符串长度都很短如文件名、配置项、短文本频繁的堆内存申请与释放会带来不小的性能开销且会有内存碎片问题。字符串足够短时直接将内容存储在 string 对象本身的栈空间内不触发堆内存分配只有当字符串长度超过阈值、内部空间无法容纳时才到堆内存存储。短字符串优化SSO, Small String Optimizationvs下string的结构对象总大小32 字节Release 模式Debug 模式会额外增加调试信息字段体积更大。内部内存布局16 字节联合体长 / 短字符串模式复用这块空间当字符串较短时为内置字符缓冲区最多存放 15 个有效字符 1 个结束符\0当字符串较长时为长字符串模式存储堆内存数据指针指向堆上的字符串内容长度字段8 字节记录当前字符串的有效字符个数容量字段8 字节记录已分配内存的总大小SSO 触发阈值字符串长度16 时使用内部缓冲区长度16 时申请堆内存存储。g下string的结构对象总大小32 字节内部内存布局数据指针8 字节指向字符串内容的起始地址长度字段8 字节记录当前字符串的有效字符个数16 字节联合体长 / 短字符串模式复用这块空间当字符串较短时为内置字符缓冲区最多存放 15 个有效字符 1 个结束符\0当字符串较长时为长字符串模式存储堆内存的总容量SSO 触发阈值字符串长度 ≤ 15 时使用内部缓冲区长度 15 时申请堆内存存储。