【C++】:STL——标准模板库介绍 || string类

在这里插入图片描述

📚1.什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且
是一个包罗数据结构与算法的软件框架

📚2.STL的版本

原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖
P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,
符号命名比较怪异
RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般
SGI版本
由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本

📚3. STL的六大组件

在这里插入图片描述

📚4.STL的重要性

在这里插入图片描述
在这里插入图片描述

📚5.如何学习STL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单总结一下:学习STL的三个境界:能用,明理,能扩展

📚6.STL的缺陷

📚1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新
📚2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的
📚3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取
📚4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的

📚7.为什么学习string类?

C语言中的字符串
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问
面试题(暂不做讲解)
在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数

📚8.标准库中的string类

string类(了解)
string类的文档介绍
📚1. 字符串是表示字符序列的类
📚2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
单字节字符字符串的设计特性
📚3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)
📚4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)
📚5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个
类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作
总结:
📚1. string是表示字符串的字符串类
📚2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作
📚3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
📚4. 不能操作多字节或者变长字符的序列
在使用string类时,必须包含#include头文件以及using namespace std;
在这里插入图片描述
在这里插入图片描述

我将展示一段代码让大家详细的通过代码来解释上面的问题 因为英文很多同学看不太懂 计算机的知识也比较晦涩难懂

#include<iostream>
#include<string>
#include<Windows.h>
#include<assert.h>
using namespace std;
int main()
{string s1;string s2("hello world");string s3 = s2;string s4(s2);cout << s1;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 1, 6);cout << s5 << endl;string s6(s2, 1);cout << s6 << endl;string s7(s2, 1, 100);cout << s7 << endl;string s8("hello world", 5);cout << s8 << endl;string s9(10, 'x');cout << s9 << endl;s1 = s2;cout << s1 << endl;s1 = "world";cout << s1 << endl;s1 = 'x';cout << s1 << endl;system("pause");return 0;

在这里插入图片描述
我们这里仅仅讲解一下size和length
剩下的我们到后面的STL再讲

#include<iostream>
#include<string>
#include<Windows.h>
#include<assert.h>
using namespace std;
namespace bit
{class string{private:char* _str;size_t _size;size_t _capacity;};
}
int main()
{//遍历和访问string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";cout << s1.operator[](i) << " ";}cout << endl;s1[0] = 'x';cout << s1 << endl;system("pause");return 0;

在这里插入图片描述
这里我们都只是挑选其中部分来讲 因为我们现在学习的知识还不足以支撑我们去写更高级的东西

#include<iostream>
#include<string>
#include<Windows.h>
#include<assert.h>
#include<vector>
#include<list>
int main()
{string s1 = "hello bit";string::iterator it = s1.begin();while (it != s1.end()){cout << *it;it++;}cout << endl;for (auto ch : s1){cout << ch << " ";}cout << endl;string s1;string s2("hello bit");string s3 = "hello bit";//先构造再拷贝构造,创建中间临时变量进行拷贝构造,编译器优化直接进行构造for (size_t i = 0; i < s2.size(); i++){s2[i]++;}cout << s2 << endl;for (size_t i = 0; i < s2.size(); ++i){cout << s2[i] << " ";}cout << endl;for (size_t i = 0; i < s3.size(); i++){s3[i]++;}cout << s3 << endl;system("pause");return 0;// string给逆置一下size_t begin = 0, end = s1.size() - 1;while (begin < end){/*char tmp = s1[begin];s1[begin] = s1[end];s1[end] = tmp;*/swap(s1[begin], s1[end]);++begin;--end;}cout << s1 << endl;// iterator用法像指针string::iterator it = s1.begin();while (it != s1.end()){*it += 1;cout << *it << " ";++it;}cout << endl;reverse(s1.begin(), s1.end());cout << s1 << endl;vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << " ";++vit;}cout << endl;reverse(v.begin(), v.end());vit = v.begin();while (vit != v.end()){cout << *vit << " ";++vit;}cout << endl;list<double> lt;lt.push_back(1.1);lt.push_back(2.1);lt.push_back(3.1);lt.push_back(4.1);list<double>::iterator lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";++lit;}cout << endl;reverse(lt.begin(), lt.end());lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";++lit;}cout << endl;return 0;
}int main()
{string s1("hello world");const string s2("hello world");s1[0] = 'x';//s2[0] = 'x';cout << s2[0] << endl;string::const_iterator it = s2.begin();while (it != s2.end()){//*it += 1;cout << *it << " ";++it;}cout << endl;// yydsfor (auto e : s1){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

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

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

相关文章

基于SpringBoot的SSMP整合案例(业务层基础开发与快速开发)

业务层基础开发 接口类public interface BookService {boolean save(Book book);boolean update(Book book);boolean delete(Integer id);Book getById(Integer id);List<Book> getAll();IPage<Book> getByPage(int currentPage,int pageSize);IPage<Book> …

计算机算法分析与设计(23)---二分搜索算法(C++)

文章目录 1. 算法介绍2. 代码编写 1. 算法介绍 1. 二分搜索&#xff08;英语&#xff1a;binary search&#xff09;&#xff0c;也称折半搜索&#xff08;英语&#xff1a;half-interval search&#xff09;、对数搜索&#xff08;英语&#xff1a;logarithmic search&#xf…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议&#xff0c;最大优点是简单要求网络中的每个路由器都要维护一张表&#xff0c;表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议&#xff0c;它在传输层使用UDP&#xff0c;RIP报文作为UD…

pdf如何让多张图片在一页

pdf保存为一页六张图片的方法是&#xff1a; 1、打开pdf查看器,打开文档。 2、点击【打印】图标进入打印程序&#xff0c;选择打印范围。 3、在【打印处理】选项,选择【每张张上放置多页】。 4、自定义每页放置的图片张数为六张&#xff0c;并对打印排版预览设置。 5、设置打印…

SpringBoot-配置文件properties/yml分析+tomcat最大连接数及最大并发数

SpringBoot配置文件 yaml 中的数据是有序的&#xff0c;properties 中的数据是无序的&#xff0c;在一些需要路径匹配的配置中&#xff0c;顺序就显得尤为重要&#xff08;例如在 Spring Cloud Zuul 中的配置&#xff09;&#xff0c;此时一般采用 yaml。 Properties ①、位…

Nginx(六) Nginx location 匹配顺序及优先级深究(亲测有效)

Nginx配置文件详解请参考另一篇文章 Nginx(三) 配置文件详解 本篇文章主要是探讨Nginx location的匹配顺序&#xff0c;依照惯例&#xff0c;我们还是先贴结论再看测试结果。 匹配顺序 匹配location的过程&#xff0c;其实可以理解成一个在众多选项中寻找最佳答案的过程。当然…

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装&#xff08;单机版本&#xff09;环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装&#xff08;单机版本&#xff09; 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…

物联网网关在工业行业的应用案例

物联网网关在工业行业的应用案例 随着物联网技术的不断发展&#xff0c;物联网网关在工业行业的应用越来越广泛。本文将介绍一个物联网网关在工业行业的应用案例&#xff0c;以期为相关领域的研究和实践提供借鉴和启示。 一、案例背景 某大型制造企业是一家全球知名的汽车制…

【MySQL】运行报错:ERROR 1193 (HY000): Unknown system variable ‘tx_isolation‘ 查看隔离级别报错

1、查看事务隔离级别的时候报错&#xff1a; 原因&#xff1a; 老版本 MySQL 比如 5 中用的是 tx_isolation&#xff0c;而应该是在 5.7.20 版本之后&#xff0c;用的是 transaction_isolation。 所以&#xff1a;在 MySQL 8 及之后的版本中&#xff0c;只需将语句中的 tx_isol…

学习c#的第十四天

目录 C# 接口&#xff08;Interface&#xff09; 接口的特点 定义接口 接口继承 接口和抽象类的区别 C# 命名空间&#xff08;Namespace&#xff09; using 关键字 定义命名空间 嵌套命名空间 C# 接口&#xff08;Interface&#xff09; 接口定义了所有类继承接口时应…

LeetCode47-全排列II-剪枝逻辑

参考链接: &#x1f517;:卡尔的代码随想录:全排列II 这里第一层,used只有一个元素为1,代表只取出了1个元素作为排列,第二层used有两个元素为1,代表取出了2个元素作为排列,因为数组有序,所以重复的元素都是挨着的,因此可以使用如下语句去重. 其中visit[i-1]False的话,就是代表…

机器学习第6天:线性回归模型正则化

文章目录 机器学习专栏 正则化介绍 岭回归 岭回归成本函数 核心代码 示例 Lasso回归 Lasso回归损失函数 核心代码 弹性网络 弹性网络成本函数 核心代码 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 正则化介绍 作用&#xff1a;正则化是为了防止模型过拟合…

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC

下载安装文件。 下载之后点击C项目&#xff0c;他会提示需要安装编译依赖。这个时候需要选择 用于 x86 和 x64 的 Visual C MFCWindows SDK 版本8.1 点击右下角的安装等待即可 error MSB8036: 找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页…

Excel vlookup 如何使用

Excel vlookup 如何使用 打开WX, 搜索 “程序员奇点” Excel vlookup可以说是利器&#xff0c;非常好用的工具&#xff0c;用来查询 Excel 或者进行数据匹配&#xff0c;十分方便。 VLookuP 如何使用&#xff0c;不常用的同学经常容易忘记&#xff0c;这次做个记录&#xff…

【数据分享】2023年我国省市县三级的专精特新“小巨人”企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

文章分类列表进行查询(实体类日期格式设置)

categoryController GetMappingpublic Result<List<Category>> list(){List<Category> cs categoryService.list();return Result.success(cs);} categoryService //列表查询List<Category> list(); categoryServiceImpl Overridepublic List<Cat…

Django模型层

模型层 与数据库相关的&#xff0c;用于定义数据模型和数据库表结构。 在Django应用程序中&#xff0c;模型层是数据库和应用程序之间的接口&#xff0c;它负责处理所有与数据库相关的操作&#xff0c;例如创建、读取、更新和删除记录。Django的模型层还提供了一些高级功能 首…

【STM32】串口和printf

1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播 对讲 电话】 不是有两根线就是全双工&#xff0c;而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本&#xff1a;判断是否有时钟信号&#xff08;时钟线&#xff09;。…

人工智能发展前景

随着人工智能的快速发展&#xff0c;这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能&#xff0c;希望通过自学获得相关技能&#xff0c;进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景&#xff0c;并为大家提供自学人工智能的途…