第九层(1):初识STL

news2024/9/21 14:31:33

文章目录

  • 前情回顾
  • 初识STL
    • STL的诞生
    • STL的基本概念
    • STL六大组件
    • STL中的容器、算法、迭代器
      • 容器
      • 算法
      • 迭代器
    • 容器、算法、迭代器的配合使用
    • vector中的嵌套使用
  • 石碑倒下...后面还有石碑?
  • 本章知识点(图片形式)

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

在上一层中,我见识到了C++中除了面向过程和面向对象之外的第三种编程方式——泛型编程,它可以大大提高代码复用性,主要靠模板去实现,在最后,石碑中说,学习模板不是为了写模板,而是为了更好的使用STL,STL是什么?我怀着疑问上到了第九层,抬头看到的是许久未见的天空…

  • 🚄上章地址:第八层:模板

初识STL

在我还在看天空的时候,一道声音把我从我自己的世界中拉了出来:“别看了,这层就是C++最后一层了,你已经到达塔顶了,这层的力量很强大,同时其中需要掌握的东西很多,我看好你…""顶层了,那你人在哪?我为什么看不到你?”我带着疑问,可是那道声音的主人没有回答我,我看着前面的石碑,心里有点失落,这么长时间的学习,马上就要结束了,心里感觉空落落的…

STL的诞生

  • 长久以来,在编程界中,一直希望建立一种可以重复利用的东西,而C++中的面向对象和泛型编程的主要目的就是提高代码的复用性,但是大多数情况下,数据结构和算法都未能有一套标志,每个人实现都有差异,但是实现内容是一样的,导致在项目中被迫从事了大量的重复工作,为了解决这种现象,就建立了数据结构和算法的一套标准,便是STL。

STL的基本概念

  • STL为标准的模板库,它所有的技术实现都利用到了模板技术,它从广义上讲分为了容器、算法、迭代器,其中,迭代器为连接容器和算法之间的桥梁

STL六大组件

  • STL分为容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
  • 容器:内部为各种数据结构,如vector、list、deque、set、map等,用来存放数据,所以为之容器
  • 算法:内部为各种的常用算法,如sort、find、copy、for_each等
  • 迭代器:扮演容器和算法之间的桥梁
  • 仿函数:行为类似函数,可作为算法的某种策略
  • 适配器:一种用来修饰容器或者仿函数或者迭代器接口的东西
  • 空间配置器:负责空间的配置和管理

在这里插入图片描述

STL中的容器、算法、迭代器

  • STL中的容器、算法、迭代器这三个每个又能分出几个小分支

容器

  • 容器可以分为两种:
  1. 序列式容器:强调值的排序,容器中每个元素都有固定的位置
  2. 关联式容器:二叉树结构,各元素没有严格的物理上的顺序
    在这里插入图片描述

算法

  • 算法同样分为两种:
  1. 质变算法:指运算过程中会更改区间内的元素内容,如:拷贝、替换、删除
  2. 非质变算法:运算过程中不会更改区间内元素的内容,如:查找、计数、寻找极值
    在这里插入图片描述

迭代器

  • 迭代器能依序的寻找某个容器中所含的各个元素,而不会暴露改容器的内部表示方法,每个容器都有属于自己的迭代器,同时可以把迭代器理解为指针,迭代器从种类分有五种:
种类功能支持运算
输入迭代器对数据只读支持++、==、!=
输出迭代器对数据只写支持++
前向迭代器可读可写,并能向前推进迭代器支持++、==、!=
双向迭代器可读可写,并能向前向后操作支持++、–
随机访问迭代器可读可写,可以以跳跃的方式访问数据支持++、–、[n]、-n、<、<=、>、>=
  • 最常用的迭代器为双向迭代器和随机访问迭代器

容器、算法、迭代器的配合使用

  • 上面说到迭代器是它们两个之间的桥梁,那应该怎么去搭配使用它们三个呢?在STL种最常用的容器为vector,可以理解为一个数组,那要怎么去使用这个容器放入数据呢?在使用这个容器之间,先引头文件:
  • #include< vector >
  • 创建方式:
    vector< 数据类型 > 变量名
  • 迭代器:
    vector< 数据类型 > :: iterator

那现在尝试写一个int类型的数组,用vector,并且设计出一种算法来打印它内部有的数据:

#include<vector>
#include<iostream>
using namespace std;

void test1()
{
	int i = 10;
	vector<int> v;
	while (i--)
	{
		v.push_back(i);//像v中上传数据
	}
	vector<int>::iterator b = v.begin();//起始迭代器,指向容器中的第一个元素位置
	vector<int>::iterator e = v.end();//结束迭代器,指向容器中最后一个元素加1的位置
	//第一种遍历方法
	while (b != e)
	{
		//解引用操作找到迭代器指向的元素
		cout << *b << " ";
		b++;
	}
	cout << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
第一种可以看到代码有点长,那有没有短一点的呢?

//第二种方法
void test1()
{
	int i = 10;
	vector<int> v;
	while (i--)
	{
		v.push_back(i);//像v中上传数据
	}
	for (vector<int>::iterator b = v.begin(); b != v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
可以替换成for循环,其实还有第三种方法,可以利用STL中提供的算法:

  • for_each( v.begin , v.end , 函数)

参数中的函数是for_each()在遍历期间会调用的,for_each()遍历的多少次,这个函数就会别调用多少次,同时使用这个算法需要引头文件

  • #include< algorithm >

现在可以试一下第三种方法:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

//用于for_each中的函数
void print(int a)//因为vector为int
{
	cout << a << " ";
}
void test1()
{
	int i = 10;
	vector<int> v;
	while (i--)
	{
		v.push_back(i);//像v中上传数据
	}
	//第三种方式
	for_each(v.begin(), v.end(), print);
	cout << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
三种方法都可以使用,凭借个人喜好来选择。
那现在存放的是编译器的内置类型,可不可以用自定义类型呢?尝试一下:

#include<vector>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

//人类
class person
{
public:
	person(string a, int b)
	{
		_name = a;
		_age = b;
	}
	string _name;
	int _age;
};
void print(person& p)
{
	cout << p._name << "的年龄为" << p._age << endl;
}
void test1()
{
	vector<person> p;
	person p1("张三", 18);
	person p2("李四", 19);
	person p3("王五", 20);
	p.push_back(p1);
	p.push_back(p2);
	p.push_back(p3);
	//第一种方法
	vector<person>::iterator b = p.begin();
	vector<person>::iterator e = p.end();
	while (b != e)
	{
		cout << b->_name << "的年龄为" << b->_age << endl;
		b++;
	}
	cout << endl;
	//第二种方法
	for (b = p.begin(); b != e; b++)
	{
		cout << b->_name << "的年龄为" << b->_age << endl;
	}
	cout << endl;
	//d第三种方法
	for_each(p.begin(), p.end(), print);
	cout << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
可以用自定义类型,并且三种方法都可以成功,同时这里也可以看到,把迭代器当作指针使用,是没有问题的。

vector中的嵌套使用

  • 上面说vector可以看做数组,那一个vector是个一维数组,那如果想用vector创建一个二维数组吗?如果可以怎么去创建?从二维数组去分析,二维数组的数组名代表了首元素地址,是第一个一维数组,那二维数组的本质就是一个数组里面嵌套了一堆数组,那vector是不是可以通过嵌套来实现一个二维数组?通过代码来验证一下:

现在创建一个int类型的二维数组:

#include<vector>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

void test1()
{
	vector<vector<int>> v;//创建大容器
	//创建小容器
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;
	vector<int> v5;
	//往小容器中写入数据
	for (int i = 0; i < 6; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
		v3.push_back(i + 10);
		v4.push_back(i + 15);
		v5.push_back(i + 20);
	}
	//把小容器写入大容器
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);
	v.push_back(v5);
	//通过大容器把小容器中的数都打印出来
	for (vector<vector<int>>::iterator b = v.begin(); b != v.end(); b++)//大容器的迭代器
	{
		for (vector<int>::iterator b1 = (*b).begin(); b1 != (*b).end(); b1++)//要想遍历大容器的数据,要将所有小容器遍历一遍,小容器的迭代器
		{
			cout << *b1 << " ";
		}
		cout << endl;
	}
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
是可以这样去使用的,可以用这样的方式去创建一个二维数组。

石碑倒下…后面还有石碑?

  • 当我掌握STL的基本使用的时候,面前的石碑倒下了,当我以为结束的时候,我看到后面还有一座石碑…

本章知识点(图片形式)

在这里插入图片描述

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么带NOLOCK的查询语句还会造成阻塞

背景客户反映HIS数据库在11点出现了长时间的阻塞&#xff0c;直到手动KILL掉阻塞的源头。请我们协助分析原因&#xff0c;最终定位到.NET程序中使用的SqlDataReader未正常关闭导致。现象登录SQL专家云&#xff0c;进入趋势分析&#xff0c;在活动会话中回溯11点一个小时内的运行…

【Ajax】防抖和节流

一、防抖什么是防抖防抖策略&#xff08;debounce&#xff09;是当事件被触发后&#xff0c;延迟 n 秒后再执行回调&#xff0c;如果在这 n 秒内事件又被触发&#xff0c;则重新计时。如果事件被频繁触发&#xff0c;防抖能保证只有最有一次触发生效&#xff01;前面 N 多次的触…

【Linux IO】文件描述符、重定向、缓冲区

1.open函数1.1第二个参数的解释&#xff1b;O_RDONLY: 只读打开 O_WRONLY: 只写打开 O_RDWR : 读&#xff0c;写打开上面三个常量&#xff0c;必须指定一个且只能指定一个 O_CREAT : 若文件不存在&#xff0c;则创建它。需要使用mode选项&#xff0c;来指明新文件的访问权限 O_…

MyBatis 连接数据库与增删改查

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; ✨精品专栏&#xff1a;数据结构与课程设计 &#x1f525;系列专栏&#xff1a;javaweb 文章目录前…

C++设计模式(8)——命令模式

命令模式 亦称&#xff1a;动作、事务、Action、Transaction、Command 意图 命令模式是一种行为设计模式&#xff0c; 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中&#xff0c; 且能…

linux基本功系列之-lsattr命令实战

文章目录一. lsattr命令实战二. 语法格式及常用选项三. 参考案例3.1 查看指定文件上的隐藏属性&#xff1a;3.2 查看目录的隐藏属性3.3 查看目录中全部文件的隐藏属性总结前言&#x1f680;&#x1f680;&#x1f680; 想要学好Linux&#xff0c;命令是基本功&#xff0c;企业中…

英语学习打卡day4

2023.1.24 1.out of curiosity 出于好奇 out of necessity 出于必要 out of interest 出于利益 out of sympathy 出于同情 out of respect 出于尊敬 out of’ fear 出于害怕 out of desperation 出于不得已/绝望 2.ashore adv.向(或在)岸上;上岸 a在… …的 shore岸- >在…

Java 23种设计模式(5.结构型模式-代理模式)

结构型模式 代理模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。 它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成…

分享127个ASP源码,总有一款适合您

ASP源码 分享127个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 127个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1JpOFmxkovbScxmz0_MhUWg?pwd758t 提取码&#x…

算法:一维与二维最大连续子序列和(子矩阵和,c++实现 动态规划)

文章目录一维最大连续子序列和代码示例二维最大连续子序列和、代码示例一维最大连续子序列和 给你一个序列 【-1&#xff0c;-2&#xff0c;3&#xff0c;6&#xff0c;4&#xff0c;-9】的最大的连续的子序列和的值。 什么是最大连续子序列和&#xff0c;首先要满足两个条件…

Java基础 Stream流方法引用异常

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

19.2、Javaweb案例_Servlet代码抽取优化分页数据redis缓存优化分页数据展示

优化Servlet 目的 减少Servlet的数量&#xff0c;现在是一个功能一个Servlet&#xff0c;将其优化为一个模块一个Servlet&#xff0c;相当于在数据库中一张表对应一个Servlet&#xff0c;在Servlet中提供不同的方法&#xff0c;完成用户的请求。 Idea控制台中文乱码解决&…

线性代数复习——行列式

文章目录第一章 行列式1.1 克拉默法则1.2 n阶行列式1.3 特殊行列式1.4 行列式的性质和推论1.5 余子式和代数余子式1.6 范德蒙德行列式第一章 行列式 1.1 克拉默法则 举例&#xff1a; 对于三元线性方程组 {a11x1a12x2a13x3b1a21x1a22x2a23x3b2a31x1a32x2a33x3b3(1)\begin{cas…

Allegro如何自动导弧操作指导

Allegro如何自动导弧操作指导 在做PCB设计的时候,经常会需要给信号线导弧,如果有大量的走线,导弧线是个比较费时间的工作,Allegro可以自动给信号线导弧,如下图 具体操作如下 选择Route选择Unsupported Prototypes

金融帝国实验室(Capitalism Lab)官方正版游戏『优惠活动政策』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2023春节特卖」 ■时间&#xff1a;2023.01.21&#xff5e;2023.02.28 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&a…

使用ebpf 监控mysqld 内核

一、开发思路分析 我们使用ebpf 监控mysql的话有两个思路去做这件事情 1、kprobe -> hook 掉tcp_sendmsg 和 tcp_recvmsg 一类的内核函数去分析网络协议 2、uprobe -> hook 掉 mysqld 的api函数&#xff0c;然后在此基础上进行统计 我使用的是uprobe 去hook 掉mysql内…

24. 面向对象的思想

1. 面向对象 类似于c/c#/java等高级语言&#xff0c;python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在python中创建一个类和对象是很容易的。关于面向对象的思想及基础&#xff0c;此处不再赘述。 2. 类对象 (1) 类变量&#xff1a;类变量在…

计算机毕业设计选题推荐基于nodejs+Vue360学生宿舍系统

管理员&#xff1b;首页、个人中心、宿舍信息管理、学生管理、宿舍报修管理、访客信息管理、水电费管理、管理员管理、交流论坛、系统管理&#xff0c;学生&#xff1b;首页、个人中心、宿舍报修管理、水电费管理&#xff0c; 前台首页&#xff1b;首页、交流论坛、通知公告、个…

STM32之HAL源码阅读(GPIO章节)

前言 说明 本文只针对于软件层面的阅读&#xff0c;详细操作请查阅对应的手册,使用过标准库的朋友更好的能理解本文针对的是STM32F10x系列&#xff0c;其他的类似 参考资料 STM32F10x中文参考手册 工具 stm32cubemx6.5clion最新版 HAL源码之GPIO的阅读 步骤一&#xff…

Cesium:Indexed 3D Scene Layers (I3S)加载

点击此处,查看完整的OGC标准列表项。Indexed 3D Scene Layers(I3S)标准官网介绍地址为:I3S,相关的GitHub主页地址为:Esri/i3s-spec,其详细介绍文档地址可点击此处查阅。我们的核心点在于介绍如何通过Cesium.js开发框架加载I3S三维场景服务。 目录 Cesium.js:I3S支持情…