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;同步模式&…

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

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

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

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

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

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

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;也就是大…

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;调用过早…

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

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

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node&#xff0c;npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代&#xff0c;安卓与iOS系统犹如两位王者&#xff0c;各自拥有庞大的用户群体。有人钟情于安卓的开放与多样&#xff0c;有人偏爱iOS的流畅与稳定。甚至&#xff0c;有些人为了满足不同需求&#xff0c;同时使用着两个系统的手机。我就是其中的一员。 工作中…

攻防世界-web-Training-WWW-Robots

题目信息 In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it. Sometimes these files rev…

你正在读的书,暴露了你的阶层!丰富自己吧!——早读

明天大概率可以看鸽子了 引言Python代码第一篇 人民日报 全网等的图来了&#xff01;当故宫“遇上”龙年初雪第二篇 人民日报【夜读】一个人最好的生活方式&#xff0c;是丰富自己第三篇&#xff08;跳&#xff09; 洞见 你正在读的书&#xff0c;暴露了你的阶层第四篇&#xf…

Maven私服搭建Nexus3

第一部分&#xff1a;仓库部署 下载地址&#xff1a;https://help.sonatype.com/en/download.html 备用下载链接&#xff0c;部分已经失效了 解压后会有两个文件夹&#xff1a; nexus-3.20.1-01 sonatype-work 访问地址配置路径 \nexus-3.20.1-01\bin\nexus.vmoptions -Xms1…

喀秋莎画中画怎么设置 喀秋莎画中画视频怎么导出 喀秋莎什么意思 camtasia studio下载

画中画视频&#xff0c;顾名思义&#xff0c;就是在一个视频中有两个画面&#xff0c;游戏解说、微课等类型的视频常常就以画中画的形式出现。作为一款专业的视频编辑软件&#xff0c;使用camtasia可以轻松地制作画中画视频并导出。接下来我将为大家介绍&#xff1a;喀秋莎画中…

每日coding 337打家劫舍III

337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。…

【Linux】日志命令行练习(持续更新)

文章目录 前言环境情景1. 获取实时日志2. 关键字定位3. 关键字取并集4. 关键字取交集5. 关键字取差集6. 关键字实时日志捕获7. 关键词上下文打印8. 关键词滚动搜索9. 看最早的日志信息 前言 公司生产问题需要登录堡垒机排查。 没有日志平台的情况下&#xff0c;生产问题同样要…