第一百一十五天学习记录:C++提高:STL初识(黑马教学视频)

news2024/11/26 2:34:19

STL的诞生

1、长久以来,软件界一直希望建立一种可重复利用的东西
2、C++的面向对象和泛型编程思想,目的就是重复性的提升
3、大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
4、为了建立数据结构和算法的一套标准,诞生了STL

STL基本概念

1、STL,标准模板库
2、STL从广义上分为:容器、算法、迭代器
3、容器和算法之间通过迭代器进行无缝连接。
4、STL几乎所有的代码都采用了模板类或者模板函数。

STL六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
1、容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
2、算法:各种常用的算法,如sort、find、copy、for_each等
3、迭代器:扮演了容器与算法之间的胶合剂。
4、仿函数:行为类似函数,可作为算法的某种策略。
5、适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
6、空间配置器:负责空间的配置与管理。

STL中容器、算法、迭代器

**容器:**顾名思义
STL容器就是将运用最广泛的一些数据结构实现出来
常用的数据结构:数组,链表,树,栈,队列,集合,映射表 等
这些容器分别为序列式容器和关联式容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法:
有限的步骤,解决逻辑或数学上的问题,这一门学科叫做算法(Algorithms)
算法分为:质变算法和非质变算法
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

**迭代器:**容器和算法之间粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表达方式。每个容器都有自己专属的迭代器。
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。

在这里插入图片描述
迭代器和指针是在编程中常用的概念,它们有一些相似之处,但也有一些明显的区别。
定义:指针是一个变量,用于存储内存地址,它可以指向任意类型的数据。迭代器是一种对象或指针,用于遍历容器(如数组、列表、集合等)中的元素。
功能:指针可以直接访问和修改内存中的数据,通过指针运算可以实现对内存的灵活操作。迭代器提供了一种统一的方式来访问容器中的元素,可以按照一定的顺序逐个访问容器中的元素,还可以进行增、删、改等操作。
使用范围:指针在C和C++等语言中广泛使用,用于底层的内存操作。迭代器通常在C++等高级编程语言中使用,为了提供一种统一的方式来遍历和操作容器。
安全性:指针的使用需要注意内存管理的问题,如空指针、野指针等。迭代器相对更安全,它提供了一些方法来确保在容器范围内进行遍历,防止越界访问。

容器算法迭代器初始

了解STL中容器、算法、迭代器概念之后,我们利用代码感受STL的魅力
STL中最常用的容器为Vector,可以理解为数组,下面我们学习如何向这个容器中插入数据,并遍历这个容器。

vector存放内置数据类型

容器:vector
算法:for_each

迭代器:vector<int>::iterator
#include<iostream>
using namespace std;
#include<vector>
#include<string>

void test01()
{
	//创建了一个vector容器,数组
	vector<int> v;
	vector<int>::iterator itBegin = v.begin();//起始迭代器 指向容器中第一个元素
	vector<int>::iterator itEnd = v.end();//结束迭代器 指向容器最后一个元素的下一个位置
	cout << sizeof(v) << endl;
	cout << sizeof(itBegin) << endl;
	cout << sizeof(itEnd) << endl;
	cout << sizeof(vector<int>) << endl;
	cout << sizeof(vector<string>) << endl;
	cout << sizeof(vector<int>::iterator) << endl;
	cout << sizeof(vector<string>::iterator) << endl;
}

int main()
{
	test01();
	return 0;
}

输出:
在这里插入图片描述

在这里插入图片描述

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//第三种遍历方式用到:for_each 标准算法的头文件

//vector容器存放内置数据类型

void myPrint(int val)
{
	cout << val << endl;
}

void test01()
{
	//创建了一个vector容器,数组
	vector<int> v;
	//向容器中插入数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	//第一种遍历方式(比较复杂)
	//vector<int>::iterator itBegin = v.begin();//起始迭代器 指向容器中第一个元素
	//vector<int>::iterator itEnd = v.end();//结束迭代器 指向容器最后一个元素的下一个位置

	//while (itBegin != itEnd)
	//{
	//	cout << *itBegin << endl;
	//	itBegin++;
	//}

	//第二种遍历方式(常用)
	//for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	//{
	//	cout << *it << endl;
	//}

	//第三种遍历方式利用STL提供的遍历算法
	for_each(v.begin(), v.end(), myPrint);
}

int main()
{
	test01();
	return 0;
}

for_each()定义:

在这里插入图片描述

vector存放自定义数据类型

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

//vector容器存放自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

void test01()
{
	//创建了一个vector容器
	vector<Person> v;
	
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person p5("eee", 50);

	//向容器中插入数据
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);

	//遍历容器中的数据
	for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it)
	{
		//cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
		cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
	}
}

//存放自定义数据类型  指针
void test02()
{
	//创建了一个vector容器
	vector<Person*> v;

	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person p5("eee", 50);

	//向容器中插入数据
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	v.push_back(&p5);

	//遍历容器中的数据
	for (vector<Person*>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout << "姓名:" << (*it)->m_Name << " 年龄:" << (*it)->m_Age << endl;
	}
}

int main()
{
	//test01();
	test02();
	return 0;
}

Vector容器嵌套容器

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

//容器嵌套容器
void test01()
{
	vector<vector<int>>v;
	//创建小容器
	vector<int>v1;
	vector<int>v2;
	vector<int>v3;
	vector<int>v4;

	//向小容器中添加数据
	for (int i = 0; i < 4; ++i)
	{
		v1.push_back(i + 1);
		v2.push_back(i + 2);
		v3.push_back(i + 3);
		v4.push_back(i + 4);
	}

	//将小容器插入到大容器中
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);

	//通过大容器,把所有数据遍历一遍
	for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)
	{
		//(*it)----容器vector<int>
		for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
		{
			cout << *vit << " ";
		}
		cout << endl;
	}
}

int main()
{
	test01();
	return 0;
}

在这里插入图片描述

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

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

相关文章

samba挂载报错“mount error(13): Permission denied“

“mount error(13): Permission denied” 环境&#xff1a;CentOS7 挂载报错&#xff1a; [rootchenshuyi ~]# mount -t cifs //127.0.0.1/printers /tmp/samba Password for root//127.0.0.1/printers: mount error(13): Permission denied Refer to the mount.cifs(8) manu…

印制电路板中常用标准有哪些?

在PCB电路板中一般都有哪些标准呢&#xff1f;一起来看看。 1) IPC-ESD-2020&#xff1a;静电放电控制程序开发的联合标准。包括静电放电控制程序所必须的设计、建立、实现和维护。根据某些军事组织和商业组织的历史经验&#xff0c;为静电放电敏感时期进行处理和保护提供指导。…

前端:运用html+css+js模仿百度热搜电影榜鼠标移入特效

前端:运用htmlcssjs模仿百度热搜电影榜鼠标移入特效 1. 实现原理2. 界面布局3. js实现对鼠标移入和移出的监听4. 参考代码如下&#xff1a; 1. 实现原理 百度热搜上电影榜鼠标移入特效如上图所示。个人觉得上述特效实现原理为使用相对定位、绝对定位实现的(鼠标移入和没有移入…

OrangePi Zero2 TTL 连接示意图

OrangePi 目前最方便的就是使用调试串口线进行PC与开发板进行链接。 OrangePi Zero2 GPIO引脚图 TTL连接图 本人使用的型号为CH340模块USB转TTL刷机线&#xff0c;Windows下免驱。 黑线对GND接口&#xff0c;绿线对RX接口&#xff0c;白线对TX接口。

element-ui form表单的动态rules校验

在vue 项目中&#xff0c;有时候可能会用到element-ui form表单的动态rules校验&#xff0c;比如说选择了哪个选项&#xff0c;然后动态显示或者禁用等等。 我们可以巧妙的运用element-ui form表单里面form-item想的校验规则来处理&#xff08;每一个form-item项都可以单独校验…

推荐几个Windows iso镜像下载的网站

文章目录 1. 微软官网2. MSDN网站3. 系统库(xitongku)4. 其他网站最后总结 给大家推荐几个 Windows iso镜像下载网站 1. 微软官网 入口地址&#xff1a;https://www.microsoft.com/zh-cn/software-download 以下载Windows11为例&#xff1a; 1&#xff09;找到下载Windows11…

【教程】查看CPU、GPU架构的拓扑结构和系统信息

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 一些概念 Package&#xff1a;处理器封装。在多处理器系统中&#xff0c;每个物理 CPU 芯片通常被封装在一个单独的封装中&#xff0c;这个封装被称为 Package。一个 Package 可以包含一个或多个物理 CPU 核心。…

计算机组成原理复习-例题版

目录 第一章&#xff1a;计算机系统概论 第二章&#xff1a;机器数 第三章&#xff1a;指令 第四章&#xff1a;机器数运算 第六章&#xff1a;CPU 第七章、第八章、第九章 &#xff1a;总线、辅存、中断 第一章&#xff1a;计算机系统概论 第二章&#xff1a;机器数 ​​…

SVG 简单应用

第一步赋值svg 第二步&#xff1a;fill 填充色设置为“” 第三步设置 svg 颜色和大小

基础算法-单链表

单链表 -> 邻接表:主要用于存储图和树。 双链表 : 主要用于优化某些问题。 单链表的相关操作&#xff1a;1.单链表的初始化 2.将x插到头节点 3.将x插入到下标是k的节点后面 4.将下标是k的节点的后面一个节点删除 1.单链表的初始化 代码&#xff1a; //单链表的初始…

第117天:免杀对抗-反VT沙盒反虚拟机反调试进程APC注入项目保护

知识点 #知识点&#xff1a; 1、反VT-沙盒检测-Go&Python&C 2、反调试-调试检测&进程注入-C 3、反VT反调试-程序保护-工具项目类#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修…

Tripwire 完整性分析工具(Linxu系统)

环境&#xff1a;centos7 工作流程&#xff1a; 当前的系统数据状态建立数据库定期比较系统现状与数据库中的状态属性改变有详细报告分析报告发现入侵 1、安装相关软件包 [roothello ~]# yum install epel-release -y 已加载插件&#xff1a;fastestmirror Repository base …

自学网络安全(黑客)全笔记

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

了解Unity编辑器之组件篇Mesh(三)

Mesh&#xff1a;是一种三维模型的表示形式&#xff0c;它由一系列顶点、三角形&#xff08;或其他多边形&#xff09;和相关属性组成。Mesh用于表示物体的外观和形状&#xff0c;它是可见物体的基本组成部分。通过操作Mesh&#xff0c;开发者可以实现各种视觉效果、物理模拟和…

AI人工智能一键图片/视频换脸-Roop

软件介绍 Roop 换脸技术是一种基于深度学习的人脸图像处理技术。 技术原理 Roop换脸技术的实现主要分为两个步骤&#xff1a;人脸检测与对齐、特征融合与生成。 1.人脸检测与对齐在Roop换脸技术中&#xff0c;首先需要对输入的图像进行人脸检测与对齐。这一步骤的目的是确保…

Ubuntu搭建Samba服务-学习记录

文章目录 Ubuntu安装Samba流程Samba配置文件Samba添加账户配置文件修改Samba服务控制设置开机自动启动通过systemctl 启动服务通过 rc.local 启动 Windows访问参考链接 当前文章仅用于记录&#xff0c;在 Ubuntu中安装使用Samba&#xff0c;在Windows访问 系统环境&#xff1a;…

ChatGPT应用|科大讯飞星火杯认知大模型场景创新赛开始报名了!

ChatGPT发布带来的 AI 浪潮在全球疯狂蔓延&#xff0c;国内掀起的大模型混战已经持续半年之久&#xff0c;国产大模型数量正以惊人的速度增长&#xff0c;据不完全统计&#xff0c;截止7月14号已经达到了111个&#xff0c;所谓的“神仙打架”不过如此了吧。 &#xff08; 包括但…

SpringBoot与文档excel,pdf集成案例分享

一、文档类型介绍 1、Excel文档 Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具&#xff0c;在系统开发中&#xff0c;经常用来把数据转存到Excel文件&#xff0c;或者Excel数据导入系统中&#xff0c;这就涉及数据转换问题。 2、PDF文档 PDF是可移植文档格…

Java程序设计六大原则设计模式

Java程序设计六大原则 一、单一职责原则&#xff1a; 一个接口或者类只有一个原因引起变化&#xff0c;即一个接口或者类只有一个职责&#xff0c;负责一件事情。&#xff08;此原则同样适用于方法&#xff09; 好处&#xff1a;1、复杂性降低&#xff1b;2、可读性提高&…