【c++】STL1—STL初识

news2024/9/23 1:40:12

文章目录

  • STL的基本概念
  • STL六大组件
  • STL中容器、算法、迭代器
    • 容器
    • 算法
    • 迭代器
  • 容器算法迭代器初识
    • vector存放内置数据类型
    • vector存放自定义数据类型
    • 容器嵌套容器


c++的面向对象和泛型编程思想,目的就是复用性的提升。
为了建立数据结构和算法的一套标准,诞生了STL。

STL的基本概念

  • STL(Standard Template Library,标准模板库)
  • STL从广义分为:容器(container)、算法(algorithm)、迭代器(iterator
  • 算法要通过迭代器访问容器中的内容
  • STL几乎所有的代码都采用了模板类或者模板函数

STL六大组件

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

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

STL中容器、算法、迭代器

容器

STL容器就是将运行最广泛地一些数据结构实现出来。

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

这些容器分为序列式容器关联式容器
序列式容器:强调值的排序,序列式容器中每个元素均有固定的位置;
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系。

算法

有限的步骤,解决逻辑或属性上的问题,这一门学科叫做算法(algorithms)。

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

迭代器

迭代器是容器和算法之间粘合剂。

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

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

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

迭代器种类:
在这里插入图片描述
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器。

容器算法迭代器初识

STL中最常用的容器为vector,可以理解为数组。

vector存放内置数据类型

容器:vector
算法:for_each
迭代器:vector::iterator

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//标准算法头文件

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

void test()
{
	//创建一个vector容器对象,并且通过模板参数指定容器中存放的数据的类型
	vector<int> v;//<>里面是要操作的数据类型,给容器起名为v

	//向容器中插入数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	//通过迭代器访问容器中的数据
	//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
	//v.begin()开始迭代器,这个迭代器指向容器中第一个元素
	//v.end()结束迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
	//vector<int>::iterator拿到vector<int>这种容器的迭代器类型
	vector<int>::iterator itbegin = v.begin();
	vector<int>::iterator itend = v.end();

	//第一种遍历方式
	while (itbegin != itend)
	{
		cout << *itbegin << endl;
		itbegin++;
	}
	cout << "----------" << endl;

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

	//第三种遍历方式,利用STL提供遍历算法,头文件algorithm
	for_each(v.begin(),v.end(),print);
	cout << "----------" << endl;
}

int main()
{
	test();
	system("pause");
	return 0;
}

vector存放自定义数据类型

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

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

void test01()
{
	//创建一个vector容器对象
	vector<person> v;

	person p1("a", 10);
	person p2("b", 11);
	person p3("c", 12);
	person p4("d", 13);
	person p5("e", 14);

	//向容器中添加数据
	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<person*> v;

	person p1("a", 20);
	person p2("b", 21);
	person p3("c", 22);
	person p4("d", 23);
	person p5("e", 24);

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

	//遍历容器
	//辨别it是什么类型,看<>里面是什么内容,这里person是指针,person*是二级指针
	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;
	}
}

int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

容器嵌套容器

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

void test()
{
	vector<vector<int>> v;

	//创建小容器
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;

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

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

	//通过大容器,把所有数据遍历一遍
	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()
{
	test();

	system("pause");
	return 0;
}

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

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

相关文章

并查集(13张图解)--擒贼先擒王

目录 前言 故事 &#x1f33c;思路 &#x1f33c;总结 &#x1f33c;代码 &#x1f44a;观察过程代码 &#x1f44a;正确代码 &#x1f44a;细节代码 来自《啊哈算法》 前言 刚学了树在优先队列中的应用--堆的实现 那么树还有哪些神奇的用法呢&#xff1f;我们从一…

前端卷算法系列(二)

前端卷算法系列&#xff08;二&#xff09; 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样…

zookeeper集群的搭建,菜鸟升级大神必看

一、下载安装zookeeperhttp://archive.apache.org/dist/zookeeper/下载最新版本2.8.1http://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/二、上传安装包到服务器上并且解压&#xff0c;重命名tar -zxvf apache-zookeeper-3.8.1-bin.tar.gzmv apache-zookeeper-3.8.1-b…

设计环形队列

文章目录1.思路分析1.1队列空满分析1.2出队分析2.循环队列设计1.思路分析 1.1队列空满分析 首先我们假设一个长度为4的环形队列 队头front 队尾rear 当队列为空时 frontrear 当队列满时 frontrear 所以我们无法判断队列是满的或者空的 因此我们多加入一个空间使队列长度为5&am…

什么是自适应平台服务?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 什么是自适应平台服务?1.1 自适应平台服务包含哪些功能簇呢?1.1.1 ara::sm 状态管理 (SM)1.1.2 ara::diag 诊断管理 (DM)1.1.3 ara::s2s 信号到服务映射1.1.4 ara::nm 网络管理 (NM)1.1.5 ara::ucm 更新和配置管…

数据结构期末复习总结(前章)

作者的话 作为一名计算机类的学生&#xff0c;我深知数据结构的重要性。在期末复习前&#xff0c;我希望通过这篇博客给大家一些复习建议。希望能帮助大家夯实数据结构的基础知识&#xff0c;并能够更好地掌握数据结构和算法的应用。 一、绪论 数据&#xff1a;信息的载体&am…

【测试】loadrunner安装

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录备注一、下载安装包二、安装loadrunner三、修改浏览器配置今天搬砖不努力&#xff0c;明天地位不稳定&#xff01; 备注 电脑最好有IE浏览器&#xff0c;但是没有也没事儿。&#xff08;注意&#xff1a;IE浏览器不…

Bootstrap系列之栅格系统

Bootstrap栅格系统 bootatrap提供了一套响应式&#xff0c;移动设备优先的流式网格系统&#xff0c;随着屏幕或者视口尺寸的增加&#xff0c;系统会自动分为最多12列&#xff0c;多出12列的将不再此行显示&#xff08;换行显示&#xff09; bootstrap网格系统有以下六个类 重点…

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…

【Java基础】操作系统原理

一、进程 进程是指一段程序的执行过程&#xff0c;会消耗系统资源如CPU、内存、网络等。 一个进程包含静态代码段&#xff0c;数据&#xff0c;寄存器地址等 进程的特点 动态性&#xff08;可动态地创建、结束进程&#xff09; 并发性&#xff08;进程被独立调度并占用处理…

服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】

服务器部署项目我们大家都会遇到&#xff0c;但是有些铁子会遇到很多的问题&#xff0c;比如前端部署nginx如何操作&#xff1f; 前端有单纯的静态页面、还有前后端分离的项目&#xff1b;这里博主直接分享最牛最到位的前后端分离项目的前端部署到nginx上面&#xff0c;以若依项…

C语言之习题练习集

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 文章目录牛客网题号&#xff1a; JZ17 打印从1到最大的n位数牛客网题号&#x…

Laravel框架03:DB类操作数据库

Laravel框架03&#xff1a;DB类操作数据库一、概述二、数据表的创建与配置三、增删改操作1. 增加信息2. 修改数据3. 删除数据四、查询操作1. 取出基本数据2. 取出单行数据3. 获取一个字段的值4. 获取多个字段的值5. 排序6. 分页五、执行任意的SQL语句一、概述 按照MVC的架构&a…

详讲函数知识

目录 1. 函数是什么&#xff1f; 2. C语言中函数的分类&#xff1a; 2.1 库函数&#xff1a; 2.2 自定义函数 函数的基本组成&#xff1a; 3. 函数的参数 3.1 实际参数&#xff08;实参&#xff09;&#xff1a; 3.2 形式参数&#xff08;形参&#xff09;&#xff1a; …

我那点浅薄的MOS模拟集成电路基础

记录研究生课程模拟集成电路设计所学到的一些知识&#xff0c;这门课是由刘老师和周老师一起上的&#xff0c;刘老师讲模拟集成部分这个模集跟模电还是有很大的区别的&#xff0c;模拟集成主要是针对MOS器件的集成&#xff0c;学得更专业也更深&#xff1b;而周老师讲的是信号检…

华为OD机试题,用 Java 解【图片整理】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Yolov3,v4,v5区别

网络区别就不说了&#xff0c;ipad笔记记录了&#xff0c;这里只说其他的区别1 输入区别1.1 yolov3没什么特别的数据增强方式1.2 yolov4Mosaic数据增强Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式&#xff0c;但CutMix只使用了两张图片进行拼接&#xff0c;…

前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02

接上一篇&#xff1a;《前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01》 上一篇说到&#xff0c;在Handler.js的this.options下面的代码&#xff0c;this.assetsExtractor new AssetsExtractor(this.options)&#xff0c;表明op…

【C++】类与对象理解和学习(下)

放在专栏【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;建议先看完【C】类与对象理解和学习&#xff08;上&#xff09;【C】类与对象理解和学习&#xff08;中&#xff09;本章知识点概括Ⅰ本章知识点概括Ⅱ初始化列表前言在上一篇文章中&#xff0c;…

笔记本一锁屏程序就结束(锁屏程序结束、锁屏程序退出)(在此时间后关闭硬盘、硬盘关闭)(计算机空闲状态)

笔记本一锁屏程序就结束原因问题背景问题原因在此时间后关闭硬盘何为“空闲状态”&#xff1f;解决办法问题背景 我用向日葵开了个远程连接我家里的电脑&#xff0c;但是我的笔记本一锁屏&#xff0c;过了一会回来再打开&#xff0c;向日葵就自动结束了&#xff0c;不知道咋回…