STL基础

news2024/11/13 10:01:02

目录

一、STL的诞生

二、STL基本概念

三、STL六大组件

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

四、容器、算法与迭代器的认识

容器container:存放数据地方

算法algorithm:解决问题的方法

迭代器iterator:容器与算法之间的黏着剂,算法通过迭代器才能访问容器中的元素

五、尝试vector容器

1、存放内置数据类型

2、存放自定义数据类型


一、STL的诞生

        一直以来,软件界面临一个问题:代码重复利用。就像他写某个功能的代码,我也要用但是没拿到手上,必须我再写一份一样的,这样就重复写了,不仅浪费时间还让我们很难受。

        C++面向对象泛型编程的思想,目的就是提高复用性

        为了建立数据结构与算法的一套标准STL就诞生了。


二、STL基本概念

        STL:Standerd Template Library,标准模板库

广义上,STL分为:container容器,algorithm算法,iterator迭代器

        容器和算法通过迭代器进行连接

STL几乎所有的代码都使用了类模板或函数模板


三、STL六大组件

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

①容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据

②算法:各种常用算法,如sort、find、copy、for_each等

③迭代器:作为容器与算法中间的黏着剂

④仿函数:行为类似函数,可作为算法的某种策略

⑤适配器:用来修饰容器或仿函数或迭代器接口

⑥空间配置器:进行空间的配置与管理


四、容器、算法与迭代器的认识

容器container存放数据地方

STL容器就是将一些使用最广泛的数据结构实现出来

常用的数据结构:数组、链表、树、栈、队列、集合、映射表等

这些容器又分为:

序列式容器:强调值的排序,其中每个元素有其固定的位置

关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系


算法algorithm解决问题的方法

以有限的步骤解决逻辑或数学上的问题

分为

质变算法:运算过程中会改变区间中元素的内容,例如拷贝、替换、删除等

非质变算法:运算过程中不改变区间中元素的内容,如查找、计数、遍历、寻找极值等


迭代器iterator容器与算法之间的黏着剂,算法通过迭代器才能访问容器中的元素

提供一种方法,使其能够按序查找某个容器所含的各个元素,而又无需暴露该容器内部的表示方式

每个容器都有其专属的迭代器

迭代器的使用非常类似于指针

种类:

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

常用的迭代器是双向迭代器与随机访问迭代器


五、尝试vector容器

类似于数组

1、存放内置数据类型

容器:vector

算法:for_each

迭代器:vector<int>::iterator


下面使用代码认识vector

首先包含头文件<vector>

#include<vector>

然后:

int main()
{
	// 创建一个vector容器,类似于数组
	vector<int> v;
	// 使用vector的pushback函数插入数据
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	// 通过迭代器访问容器中的数据
	// 方法 1
	vector<int>::iterator v_Begin = v.begin();// 起始迭代器,指向容器中第一个元素
	vector<int>::iterator v_End = v.end();// 结束迭代器,指向容器中最后一个元素的后面一个元素
	// 遍历访问
	while (v_Begin != v_End)
	{
		cout << *v_Begin << " ";
		v_Begin++;
	}
	return 0;
}

这是第一种访问数据的方法

 ②然后我们使用第二种访问数的方法,直接把他们写在一起

	// 方法 2
	for (vector<int>::iterator v_begin = v.begin(); v_begin != v.end(); v_begin++)
	{
		cout << *v_begin << " ";
	}

 

 然后是第三种方式,我们使用内置算法for_each

首先包含标准算法头文件<algorithm>

#include<algorithm>// 标准算法头文件

使用for_each函数

	// 方法 3
	for_each(v.begin(), v.end(), my_print);
	//	     起始位置   结束位置  调用的函数

我们自己实现my_print函数

void my_print(int val)
{
	cout << val << " ";
}

成功输出

而for_each函数的原理:

 

 同样的起始地址与结束地址,以及函数

在for循环里,起始地址不等于结束地址,调用函数,参数为解引用*起始地址,所以我们函数参数是int val


2、存放自定义数据类型

①创建自定义数据类型class  person

class person
{
public:
	person(string name,int age)
	{
		m_age = age;
		m_name = name;
	}
	int m_age;
	string m_name;
};

创建容器,并创建变量并尾插

void test01()
{
		// 创建vector容器v
	vector<person> v;
	// 根据自定义数据类型创建对象
	person p1("Joyce", 21);
	person p2("Tatina", 20);
	person p3("Yomi", 1);
	person p4("nana", 18);
	// 尾插进容器
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	// 访问数据
	for (vector<person>::iterator v_begin = v.begin(); v_begin != v.end(); v_begin++)
	{	// v_begin本质是个指针,可以解引用.  或者-> 访问
		cout << (*v_begin).m_name << "的年龄为" << (*v_begin).m_age << endl;
		cout << v_begin->m_name << "的年龄为" << v_begin->m_age << endl;
	}
}

*v_begin的本质就是 vector后面<>中的person

 ②存放指针类型的自定义数据类型

同样的class person自定义数据类型

class person
{
public:
	person(string name,int age)
	{
		m_age = age;
		m_name = name;
	}
	int m_age;
	string m_name;
};

vector里我们不传入person,而是传入person*,即指针类型

void test02()
{
		// 创建vector容器v
	vector<person*> v;
	// 根据自定义数据类型创建对象
	person p1("Joyce", 21);
	person p2("Tatina", 20);
	person p3("Yomi", 1);
	person p4("nana", 18);
	// 尾插进容器,p是指针,所以带上&
	v.push_back(&p1);
	v.push_back(&p2);
	v.push_back(&p3);
	v.push_back(&p4);
	// 访问数据
	for (vector<person*>::iterator v_begin =v.begin(); v_begin != v.end(); v_begin++)
	{	// *v_begin还是个指针,所以可以再次解引用*,或者->访问
		cout << (*(*v_begin)).m_name << "的年龄为" << (*(*v_begin)).m_age << endl;
		cout << (*v_begin)->m_name << "的年龄为" << (*v_begin)->m_age << endl;
	}
}

*v_begin的本质就是 vector后面<>中的person*


3、vector容器嵌套vector容器

void test03()
{
	// 创建大容器v
	vector<vector<int>> v;
	// 创建小容器
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;
	// 向小容器中加入数据
	int i = -1;
	while (++i != 4)
	{
		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 v_begin = v.begin(); v_begin != v.end(); v_begin++)
	{
		// *v_begin == vector<int> ,所以我们需要再做一次遍历
		for (vector<int>::iterator vv_begin = (*v_begin).begin();vv_begin != (*v_begin).end(); vv_begin++)
		{
			cout << *vv_begin << " ";
		}			
		cout << endl;
	}
}

 差不多是个二维数组

没啥说的,注意 *v_begin的本质就是 vector后面<>中的vector<int>,需要再来一次循环遍历数据,第二次遍历就用的(*v_begin)做对象,也就是(*v_begin).begin()是起始地址,(*v_begin).end()是结束地址,然后再*解引用访问

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

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

相关文章

中级软件设计师备考---软件工程2

目录 软件测试分类和要求测试用例设计测试阶段McCabe复杂度软件维护软件过程改进---CMMICMM英文版CMM中文版CMMI 软件测试分类和要求 分类&#xff1a; 灰盒测试&#xff1a;多用于集成测试阶段&#xff0c;不仅关注输出、输入的正确性&#xff0c;同时也关注程序内部的情况。…

MySQL:插入,更新与删除、索引

一、学习目标 掌握如何向表中插入数据掌握更新数据的方法熟悉如何删除数据掌握对数据表基本操作的方法和技巧了解什么是索引掌握创建索引的方法和技巧熟悉如何删除索引熟悉掌握索引的常见问题 二、实验内容 创建表books&#xff0c;对数据表进行插入、更新和删除操作&#x…

SkyWalking集成Logback的使用

SkyWalking集成Logback的使用 将微服务的日志框架去集成SkyWalking&#xff0c;我们希望在我们微服务中日志中&#xff0c;能够记录当前调用链路的id&#xff0c;然后我们再根据这个id去SkyWalking的前端界面中进行搜索找到对应的调用链路记录。 因为springboot默认实现的日志…

Ansible 的脚本 之playbook 剧本

目录 第一章.playbooks的组成 1.1playbooks的组成部分 1.2运行playbook 1.3定义、引用变量 1.4.指定远程主机sudo切换用户 1.6.when条件判断 1.7.迭代 第二章.Templates模块 2.1.准备模板 2.2.修改主机清单文件 2.3.编写 playbook 第三章.tags 模块 3.1.yaml文件编…

操作系统原理 —— 线程的概念、实现方式、多线程模型(十)

什么是线程&#xff0c;为什么要引入线程&#xff1f; 有的进程可能需要 “同时” 做很多事情&#xff0c;而传统的进程只能串行的执行一系列的程序&#xff0c;为此&#xff0c;引入了 “线程” &#xff0c;来增加并发度。 可以把线程理解为 轻量级进程&#xff0c;线程是可…

剧本杀闯关小程序app软件

剧本杀闯关小程序软件是一种结合了角色扮演和解谜游戏元素的互动娱乐产品&#xff0c;目前在市场上越来越受欢迎。以下是剧本杀闯关小程序软件市场行业情况的一些特点&#xff1a; 市场需求增长&#xff1a;随着人们对于线上互动娱乐的需求增加&#xff0c;剧本杀闯关小程序…

maven install的时候报Unable to find main class

目录 问题描述解决办法解决方案一&#xff1a;添加一个主函数解决方案二&#xff1a;将不是web工程的设置跳过解决方案三&#xff1a;打包插件的作用本质上就是将当前项目所依赖的jar打包到一块&#xff0c;这样jar包就可以运行了&#xff0c;我们完全可以把parent的pom.xml的b…

智慧农业物联网平台建设方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 智慧农业物联网系统组网图 2.2.1 智能温室组网说明 该组网图演示的为小面积示范区&#xff0c;每个连栋温室为 1个灌溉区域&#xff0c;1个子系统&#xff0c;该子系统完成…

学习Typescript(第一弹)

Typescript的基础类型 Boolean类型 let bool: boolean true;Number类型 let num: number 222;String类型 let str: string 码上coding;数组Array类型 对数组类型的定义有两种方式: let arr1: number[] [1,2,3]; let arr2: Array<number | string> [1,2,码上co…

Android APK 反编译后重新打包并签名

APKTool&#xff1a; Apktool 是一个逆向android非常有用的工具&#xff0c;可以用来反编译apk文件&#xff0c;并且能在修改部分资源文件后&#xff0c;重新打包成一个新的apk。 下载连接&#xff1a;http://ibotpeaches.github.io/Apktool/install/ 下载之后文件夹非常清爽&…

电力节能设备远程监控系统解决方案

电力节能设备远程监控系统解决方案 一、项目背景 随着城市化进程的发展&#xff0c;对电力设备安全、可靠、经济运行的要求越来越高&#xff0c;由于没有统一专业的用电现代化管理规划&#xff0c;电力设备管理混乱、数据采集不方便、运行智能化程度低&#xff0c;需要实时掌…

复合查询--- MySQL总结(三)

复合查询 文章目录 复合查询多表查询自连接子查询单行查询多行查询多列子查询合并查询 多表查询 前面讲述的关于进行一个表的简单查询和关于时间函数的相关问题&#xff0c;下面要进行复合查询的相关内容。 这里要使用卡笛尔集的概率让两个表融合成为一个表。 需要使用相应的字…

vue项目为例解决element ui 时间选择器 picker使用样式穿透不起作用问题

今天在开发中 需要修改时间选择器弹出的这个组件的样式 但这个东西比较坑爹 首先 不能影响其他组件 就是其他组件用了时间选择器 不能受到我们写的样式的影响 那么 就只好穿透了 但你会发现 这东西是作用与body下的 就很坑 穿透我试了挺久的 不起作用 但官方文档有提供给我们一…

centos7 配置 sftp 服务器并通过 java 上传文件

虚拟机配置 1、创建sftp用户组 groupadd sftp2、添加用户 useradd -g sftp mysftp3、设置用户密码 passwd mysftp4、创建文件根目录 mkdir /app/data5、将该目录设置到用户上 usermod -d /app/data mysftp6、修改配置文件 vim /etc/ssh/sshd_config7、找到 Subsystem &am…

算法记录 | Day50 动态规划

123.买卖股票的最佳时机III 思路&#xff1a; 1.确定dp数组以及下标的含义 最多可完成两笔交易意味着总共有三种情况&#xff1a;买卖一次&#xff0c;买卖两次&#xff0c;不买卖。 具体到每一天结束总共有 5 种状态&#xff1a; 未进行买卖状态&#xff1b;第一次买入状…

手动封装一个日期处理工具类,几乎覆盖了所有的时间操作(收藏)

工具类包含以下方法&#xff1a; - stringToDate: 将字符串转换为java.util.Date类型- dateToString: 将java.util.Date类型转换为字符串- stringToLocalDateTime: 将字符串转换为LocalDateTime类型- localDateTimeToString: 将LocalDateTime类型转换为字符串- dateToLocalDat…

01-Java 核心基础

Java核心基础 Java 开发基础知识Java 语言概述安装 Java 开发环境 开发体验Hello World 程序Java 注释 Java 开发基础知识 Java 语言概述 Java 是 SUN&#xff08;斯坦福大学网络公司&#xff09;1995 年推出的一门高级编程语言&#xff0c;它是一种面向 Internet 的编程语言&…

医院检验信息管理系统源码(云LIS系统源码)JQuery、EasyUI

云LIS系统是一种医疗实验室信息管理系统&#xff0c;提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明&#xff1a; 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等…

【虹科案例】使用 TCP 分析测量握手时间

如何使用 Allegro Network 万用表的 TCP 分析确定握手时间 握手需要多少时间&#xff1f; 在图 1 中&#xff0c;您可以在虹科Allegro 网络万用表的 TCP 统计数据中看到过去 10 分钟的客户端握手次数。在这里&#xff0c;您可以清楚地看到在指定时间段内有延长的响应时间。但…

计算机专业基础知识

大纲分单元讲解计算机的发展、类型及其应用领域计算机技术的发展计算机应用领域 计算机中数据的表示、存储和处理计算机软、硬件系统的组成及主要技术指标计算机软、硬件系统的组成硬件系统软件系统系统软件应用软件 计算机的结构计算机主要性能指标 自我测试 大纲 计算机的发…