【C++进阶(一)】STL大法以及string的使用
💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C++从入门到精通⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习C++
🔝🔝

STL标准库
- 1. 前言
- 2. STL库的版本以及缺陷
- 3. STL库的六大组件
- 4. string的使用
- 4.1 string类对象常见构造
- 5. string类对象的容量操作
- 5.1 size和capacity接口函数
- 5.2 empty和clear函数
- 5.3 resize和reserve函数
- 6. 迭代器以及string的访问和遍历
- 6.1 运算符重载[ ]
- 6.2 反向迭代器和范围for
- 7. string类对象的修改操作
- 7.1 c_str和find函数
- 8. insert和erase函数
- 9. 总结以及拓展
1. 前言
由于C语言的标准库不够强大
没有数据结构和一些基本算法
什么都需要程序员自己实现
所以C语言在某种意义上并不实用

本章重点:
本章会简单介绍STL的各个版本
STL的六大组件和怎样学STL
STL的缺陷
重点讲解string的使用
熟悉string的重要接口
目标是讲完能够独自使用string库
2. STL库的版本以及缺陷
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要阅读部分源代码主要参考的就是这个版本
比较重要的是P.J版和SGI版
一个被Windows系统采用
一个被Linux系统采用
STL库的缺陷:
- STL库的更新太慢了。
这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。 - STL现在都没有支持线程安全。
并发环境下需要我们自己加锁。且锁的粒度是比较大的。 - STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。

3. STL库的六大组件
请看下图:

后期对于STL的学习将按照以下顺序:
-
进阶内容:
各种算法
string vector
list stack
queue deque
priority_queue
仿函数 -
高阶内容:
map和set
AVL数和红黑树
哈希相关
4. string的使用
首先,所有的STL库函数的使用都要查看
C++字典来学习接口函数,并且模拟实现
先看string解释(不懂可以翻译)

简单来说,string是表示字符串的
字符串类
该类的接口与常规容器的接口基本相同
再添加了一些专门用来操作string的常规操作
4.1 string类对象常见构造

一共有七个构造函数,但实用的有下面5个
用一个字符串构造
string str("abcdefg");
用一个字符构造
string str('w');
用n个字符c构造
string str(10,'x');
用一段迭代器区间构造
string tmp("abcdefg");
string str(tmp.begin(),tmp.end());
拷贝构造
string tmp("abcdefg");
string str(tmp);
注:迭代器类似于指针,在string和
vector中,迭代器就是普通指针
在后期会介绍迭代器的概念
5. string类对象的容量操作
请看下图:

string的内部实现中有size
和capacity两个和容量相关的变量
size代表字符串有效长度
capacity代表字符串的实际长度

5.1 size和capacity接口函数
size和capacity函数比较简单
可自行查看接口函数的返回值,参数
使用方法:
string str("abcdefg");
int size = str.size();
int capacity = str.capacity();
切记要加上括号!
size和capacity是成员函数
用.或者->访问
5.2 empty和clear函数
empty函数十分简单
若类对象是空串,就返回true
若不是空串就返回false

clear需要注意的点:
- clear后,使用empty会返回true
- clear函数只将size清零
- clear函数不会改变capacity
5.3 resize和reserve函数

resize函数需要注意的点:
- 此函数既能改变size也能改变capacity
- 在不初始化的情况下直接将size扩为n
- 将size扩为n并且用n个字符c初始化

reserve函数需要注意的点:
- 此函数只改变capacity不改变size
6. 迭代器以及string的访问和遍历
迭代器: iterator
像指针一样的类型,用法和指针相似
- 函数begin返回第一个位置的迭代器
- 函数end返回size位置的迭代器

迭代器的使用:
string str("abcdefg");
string::iterator it = str.begin();
while(it != str.end())
{cout<<*it<<endl;it++;
}
迭代器可以像指针一样++和–
也可以解引用拿到指向的内容
6.1 运算符重载[ ]

它可以让我们像使用数组一样
随机访问string类对象中的字符
比如:
string str ("Test string");for (int i=0; i<str.size(); ++i){cout << str[i];}
并且string类会检查[]是否越界
- string不喜欢用迭代器,因为[]更好用
- vector也不喜欢用迭代器,[]更好用
- list不能用[],因为它不支持随机访问
6.2 反向迭代器和范围for
反向迭代器: reverse_iterator
顾名思义是倒着走的迭代器
和反向迭代器相对应的是
rbegin和rend函数

使用方法:
string s("abcdefg");
string::reverse_iterator rit = s.rbegin();
while(rit != s.rend())
{cout<<*rit;rit++;
}
rit++是往前走,会打印gfedcba
支持了迭代器后就可以使用范围for遍历:
string str("abcdefg");
for(auto ch : str)
{cout<<ch;
}
7. string类对象的修改操作

首先,npos是int的最大值
append不常用,+=很常用!
push_back使用:
string str("abcde");
str.push_back('f');
str.push_back('g');
//str现在是:abcdefg
接口函数:operator+=

此函数可以+=一个字符或一个字符串
甚至是一个string类对象:
string tmp("hij");
string str("abc");
str+='d';
str+="efg";
str+=tmp;
//str现在为:abcdefghij
7.1 c_str和find函数
c_str函数返回字符串从\0结尾的字符串
但是c++中的字符串不一定以\0结尾
c++中字符串类以size为准来结尾
所以它叫:c_str,是c语言的规则

下面这段代码可以自己理解一下:
string filename("test.cpp");
cout << filename << endl;
cout << filename.c_str() << endl;filename += '\0';
filename += "string.cpp";
cout << filename << endl; // string 对象size为准
cout << filename.c_str() << endl; // 常量字符串对象\0

find函数比较简单
大家阅读文档就应该知道这是啥意思
8. insert和erase函数

insert函数可以在pos位置插入
一个字符或者一个字符串或者
一个string类,甚至还可以指定插入
字符串的长度,接口很多,需要自己理解

erase函数可以删除从pos位置
往后len个字符,若erase函数全用
缺省参数,则从0位置删除npos个
也就是将字符全部删除完
甚至可以删除一段迭代器区间
9. 总结以及拓展
string类需要我们单独拿出来学习
这是因为STL库函数中很多接口
都是相似的,学习了string后
会对vector和list等等容器的学习有帮助
vector的接口函数:

不能说和string一模一样
只能说和string完全相同
大家有兴趣可以自行去搜vector和list
拓展题目以及阅读
学完string后可以尝试做一下简单题:
反转字符
唯一出现的字符
最后一个单词的长度
字符是否回文
拓展阅读
string类的operator<</ operator>>/ getline
相关文章:
【C++进阶(一)】STL大法以及string的使用
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:C从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习C 🔝🔝 STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…...
leetcode做题笔记99. 恢复二叉搜索树
给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 思路一:模拟题意 int midOrder(struct TreeNode **pre, struct TreeNode **err1, struct TreeNode **err2, struct TreeNo…...
24 | 紧跟时代步伐:微服务模式下API测试要怎么做?
微服务架构(Microservice Architecture) 微服务是一种架构风格。在微服务架构下,一个大型复杂软件系统不再由一个单体组成,而是由一系列相互独立的微服务组成。其中,各个微服务运行在自己的进程中,开发和部…...
【论文阅读】POIROT:关联攻击行为与内核审计记录以寻找网络威胁(CCS-2019)
POIROT: Aligning Attack Behavior with Kernel Audit Records for Cyber Threat Hunting CCS-2019 伊利诺伊大学芝加哥分校、密歇根大学迪尔伯恩分校 Milajerdi S M, Eshete B, Gjomemo R, et al. Poirot: Aligning attack behavior with kernel audit records for cyber thre…...
K8S cluster with multi-masters on Azure VM
拓扑参考: 在 Azure VM 实例上部署 KubeSphere 基础模板 需要修改 IP 地址和 VM Image的可以在模板中修改。 {"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion": &q…...
初阶c语言:趣味扫雷游戏
目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程:查看前节三子棋的内容 初始化雷区 编辑 优化棋盘 随机埋入地雷 点击后的决策 实现此功能代码 game();的安排 前言 《扫雷》是一款大众类的益智小游戏&…...
JVM——内存模型
1.java内存模型 1.1 原子性 1.2 问题分析 这里与局部变量自增不同,局部变量调用iinc是在局部变量表槽位上进行自增。 静态变量是在操作数栈自增。 这里的主内存和工作内存时再JMM里的说法。 因为操作系统是时间片切换的多个线程轮流使用CPU. 1.3解决方法 JMM中…...
java八股文面试[JVM]——元空间
JAVA8为什么要增加元空间 为什么要移除永久代? 知识来源: 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili...
科技云报道:云计算下半场,公有云市场生变,私有云风景独好
科技云报道原创。 大数据、云计算、人工智能,组成了恢弘的万亿级科技市场。这三个领域,无论远观近观,都如此性感和魅力,让一代又一代创业者为之杀伐攻略。 然而高手过招往往一瞬之间便已胜负知晓,云计算市场的巨幕甫…...
Oracle 如何给大表添加带有默认值的字段
一、讲故事 你是否遇到过开发人员添加字段,导致数据库锁表问题? 但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢? 为什么呢? 询问得知,**加的慢时候是带上了default默…...
记录Taro大坑2丢失api无法启动
现象 解决方案 看了很多。很多说要改成一致的版本号。其实没什么用。 正确方案 再新建一个模板跑起来对比config的配置,以及package.json发现关闭预编译即可。预编译导致api丢失...
Java-Maven-解决maven deploy时报 401 Reason Phrase Unauthorized 错误
Java-Maven-解决maven deploy时报 401 Reason Phrase Unauthorized 错误 环境 Java JDK 1.8Maven 3.3.9 引言 项目需要打成jar包上传到私服,供其它项目引用。此时需要执行 mvn clean deploy 命令,执行过程中报 401 错误。 解决401错误 报错信息 执…...
【数据结构】 栈(Stack)的应用场景
文章目录 🌏前言🍀改变元素的序列🚩场景一📌解析: 🚩场景二📌解析: 🎍将递归转化为循环🌳[括号匹配](https://leetcode.cn/problems/valid-parentheses/)&…...
人力资源小程序的设计原则与实现方法
随着移动互联网的快速发展,小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说,开发一款定制化的小程序不仅可以提升服务效率,还可以增强品牌形象和用户粘性。那么,如何定制开发人力资源类的小程序呢?下面…...
检查Javascript对象数组中是否存在对象值,如果没有向数组添加新对象
需求: 如果我有以下对象数组: [ { id: 1, username: fred }, { id: 2, username: bill }, { id: 2, username: ted } ]有没有办法循环遍历数组,以检查特定的用户名值是否已经存在,如果它什么都不做,但是如果它没有用…...
UG\NX二次开发 使用录制功能录制操作记录时,如何设置默认的开发语言?
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用…...
【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战
五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种。相比来说transportClient API效率更高,transportClient 是通过Elasticsearch内部RPC的形式进行请求…...
VBJSON报错:缺少:语句结束
项目中使用JSON库VBJSON时报错: 编译错误:缺少:语句结束 cJSONScript和cStringBuilder报相同的错误,都在第一行: VERSION 1.0 CLASS 研究了半天没啥结果,之前使用这个库的时候没有什么问题,所以判定是当前…...
Docker安装ES+kibana8.9.1
参考:基于Docker安装Elasticsearch【保姆级教程、内含图解】_docker elasticsearch_Acloasia的博客-CSDN博客 创建网络 docker network create es-net 基于Docker安装Elasticsearch 拉取镜像 docker pull elasticsearch:8.9.1 挂载文件 mkdir -p /usr/local/e…...
12. Oracle中case when详解
格式: case expression when condition_01 then result_01 when condition_02 then result_02 ...... when condition_n then result_n else result_default end 表达式expression符合条件condition_01,则返回…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
