STL初始---C++

STL目录

  • 1.STL的产生原因
  • 2.STL基本概念与六大组件
    • 2.1基本概念
    • 2.2六大组件
  • 3.STL中容器、算法、迭代器
    • 3.1容器
    • 3.2算法
    • 3.3迭代器
  • 4.STL简单应用
    • 4.1vector存放内置数据类型
    • 4.2vector存放自定义数据类型
    • 4.3vector容器嵌套容器

在这里插入图片描述

1.STL的产生原因

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

总的来说,STL就是为了提高复用性。

2.STL基本概念与六大组件

2.1基本概念

  • STL(Standard Template Library,标准模板库);
  • STL 从广义上分为: 容器(container) 、算法(algorithm) 、迭代器(iterator)
  • 容器算法之间通过迭代器进行无缝连接。
  • STL 几乎所有的代码都采用了模板类或者模板函数的方式。

2.2六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

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

3.STL中容器、算法、迭代器

3.1容器

容器: 置物之所也
STL容器就是将运用最广泛的一些数据结构实现出来;
常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表

这些容器分为序列式容器关联式容器两种:

序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置(怎么输入怎么存储,不排序)。
关联式容器:二叉树结构,各元素之间=没有严格的物理上的顺序关系(自动排序)。

3.2算法

算法: 问题之解法也
有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)

算法分为:质变算法非质变算法

  • 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等;
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

3.3迭代器

迭代器: 容器和算法之间粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。

  • 每个容器都有自己专属的迭代器

迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。
迭代器种类:

种类功能支持运算
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前和向后操作读写,支持++、–,
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写,支持++、–、[n]、-n、<、<=、>、>=
  • 常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

4.STL简单应用

了解STL中容器、算法、迭代器概念之后,我们利用代码感受STL的魅力

STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器。

容器: vector

算法: for_each

迭代器: vector<int>::iterator

4.1vector存放内置数据类型

示例:

#include <vector>
#include <algorithm>

void Print(int val)
{
	cout << val << " ";
}
void test01()
{
	//创建一个vector容器---int数组
	//并且通过模板参数指定容器中存放的数据的类型
	vector<int> v;//头文件 vector

	//向容器中插入数据
	v.push_back(9);
	v.push_back(99);
	v.push_back(999);
	v.push_back(9999);
	v.push_back(99999);

	//通过迭代器访问容器中的数据-三种遍历方法
	
	法一:
	每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
	vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
	begin起始迭代器(地址)---指向容器中第一个元素
	//vector<int>::iterator itBegin = v.begin();
	end结束迭代器(地址)---指向容器中最后一个元素的下一个位置
	//vector<int>::iterator itEnd = v.end();
	//while (itBegin != itEnd)
	//{
	//	cout << *itBegin << " ";
	//	itBegin++;
	//}
	//cout << endl;

	法二:
	//for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	//{
	//	//*it表示的是< >中的类型元素
	//	cout << *it << " ";
	//}
	//cout << endl;
	
	//法三:
	//利用STL提供遍历算法for_each,头文件 algorithm
	for_each(v.begin(), v.end(), Print);//Print 打印函数
	cout << endl;
}

在这里插入图片描述

4.2vector存放自定义数据类型

#include <vector>
#include <algorithm>
#include <string>
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}

	string m_name;
	int m_age;
};
void test02()
{
	//创建一个vector容器---int数组
	vector<Person> v;

	//向容器中插入数据
	Person p1("唐僧", 30);
	Person p2("孙悟空", 99999);
	Person p3("猪八戒", 9999);
	Person p4("沙和尚", 999);
	Person p5("白龙马", 99);

	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);

	//通过迭代器访问容器中的数据---以for循环为例
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		//*it表示的是< >中的类型元素
		//cout << "姓名:" << (*it).m_name << "\t年龄:" << (*it).m_age << endl;//值访问
		cout << "姓名:" << it->m_name << "\t年龄:" << it->m_age << endl;//地址访问
	}
}

在这里插入图片描述

4.3vector容器嵌套容器

  • 输出效果类似于二维数组

示例:

#include <vector>
#include <algorithm>
void test03()
{
	//创建一个嵌套vector容器
	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循环为例
	for (vector<vector<int>>::iterator its =V.begin(); its != V.end(); its++)
	{
		//*its表示的是< >中的类型元素---vector<int>
		for (vector<int>::iterator vit = (*its).begin(); vit != (*its).end(); vit++)
		{
			cout << *vit << " ";
		}
		cout << endl;
	}
}

在这里插入图片描述


  1. 封装、继承、多态。 ↩︎

  2. 模板。 ↩︎

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

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

相关文章

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中&#xff0c;使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据&#xff0c;并结合代理IP技术&#xff0c;以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术&#xff0c;通过代理服务器转发请求&a…

MDS300-16-ASEMI电源控制柜MDS300-16

编辑&#xff1a;ll MDS300-16-ASEMI电源控制柜MDS300-16 型号&#xff1a;MDS300-16 品牌&#xff1a;ASEMI 封装&#xff1a;M25 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;300A 功率(Pd)&#xff1a;大功率 芯片个数&#xff1…

记录 使用FFMPEG 笔记本摄像头推流

一、使用 FFMPEG 测试摄像头拉流显示 # 获取摄像头名称 ffmpeg -list_devices true -f dshow -i dummy# 我笔记本上的摄像头名称如下 device_pnp_\\?\usb#vid_0408&pid_1020&mi_00#6&199e90f7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global# 使…

基于JAVA的房屋出售出租系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

vue手写卡片切换,并且点击获取到卡片信息

需求&#xff1a;做一个卡片样式的列表&#xff0c;之后有一些基本信息&#xff0c;之后卡片选中后样式不一样&#xff0c;默认选中第一个卡片&#xff0c;点击卡片后可以获取到卡片的信息 一、效果 二、关键代码 index默认重0开始,activeTable默认为0,0-0等于0&#xff0c;但…

【Flink】FlinkSQL读取hive数据(批量)

一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…

PostgreSQL如何使用UUID

离线安装时&#xff0c;一般有四个包&#xff0c;都安装的话&#xff0c;只需要开启uuid的使用即可&#xff0c;如果工具包(即 postgresql11-contrib&#xff09;没有安装的话&#xff0c;需要单独安装一次&#xff0c;再进行开启。 开启UUID方法 下面介绍一下如何开启&#…

第九节HarmonyOS 常用基础组件27-Rating

1、描述 提供在给定范围内选择评分的组件。 2、接口 Rating(options?:{rating:number, indicator?:boolean}) 3、参数 参数名 参数类型 必填 描述 rating number 是 设置并接收评分值。默认值&#xff1a;0&#xff1b;取值范围[0, stars]&#xff0c;小于0取0&am…

AIGC 实战:Ollama 和 Hugging Face 是什么关系?

Ollama和 Hugging Face 之间存在着双重关系&#xff1a; 1. Ollama是 Hugging Face 开发并托管的工具&#xff1a; Ollama是一个由 Hugging Face 自行开发的开源项目。它主要用于在本地运行大型语言模型 (LLM)&#xff0c;特别是存储在 GPT 生成的统一格式 (GPT-Generated Un…

com.alibaba.nacos.api.exception.NacosException: Request nacos server failed

问题描述 安装nacos2.0以上版本&#xff0c;启动报错:com.alibaba.nacos.api.exception.NacosException: Request nacos server failed com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: at com.alibaba.nacos.client.naming.remote.gprc.Nami…

做抖音小店怎么选品?给新手商家的三条建议,能让你销量猛增999+

大家好&#xff0c;我是电商花花。 总是担心店铺不出单&#xff0c;没有销量&#xff0c;看着断断续续的收益&#xff0c;新手商家应该都是愁容满面吧。 今天花花从是3个维度上给新手商家一些建议&#xff0c;讲解一下如何高效选品&#xff0c;加你如何让你出单猛增999。 以前…

Java的编程之旅27——继承

1.继承的简介 继承是面向对象编程中的一个重要概念&#xff0c;指的是一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类&#xff0c;继承这个父类的类称为子类或派生类。 通过继承&#xff0c;子类可以继承父类的属性和方法&#xff0c;使得子类具有相似的行为…

Java基于SSM+JSP的超市进销库存管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【深度学习】SSD 神经网络:彻底改变目标检测

一、说明 Single Shot MultiBox Detector &#xff08;SSD&#xff09; 是一项关键创新&#xff0c;尤其是在物体检测领域。在 SSD 出现之前&#xff0c;对象检测主要通过两阶段过程执行&#xff0c;首先识别感兴趣的区域&#xff0c;然后将这些区域分类为对象类别。这种方法虽…

Git修改提交的文件的用户名和邮箱

实现效果 提交的测试二&#xff0c;用户名&#xff1a;git1 邮箱&#xff1a;email1,更改成 newGit1、newEmail1 一、概念 Git配置文件级别 系统级、全局级、本地级&#xff0c;生效规则是本地级>全局级>系统级&#xff0c;也就是当本地级配置上此属性&#xff0c;那么…

Uipath 读取Word模板实现录用通知书PDF批量生成

本文主要讲解如何使用Uipath 读取Excel 面试人员信息表&#xff0c;读取Word模板&#xff0c;再批量生成录用通知书PDF文件&#xff0c;该自动化大大提高了HR 的工作效率。 注&#xff1a;本方案实现采用无代码模式&#xff0c;通过拖拉控件实现。 1. 数据准备 1.1 面试人员…

最简单的基于 FFmpeg 的视音频分离器 - 简化版

最简单的基于 FFmpeg 的视音频分离器 - 简化版 最简单的基于 FFmpeg 的视音频分离器 - 简化版正文结果工程文件下载参考链接 最简单的基于 FFmpeg 的视音频分离器 - 简化版 参考雷霄骅博士的文章&#xff0c;链接&#xff1a;最简单的基于FFmpeg的封装格式处理&#xff1a;视音…

开源免费的NTFS for mac工具mounty

开源免费的NTFS for mac工具mounty 安装依赖 brew install gromgit/fuse/ntfs-3g-macbrew install --cask macfuse安装mounty 如果已经安装macFUSE和ntfs-3g-mac&#xff0c;可以直接点击下载的dmg安装包&#xff0c;安装升级。第一次启动mounty&#xff0c;你需要接受一系列…

DFT系列文章之 《DFT Scan chain》

我们知道,运用DFT技术的基本步骤: 1. 规划scan chain 规划 scan chain,首先将电路中的普通 DFF 换成 scan DFF: 2. scan cell 替换 scan DFF 是在原DFF 的输入端增加了一个 MUX,于是多了几个 pin :scan_in,scan_enable,scan_out。换完之后将所有的 scan DFF 首尾依…

dpdk环境搭建和工作原理

文章目录 1、DPDK环境搭建1.1、环境搭建1.2、编译DPDK 2、DPDK工作原理 1、DPDK环境搭建 1.1、环境搭建 工具准备&#xff1a;VMware、ubuntu16.04。 &#xff08;1&#xff09;VMware添加两个网卡。桥接网卡作为 DPDK 运行的网卡&#xff0c;NAT 网卡作为 ssh 连接的网卡。 …