C++从入门到精通 第十三章(认识STL)

 写在前面:

  1. 本系列专栏主要介绍C++的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程,笔者的原创部分主要在示例代码的注释部分。
  2. 除了参考下面的链接教程以外,笔者还参考了其它的一些C++教材(比如计算机二级教材和C语言教材),笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
  3. 如有错漏欢迎指出。

参考教程:黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili

一、STL初识

1、STL基本概念

(1)C++的面向对象泛型编程思想,目的就是复用性的提升。大多情况下,数据结构和算法都未能有一套标准,这导致了程序员被迫从事大量重复工作,为了建立数据结构和算法的一套标准,STL(Standard Template Library,标准模板库)随之诞生。

(2)STL从广义上分为容器(container)、算法(algorithm)、迭代器(iterator),容器算法之间通过迭代器进行无缝连接。

(3)STL几乎所有的代码都采用了模板类或者模板函数。

2、STL六大组件

(1)容器:各种数据结构,如vector(最常用,可理解为数组)、list、deque、set、map等,用来存放数据,其声明形式为:

        <容器类型>< <容器中的元素类型> > <标识符(容器名)>;

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

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

(2)算法:各种常用的算法,如sort、find、copy、for_each等,使用STL提供的算法要添加头文件<algorithm>

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

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

(3)迭代器:扮演了容器与算法之间的胶合剂,其声明形式为:

        <容器类型>< <容器中的元素类型> >::iterator <标识符(迭代器名)>;

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

②每个容器都有自己专属的迭代器,常用的容器中迭代器种类为双向迭代器,和随机访问迭代器。

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

④迭代器种类:

(4)仿函数:行为类似函数,可作为算法的某种策略。

(5)适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。

(6)空间配置器:负责空间的配置与管理。

二、最常用的容器——vector

1、vector存放内置数据类型

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>   //标准算法的头文件void myPrint(int val)
{cout << val << endl;
}void test01()
{vector<int> v;     //创建了一个vector容器,可以暂时认为它是一个数组v.push_back(10);   //向容器中(尾部)插入一个数据v.push_back(20);v.push_back(40);v.push_back(30);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();system("pause");return 0;
}

2、vector存放自定义数据类型

#include<iostream>
#include<string>
using namespace std;
#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<Person> v;Person p1("AA", 10);Person p2("BB", 20);Person p3("CC", 210);Person p4("DD", 230);Person p5("BE", 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 << "\t年龄:" << it->m_Age << endl;}
}void test02()   //存放自定义数据类型指针
{vector<Person*> v;Person p1("AA", 1000);Person p2("BB", 20);Person p3("CC", 210);Person p4("DD", 230);Person p5("BE", 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 << "\t年龄:" << (*it)->m_Age << endl;}
}int main() {test01();test02();system("pause");return 0;
}

3、vector容器嵌套容器

#include<iostream>
#include<string>
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++){for (vector<int>::iterator it2 = (*it).begin(); it2 != (*it).end(); it2++){cout << *it2 << "  " ;}cout << endl;}
}int main() {test01();system("pause");return 0;
}

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

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

相关文章

下一代自动化爬虫神器--playwright,所见即所得,配合逆向不要太香!!!

文章目录 1.Playwright介绍2.与 Selenium 和 pyppeteer 相比&#xff0c;Playwright 具有以下几个区别和优势3.在爬虫中使用 Playwright 的好处4.环境安装5.屏幕录制6.保留记录cookie信息7.playwright代码编写详解1.第一个Playwright脚本&#xff08;1&#xff09;同步模式&…

有向图的邻接表和邻接矩阵

邻接表 有向图的邻接表是一种常用的表示方法&#xff0c;用于表示图中各个节点之间的关系。在有向图中&#xff0c;每条边都有一个方向&#xff0c;因此邻接表中的每个节点记录了该节点指向的其他节点。 具体来说&#xff0c;有向图的邻接表由一个由节点和它们的邻居节点列表组…

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求&#xff0c;总是能越过缓存&#xff0c;调用数据库&#xff0c;就是缓存穿透。 比如当请求一…

阿里云国际站如何助力餐饮行业出海?

近些年&#xff0c;中国企业出海方兴未艾。全球不同国家的经济政治诉求加剧了商业领域的博弈&#xff0c;全球产业供应链格局持续发生深刻变化。无论是海外建厂&#xff0c;还是海外找市场&#xff0c;中国产业链的全球布局蔚然成风,企业想突破现阶段瓶颈&#xff0c;谋求更好的…

【VIP专属】Python应用案例——基于OpenCV图像卡通化处理图像识别算法实验

目录 一、使用OpenCV卡通化图像和艺术化图像 1、读取图片、窗口显示 2、卡通化处理 3、铅笔画风

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

本地ip被限制,可以用代理ip吗,是怎么实现的

本地IP被限制时&#xff0c;确实可以使用代理IP来解决这个问题。以下是如何通过代理IP实现这一目标的基本过程&#xff1a; 1. 原因与解决方案&#xff1a; 当本地IP地址由于访问频率过高、违反服务条款或者受到防火墙规则屏蔽等原因而无法访问某个网站或服务时&#xff0c;可以…

ros自定义action记录

文章目录 自定义action1. 定义action文件2. 修改 package.xml3. 修改 CMakeLists.txt4. 运行 catkin build5. simple_action_server.py6. simple_action_client.py 测试 自定义action ros 版本&#xff1a;kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.t…

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况&#xff0c;网页有些视频资源或者音频资源不知道如何下载&#xff0c;一直不知道如何解决&#xff0c;为此小编特意带来了这款&#xff1a;Internet Download Manager电脑版&#xff0c;这是一款非常专业且十分好用的下载工具&#xff0c;也就是大…

docker (九)-进阶篇-dockerfile制作zabbix镜像(带python3环境)

环境说明&#xff1a;根据前文docker &#xff08;七&#xff09;部署zabbix进行zabbix告警配置时&#xff0c;发现zabbix没有脚本所需要的python3环境&#xff0c;也没有yum环境 参考 https://www.cnblogs.com/daniel-ming/p/15341636.html Zabbix docker镜像 build …

nifi连接Sql server数据库报错TLS问题

背景&#xff1a; 服务器&#xff1a;Linux nifi版本是&#xff1a;1.21.0 Sql Server版本是&#xff1a;10.50.6000.34 我使用generateTableFetch/queryDatabaseTable连接Sqr Server时报错&#xff1a; (驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接…

【Azure 架构师学习笔记】- Azure Databricks (9) -- UC权限

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (8) --UC架构简介 UC 是Databricks进行数据治理&#xff0c;集中权限管控&#xff0c; 提高大规模数据存储&#xff0c;共享安全性的新工具。通…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

1408: [宁波25届]方格稿纸

题目描述 小猪在小学中认识了很多的字&#xff0c;终于会写一点作文了。某天小猪买了一张方格稿纸来写作文,n 行m 列,形状如下所示&#xff1a; 上图中nm5 。 某天小猪的邻居小小猪来小猪家玩&#xff0c; 用黑墨水笔把小猪新买的方格稿纸涂黑了很多格子。 每个格子不是完全黑…

psp游戏存档收集SAVEDATA

不想从头开始 ppsspp存档目录 pc&#xff1a;ppsspp解压目录\memstick\PSP\SAVEDATA 安卓&#xff1a;根目录\PSP\SAVEDATA 噬神者2(日版) NPJH50832099c645531020001000 風燐-https://wwl.lanzouq.com/iI1R01owozxa 咲夜-https://wwl.lanzouq.com/id1tX1owp2uf につてのぬ…

华为笔记本原厂系统镜像恢复安装教程方法

1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f …

Pormise---如何解决javascript中回调的信任问题?【详解】

本人编程小白一枚&#xff0c;希望多多包涵~ 如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 回调中的信任问题回调给我们带来的烦恼&#xff1f;调用过早…

突破编程_C++_面试(数组(1))

面试题1&#xff1a;详细说明一下数组名是什么&#xff1f; 在 C 中&#xff0c;数组名代表数组首元素的地址。更具体地说&#xff0c;数组名是一个指向数组第一个元素的常量指针。这意味着&#xff0c;当使用数组名时&#xff0c;实际上是在使用指向数组第一个元素的指针。 例…

linux环境下JPS命令未找到

说明 根据小编blog安装JDK后&#xff0c;无使用JPS命令&#xff0c;是因为缺少openjdk-devel包 Linux 上安装及卸载JDK&#xff08;包含yum方式&#xff09;-CSDN博客 安装devel [rootnamenode ~]# jps bash: jps: command not found...查看devel版本 [rootnamenode ~]# yu…

【深度学习:对象跟踪】对象跟踪完整指南 [教程]

【深度学习&#xff1a;对象跟踪】对象跟踪完整指南 [教程] 什么是计算机视觉中的对象跟踪&#xff1f;对象跟踪有哪些不同类型&#xff1f;图像跟踪视频跟踪单目标跟踪多对象跟踪 计算机视觉中对象跟踪的用例监测零售自动驾驶汽车医疗保健 对象跟踪方法步骤 1&#xff1a;目标…