【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库的缺陷:

  1. STL库的更新太慢了。
    这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
  2. STL现在都没有支持线程安全。
    并发环境下需要我们自己加锁。且锁的粒度是比较大的。
  3. 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个

  1. 用一个字符串构造
string str("abcdefg");
  1. 用一个字符构造
string str('w');
  1. 用n个字符c构造
string str(10,'x');
  1. 用一段迭代器区间构造
string tmp("abcdefg");
string str(tmp.begin(),tmp.end());
  1. 拷贝构造
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


🔎 下期预告:vector的接口函数 🔍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud学习笔记(一)_快速入门

SpringCloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spr…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的&#xff0c;集群非常方便&#xff0c;因为Erlang天生就是一门分布式语言&#xff0c;但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…

SwiftUI 中限制任意视图为指定的屏幕旋转方向

功能需求 在 SwiftUI 开发中,我们有时需要限制 App 中某些视图为特定的屏幕旋转方向,而另一些视图不做限制(或做其它限制),这可以做到吗? 如上图所示:我们成功的限制了 SwiftUI 中不同视图对应于不同的屏幕旋转方向(Interface Orientations)。 在本篇博文中,您将学到…

Mac操作系统上设置和配置PPPoE连接

嗨&#xff0c;在使用Mac的小伙伴么&#xff01;你是否在Mac操作系统上尝试设置和配置PPPoE连接&#xff0c;却不知道怎么设置&#xff1f;别担心&#xff0c;今天我将为你一步步教你如何在Mac上进行设置和配置。无论你是新手还是有经验的用户&#xff0c;本文都将帮助你轻松完…

2023国赛数学建模C题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

React绑定antd输入框,点击清空或者确定按钮实现清空输入框内容

其实实现原理和vue的双向绑定是一样的&#xff0c;就是监听输入框的onChange事件&#xff0c;绑定value值&#xff0c;当输入框内容发生变化后&#xff0c;就重新设置这个value值。 示例代码&#xff1a;我这里是统一在handleCancel这个函数里面处理清空逻辑了&#xff0c;你们…

【深度学习】实验02 鸢尾花数据集分析

文章目录 鸢尾花数据集分析决策树K-means 鸢尾花数据集分析 决策树 # 导入机器学习相关库 from sklearn import datasets from sklearn import treeimport matplotlib.pyplot as plt import numpy as np# Iris数据集是常用的分类实验数据集&#xff0c; # 由Fisher, 1936收集…

c++存取dat数据

众所周知&#xff0c;dat是一个类似加密的二进制格式文件&#xff0c;很多人喜欢将游戏数据保存在dat文件中&#xff0c;只有知道你的存放格式&#xff0c;才能够将数据破解出来&#xff0c;因而研究了dat文件的存取方式。其实就是c文件的操作&#xff0c;只不过是在取的时候需…

git管理代码

理论上改代码前要pull一次&#xff0c;然后在push前在pull一次 改代码前pull一次是为了获取最新的同步&#xff0c;但是coding也是需要时间的&#xff0c;难保敲代码的这段时间没有人动远程仓库的东西&#xff0c;所以在改完代码要push的时候也应该再pull一下看有无冲突&#x…

jvs-rules(规则引擎)更新:新增功能介绍

jvs-rules更新内容 1.复合变量新增数据补充节点&#xff0c;实现请求回来的数据再以入参方式请求其他数据进行数据补充&#xff08;例如通过参数A&#xff0c;请求回数据B&#xff0c;再以数据B为入参&#xff0c;请求回数据C&#xff09; 2.规则流结束节点支持新增、新建、引…

c++都补了c语言哪些坑?

目录 1.命名空间 1.1 定义 1.2 使用 2.缺省参数 2.1 概念 2.2 分类 3.函数重载 4.引用 4.1 概念 4.2 特性 4.3 常引用 4.4 引用和指针的区别 5.内联函数 1.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将…

使用go语言、Python脚本搭建一个简单的chatgpt服务网站。

使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己&#xff0c;自学了go语言编程和机器学习相关学习&#xff0c;但是一味学习理论&#xff0c;终究是枯燥的&#xff0c;于是自己弄点小项目做。 在这之前&#xff0c;建议您需要掌握以下两个技…

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说&#xff0c;开发一款定制化的小程序不仅可以提升服务效率&#xff0c;还可以增强品牌形象和用户粘性。那么&#xff0c;如何定制开发人力资源类的小程序呢&#xff1f;下面…

深度丨Serverless + AIGC,一场围绕加速创新的升维布局

作者&#xff1a;褚杏娟 上图来源于基于函数计算部署 SD实现光影效果 前言&#xff1a; Serverless 在中国发展这些年&#xff0c;经历了高潮、低谷、现在重新回到大众视野。很多企业都非常感兴趣&#xff0c;部分企业开始大规模应用&#xff1b;也有一些企业对在生产环境真正…

【pytorch】Unfold和Fold的互逆操作

1. 参数定义 Unfold https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold Fold https://pytorch.org/docs/stable/generated/torch.nn.Fold.html#torch.nn.Fold 注意&#xff1a;参数当中的padding是在四周边补零&#xff0c;而当fold后的尺寸…

找风景类视频素材就上这5个网站

免费高清的风景视频素材&#xff0c;我推荐你去这几个网站下载&#xff0c;赶紧收藏起来~ 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多&#xff0c;像风景、植…

Docker创建Consul并添加权限控制

一、部署Consul 1、拉取镜像&#xff1a; docker pull consul:<consul-version> 2、运行 docker run --name consul1 -p 8300:8300/tcp -p 8301:8301/tcp -p 8301:8301/udp -p 8302:8302/tcp -p 8302:8302/udp -p 8500:8500 -p 8600:8600/tcp -p 8600:8600/udp -v /h…

建设全球研发中心城市,长沙政协将会发挥怎样的作用?

政协力量&#xff0c;会如何推动一座城市的发展&#xff1f;在全国各大城市都力“拼经济、搞创新”的时代大背景下&#xff0c;人民政协的力量会如何助推长沙建设全球研发中心城市呢&#xff1f; 这是笔者此前一直很好奇的两个问题。8月24日&#xff0c;一场由长沙市政协举办的…

《存储IO路径》专题:数据魔法师DMA

初识DMA 大家好,今天我要给大家介绍一位在计算机世界中不可或缺的魔法师——DMA(Direct Memory Access)。让我们一起揭开这位魔法师的神秘面纱,看看它是如何让数据在内存之间自由穿梭的。 DMA这位魔法师可是大有来头。在现代计算机系统中,CPU、内存和各种设备之间需要进…

Android 之 LayoutInflater (布局服务)

本节引言&#xff1a; 本节继续带来的是Android系统服务中的LayoutInflater(布局服务)&#xff0c;说到布局&#xff0c;大家第一时间 可能想起的是写完一个布局的xml&#xff0c;然后调用Activity的setContentView()加载布局&#xff0c;然后把他显示 到屏幕上是吧~其实这个底…