【C++庖丁解牛】STL简介 | string容器初次见面


📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


请添加图片描述


目录

  • 1. 什么是STL
  • 2. STL的版本
  • 3. STL的六大组件
  • 4. STL的重要性
  • 5. 如何学习STL
  • 6.STL的缺陷
  • 7. 为什么学习string类?
  • 8. 标准库中的string类
    • 8.1 string类(了解)
    • 8.2 string类的常用接口说明(注意下面我只讲解最常用的接口)
    • 8.3 string类对象的容量操作
    • 8.4 测试string容量相关的接口
      • 📖size、length和capacity
      • 📖clear接口
      • 📖resize接口
      • 📖reserve接口
      • 📖empty接口
    • 8.5 string类对象的访问及遍历操作
      • 反向迭代器
      • const迭代器


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的重要性

STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一系列的通用模板类和函数,用于实现常用的数据结构和算法。STL的重要性主要体现在以下几个方面:

  1. 提高开发效率:STL提供了丰富的容器(如vector、list、map等)和算法(如排序、查找、遍历等),可以直接使用这些现成的模板,避免了手动实现这些功能的繁琐过程,大大提高了开发效率。

  2. 提供高性能的数据结构和算法:STL中的容器和算法都经过精心设计和优化,具有高效的性能。例如,vector提供了快速的随机访问和动态扩容的能力,而算法库中的排序和查找算法采用了高效的实现方式,可以在大规模数据处理中获得较好的性能。

  3. 代码可重用性:STL中的容器和算法都是通用的,可以适用于各种类型的数据。通过使用STL,我们可以编写出更加通用、可复用的代码,提高代码的可维护性和可扩展性。

  4. 标准化和规范化:STL是C++标准库的一部分,它定义了一套统一的接口和规范,使得不同的开发者可以使用相同的方式来操作数据结构和算法。这样可以提高代码的可读性和可理解性,方便代码的交流和共享。

  5. 丰富的功能和灵活性:STL提供了多种容器和算法的选择,可以根据具体的需求选择合适的容器和算法。同时,STL还支持自定义类型的容器和算法,可以根据实际情况进行扩展和定制。

在工作中
网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。

5. 如何学习STL

学习STL(Standard Template Library)是C++程序员的重要一步,它提供了一组通用的数据结构和算法,可以大大提高代码的复用性和开发效率。以下是学习STL的一些建议:

  1. 理解STL的组成部分:STL由容器(Containers)、迭代器(Iterators)和算法(Algorithms)三个主要组成部分构成。容器用于存储数据,迭代器用于访问容器中的元素,算法用于对容器中的元素进行操作和处理。

  2. 学习STL的容器:STL提供了多种容器,如vector、list、set、map等。每种容器都有自己的特点和适用场景,需要了解它们的特性、操作方法和性能特点。

  3. 掌握STL的迭代器:迭代器是STL中非常重要的概念,它提供了一种统一的访问容器元素的方式。了解迭代器的种类和使用方法,能够灵活地遍历和操作容器中的元素。

  4. 熟悉STL的算法:STL提供了丰富的算法,如排序、查找、变换等。学习这些算法的使用方法和适用场景,能够快速地解决各种常见的问题。

  5. 阅读STL的源码和文档:阅读STL的源码可以深入理解其实现原理和设计思想,同时也可以学习到一些高效的编程技巧。此外,还可以参考STL的官方文档或相关书籍,了解更多细节和使用技巧。

  6. 实践和练习:通过实际的项目或练习题来应用STL,加深对其的理解和掌握。可以尝试使用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类?

学习string类是因为它是C++中用于处理字符串的重要类之一。使用string类可以方便地进行字符串的操作和处理,包括字符串的连接、截取、查找、替换等。相比于C风格的字符串处理函数,string类提供了更多的功能和便利性。

通过学习string类,你可以掌握以下知识点:

  • 字符串的创建和初始化:可以使用构造函数或者赋值操作符来创建和初始化string对象。
  • 字符串的基本操作:可以使用成员函数来获取字符串的长度、访问特定位置的字符、比较字符串等。
  • 字符串的连接和拼接:可以使用加号运算符或者成员函数来实现字符串的连接和拼接。
  • 字符串的截取和提取:可以使用成员函数来截取子串或者提取特定位置的字符。
  • 字符串的查找和替换:可以使用成员函数来查找子串或者替换特定字符或子串。
  • 字符串的转换和格式化:可以使用成员函数来实现字符串与其他数据类型之间的转换,以及字符串的格式化输出。

总之,学习string类可以帮助你更加高效地处理字符串,提高编程效率和代码可读性。
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

8. 标准库中的string类

8.1 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;

8.2 string类的常用接口说明(注意下面我只讲解最常用的接口)

  1. string类对象的常见构造
(constructor)函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点)拷贝构造函数

这里重点示范三个重点的string构造:

#include<iostream>
using namespace std;

int main()
{
	string s1; // 构造空的string类对象s1
	string s2("hello world"); // 用C格式字符串构造string类对象s2
	string s3(s2); // 拷贝构造s3
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	return 0;
}

运行结果:

在这里插入图片描述

8.3 string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

8.4 测试string容量相关的接口

📖size、length和capacity

sizelength都可以输出string容器中存储的字符串长度
capacitystring容器的容量

int main()
{
	// 注意:string类对象支持直接用cin和cout进行输入和输出
	string s("hello, world!!!");
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

在这里插入图片描述

📖clear接口

将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小

int main()
{
	string s("hello, world!!!");
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;
}

在这里插入图片描述

📖resize接口

list容器的resize()函数用于改变容器的大小。它接受一个参数,该参数表示容器的新大小。

当新大小小于当前大小时,resize()函数会删除多余的元素,使容器的大小等于新大小。
当新大小大于当前大小时,resize()函数会在容器末尾添加默认构造的元素,直到容器的大小等于新大小。

  • 将s中有效字符个数增加到10个,多出位置用’a’进行填充
int main()
{
	string s("hello");
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

在这里插入图片描述

  • 将s中有效字符个数增加到15个,多出位置用缺省值’\0’进行填充
int main()
{
	string s("hello");
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

在这里插入图片描述

  • 将s中有效字符个数缩小到5个
int main()
{
	string s("hello world");
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

在这里插入图片描述

📖reserve接口

reserve()是list容器的一个成员函数,用于预留一定的内存空间,以提高插入元素的效率。
reserve()函数的作用是为list容器预留一定数量的元素空间,但并不实际创建这些元素。它可以在插入大量元素之前使用,以避免频繁的内存重新分配和复制操作,从而提高性能。

使用reserve()函数的语法如下:

void reserve(size_type n);
其中,n表示要预留的元素数量。

注意 :reserve()函数只会增加容器的容量,并不会改变容器的大小。如果在调用reserve()之后插入的元素数量超过了预留的空间,容器会自动进行内存重新分配。

int main()
{
	string s;
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	// 测试reserve是否会改变string中有效元素个数
	s.reserve(100);
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 测试reserve参数小于string的底层空间大小时,是否会将空间缩小
	s.reserve(50);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
}

在这里插入图片描述

📖empty接口

检测字符串释放为空串,是返回true,否则返回false

int main()
{
	string s;
	int i = s.empty();
	cout << i << endl;
	s = "abcd";
	i = s.empty();
	cout << i << endl;
	return 0;
}

在这里插入图片描述
注意:

  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的底层空间总大小时,reserver不会改变容量大小。

8.5 string类对象的访问及遍历操作

函数名称功能说明
operator[] (重点)返回pos位置的字符,const string类对象调用
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式

注意:
string遍历时使用最多的还是for+下标 或者 范围for(C++11后才支持)

void Teststring4()
{
	string s("hello Bit");
	// 3种遍历方式:
	// 需要注意的以下三种方式除了遍历string对象,还可以遍历是修改string中的字符,
	// 另外以下三种方式对于string而言,第一种使用最多
	// 1. for+operator[]
	for (size_t i = 0; i < s.size(); ++i)
		cout << s[i] << endl;
		//等价于 cout << s.operator[i] << endl;

	// 2.迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << endl;
		++it;
	}

	// string::reverse_iterator rit = s.rbegin();
	// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
	auto rit = s.rbegin();
	while (rit != s.rend())
		cout << *rit << endl;

	// 3.范围for
	for (auto ch : s)
		cout << ch << endl;
}

我们最推荐使用的是迭代器,其重要作用会在后续章节体现

反向迭代器

我们有正向的迭代器还有反向的
在这里插入图片描述

rbegin

在这里插入图片描述

rend

在这里插入图片描述

我们可以使用rbegin和rend进行反向输出

int main()
{
	string s("hello world");
	string::reverse_iterator it = s.rbegin();
	while (it != s.rend())
	{
		cout << *it << "";
		++it;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

const迭代器

const迭代器是一种用于遍历容器中元素的迭代器,它的作用是限制对容器中元素的修改操作。通过使用const迭代器,我们可以确保在遍历容器时不会意外地修改容器中的元素。

const迭代器有以下几个特点:

  1. 只能读取容器中的元素,不能修改它们。
  2. 可以与普通迭代器进行区分,以便在编程中进行类型检查和约束。
  3. 可以用于遍历常量容器,例如const vector、const list等。

对const对象使用迭代器的时候,也需要用const迭代器,这是针对const对象特定的迭代器

int main()
{
	const string s("hello world");
	string::const_reverse_iterator it = s.rbegin();
	while (it != s.rend())
	{
		cout << *it << "";
		++it;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
对于正向的迭代器用法是一样的

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

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

相关文章

Spring Boot工作原理

Spring Boot Spring Boot 基于 Spring 开发&#xff0c;Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能&#xff0c;只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说&#xff0c;它并不是用来替代 Spring 的解决方案&#xff0c;而是和 Spr…

SpringMVC04、Controller 及 RestFul

4、Controller 及 RestFul 4.1、控制器Controller 控制器复杂提供访问应用程序的行为&#xff0c;通常通过接口定义或注解定义两种方法实现。控制器负责解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器类可以包含多个方法在Spring MVC中&#xff0c;对于Contr…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放Video Mixer多路视频拼接应用本方案的SDI接收OSD动态字符叠加…

CorelDRAW Graphics Suite2024专业图形设计软件Windows/Mac最新25.0.0.230版

CorelDRAW Graphics Suite 2024是一款专业的图形设计软件&#xff0c;它集成了CorelDRAW Standard 2024和其他高级图形处理工具&#xff0c;为用户提供了全面的图形设计和编辑解决方案。 该软件拥有强大的矢量编辑功能&#xff0c;用户可以轻松创建和编辑矢量图形&#xff0c;…

JavaScript数组常见实例方法:forEach、filter、map、reduce、find、every等

博客背后的故事 其实我23年7月就学过这些数组方法了&#xff0c;但是为什么24年3月才做笔记呢&#xff1f;这就要讲一个小故事了&#xff08;不想听故事的同学自行拖动滚动条&#xff09; 24年年初我和两个队友合作开发一个小程序。JavaScript中数组的实例方法我已经学了很久…

集万千优点于一身的Haproxy集群,你还不了解?

一、HAProxy介绍 HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统…

怎么做不限扫码次数的文件活码?文件可长期扫描展现下载

如何制作不限扫码次数的文件二维码呢&#xff1f;将文件转二维码后分享给其他人&#xff0c;是现在非常方便的一种文件传输方式。很多小伙伴在制作文件二维码的时候&#xff0c;比较担心的一个问题&#xff0c;就是二维码可以扫码的次数&#xff0c;担心达不到自己预期的效果&a…

C++ 打印输出十六进制数 指定占位符前面填充0

C 打印十六进制数据&#xff0c;指定数据长度&#xff0c;前面不够时&#xff0c;补充0. 代码如下&#xff1a; #include <iostream> #include <iomanip> #include <cmath>using namespace std;int main() {unsigned int id 0xc01;unsigned int testCaseId…

Docker部署SimpleMindMap结合内网穿透实现公网访问本地思维导图

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

【C++】inline内联函数 VS #define宏

文章目录 1. 内联概念2. 内联特点3. 宏的优缺点 1. 内联概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;无函数建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 在release模式下&#xff0c;默认展开生效。 在…

时序报告Report_timing_summary之一步精通配置选项使用

目录 一、前言 二、配置选项概览图 三、配置选项 3.1 Options 3.1.1 report 3.1.2 path limits 3.1.3 path display 3.2 Advanced 3.2.1 report 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、工程示例 4.1 工程设计代码 4.2 约束文件 4.3 Option…

Stable Diffusion WebUI 中英文双语插件(sd-webui-bilingual-localization)并解决了不生效的情况

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍一款中英文对照插件 sd-webui-bilingual-localization&#xff0c;该插件可以让你的 Stable Diffusion WebUI 界面同时显示中文和英文&#xff0c;让我…

【C++】手撕string类(超实用!)

前言 一、标准库中的string类 1.1 string类介绍 1.2 string的常用接口 1.2.1 常用的构造函数 1.2.2 容量操作接口 &#xff08;1&#xff09;size &#xff08;2&#xff09;capacity &#xff08;3&#xff09;empty &#xff08;4&#xff09;clear &#xff08…

stm32学习记录-5.2PWM输出控制sg90舵机角度

源码连接&#xff1a;https://gitee.com/HL12334/stm32-learning-code 前提知识&#xff1a; 1.定时器中断 1.关键概念 1.1pwm输出 1.常用术语 OC&#xff08;output compare&#xff09;输出比较CNT&#xff08;counter&#xff09;&#xff0c;定时器中用于计数的寄存器…

【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

力扣每日刷题 一、977. 有序数组的平方1.1题目1.2、解题思路1.3、代码实现——C 二、76. 最小覆盖子串2.1&#xff1a;题目2.2、解题思路2.3&#xff1a;代码实现——c2.4&#xff1a;易错点 一、977. 有序数组的平方 1.1题目 [题目链接]( 1.2、解题思路 题型&#xff1a;双…

数据中台驱动:高效交付之道

如何保证数据中台高效交付&#xff1f; 在数据行业中&#xff0c;项目交付难题尤为突出&#xff0c;尤其在数据中台领域。数据中台项目交付面临诸多挑战&#xff0c;若不妥善解决&#xff0c;将会降低服务质量&#xff0c;影响企业数字化建设的顺利开展&#xff0c;甚至影响项目…

21 卷积层里的多输入多输出通道【李沐动手学深度学习v2课程笔记】

目录 1. 多输入输出通道&相应代码实现 1.1 多输入 1.2 多输出 1.3 1x1 卷积层 1.4 小结 1. 多输入输出通道&相应代码实现 1.1 多输入 为了加深理解&#xff0c;我们实现一下多输入通道互相关运算。 简而言之&#xff0c;我们所做的就是对每个通道执行互相关操作&a…

电磁兼容(EMC):一文读懂压敏电阻选型

目录 1 MOV 外观结构 2 MOV 常见品牌 3 MOV命名规则 4 MOV 工作原理 5 MOV基本特点 6 MOV典型应用 7 MOV电气参数说明 8 MOV 选型注意事项 8.1 压敏电压V1mA 8.2 峰值脉冲电流 IP&#xff0c;钳位电压VC 8.3 漏电流IR 8.4 结电容 9 有绝缘耐压测试要求时选型 10 …

预处理详解

目录 一&#xff1a;预定义符号 二&#xff1a;#define定义常量 三&#xff1a;#define定义宏 四&#xff1a;带有副作用的宏定义 五&#xff1a;宏的替换规则 六&#xff1a;宏函数的对比 七&#xff1a;# 和 ## 7.1 #运算 7.2 ##预算符 八&#xff1a;命名约定 九&…

mac电脑版MATLAB R2023b for Mac中文激活版

MATLAB R2023b for Mac&#xff1a;科学计算的终极工具 软件下载&#xff1a;MATLAB R2023b for Mac中文激活版下载 &#x1f52c; 探索科学&#xff0c;无限可能 MATLAB R2023b for Mac&#xff0c;助您深入挖掘科学计算的奥秘。从数据分析、算法设计到可视化展示&#xff0c;…