C++——STL常用类总结笔记

2023-11-20

目录

一、STL发展历程

二、iterator

三、list

四、Vector 

五、queue

六、容器

七、操作元素算法


一、STL发展历程

        STL =Standard Template Library标准模板库惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。
  在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>

  • 1双冒号表示域操作符,声明了一个类A,类A里声明了一个成员函数void f(),在类外使用void A::f()表示f()函数是A的成员函数
  • 2直接写在全局函数前,表示是全局函数,在子函数里变量前表示全局变量
  • 3表示引用成员函数及变量作用域成员运算符

例如 system::math::sqrt()相当于system.math.sqrt()

二、iterator

        iterator就象是容器中指向对象的指针STL的算法使用iterator在容器上进行操作。Iterator设置算法的边界,容器的长度,和其他一些事情。举个例子,有些iterator仅让算法读元素,有一些让算法写元素,有一些则两者都行。 Iterator也决定在容器中处理的方向。
     你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的end() 函数来得到过去的最后一个值(就是处理停在那的那个值)

三、list

        list<string> Milkshakes这句是你声明了list<string>模板类的一个实例,然后就是实例化这个类的一个对象使用list的成员函数push_backpush_front插入一个元素到list

我们现在有个4个字符串在list中。list的成员函数push_back()把一个对象放到一list的后面,而 push_front()把对象放到前面。我通常把一些错误信息push_back()到一个list中去,然后push_front()一个标题到list中,这样它就会在这个错误消息以前打印它了。

3.1 Empty()

知道一个list是否为空很重要。如果list为空empty()这个成员函数返回真我通常会这样使用它。通篇程序我都用push_back()来把错误消息放到list中去。然后,通过调用empty() 我就可以说出这个程序是否报告了错误。如果我定义了一个list来放信息,一个放警告,一个放严重错误,我就可以通过使用empty()轻易的说出到底有那种类型的错误发生了。
    我可以整理这些list,然后在打印它们之前,用标题来整理它们,或者把它们排序成类。

3.2 遍历

for循环来处理list中的元素

这个程序定义了一个iteratorMilkshakeIterator。我们把它指向了这个list的第一个元素。这可以调用Milkshakes.begin()来作到,它会返回一个指向list开头的iterator。然后我们把它和Milkshakes.end ()返回值来做比较,当我们到了那儿的时候就停下来。
    容器的end()函数会返回一个指向容器的最后一个位置的iterator。当我们到了那里,就停止操作。我们不能不理容器的end()函数的返回值。我们仅知道它意味着已经处理到了这个容器的末尾,应该停止处理了。所有的STL容器都要这样做。

STL的通用算法for_each来处理list中的元素

STL的通用算法count()来统计list中的元素个数

STL的通用算法count_if()来统计list中的元素个数

count_if() 带一个函数对象的参数。函数对象是一个至少带有一个operator()方法的类。有些STL算法作为参数接收函数对象并调用这个函数对象的operator()方法

这个程序是这样工作的:定义一个函数对象类IsAToothbrush,这个类的对象能判断出卖出的是否是牙刷。如果这个记录是卖出牙刷的记录的话,函数调用operator()返回一个true,否则返回false

list(导入头文件#include<list>)

1)定义与初始化

List<int>lst1

 

四、Vector 

Vector<int>::iteratorv = vec.begin();定义一个向量迭代器v指向vec容器的头

4.1 push_back() 成员函数在向量的末尾插入值,如果有必要扩展向量的大小

4.2 Size() 表示显示向量的大小

4.3 Begin() 函数返回一个指向向量开头的迭代器,end()指向向量末尾的迭代器

4.4 使用方法

1)导入头文件#include<vector>

2)定义及初始化

 

3)常用的操作方法

Vector声明二维数组

Vector<vector<int>>vec(m,vector<int>(n,0)),m*n的二维数组,所有元素为06.2

五、queue

queue队列就是一个容器, 先进入的数据先出来,后进入的数据后出来凡是具备这个关键性质的数据结构都叫队列。 你可以用数组也可以用链表队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

队列queue:include<queue>

push(x) x压入队列的末端

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

声明方式:queue<int> q;queue<容器类型> 名称

STL优先队列的使用方法:priority_queue<类型> 名称;

优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

队列deque(导入头文件#include<deque>)

Dequevector类似,支持随机访问和快速插入删除,它在容器中的某一位置上的操作所花费的是线性时间。与vector不同的是,deque支持从开始端插入数据:push_front(),其余类似vector方法的使用。

方法小结:

Insert(位置,数量,值)

Erase(位置起点,位置终点)

六、容器

容器:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。容器就是保存其他对象的对象

容器种类:

顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集,vector(向量),list(列表),deque(列队)顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定

关联容器:关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素元素是有序的集合,默认在插入的时候按升序排列。包括map(集合),set(映射)multimap(多重映射)

容器适配器:本质上,适配器是使一种不同的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保存所有元素”。STL 中包含三种适配器:栈stack队列queue 优先级队列priority_queue

 容器类自动申请和释放内存,因此无需newdelete操作

容器添加元素:

容器大小的操作

 

访问元素:backfront,at,[]

删除元素:erasepop_back,pop_front,clear

 

赋值与swapassignswap

 

七、操作元素算法

操作元素算法:<algorithm><numeric><functional>

算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STLsort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;

算法部分主要由头文件<algorithm><numeric><functional>组成。

<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
<functional>中则定义了一些模板类,用以声明函数对象。

STL中算法大致分为四类:
1)非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)可变序列算法:指可以修改它们所操作的容器内容的算法。
3)排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)数值算法:对容器内容进行数值计算

以下为举例:

find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator 

int *find(int *beginint *endint  value)

   前闭后合的区间 beginend中,查找value如果查找到了就返回第一个符合条件的元素,否则返回end指针

sort: 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作

unique: 清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。

remove: 删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数。

for_each: 用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。

max: 返回两个元素中较大一个。重载版本使用自定义比较操作

三迭代器iterator包括:iterator、const_iterator、reverse_iterator和const_reverse_iterator,

概念:用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素

库文件#include<cmath>

三角/反三角函数,双曲函数,指数对数函数exp(),log(),幂函数power()sart()开根号,误差与伽马函数,四舍五入ceil()floor,余数函数fmod(y,x)y/x的余数,round()四射五入,绝对值、最大、最小值fabs(x),abs(),fmax(x,y),fmin(x,y)等

参考:

百度百科:https://wenku.baidu.com/view/3a73a2d9c9d376eeaeaad1f34693daef5ef7133b.html

CSDN:https://www.cnblogs.com/whb-20160329/p/6657828.html

https://blog.csdn.net/frbevrqbn4l/article/details/78536887

https://blog.csdn.net/wsyhawl/article/details/78209562

plt:https://blog.csdn.net/u011995719/article/details/71124227

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++——STL常用类总结笔记 的相关文章

随机推荐

  • 官网下载Eclipse

    1 打开Eclipse官网 https www eclipse org 也可以在百度中 搜索 Eclipse 2 点击 Download 3 点击 Download Pakeges 4 下拉 选择所要的版本和系统 5 点击 Select A
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • C# 中Object的方法含义以及使用(详)

    如下图是object中的方法 上图来源于我阅读C 入门经典第8版的书本当中 图中明确标明方法的使用 以及含义 Equals方法 比较两个对象是否相等 在Object是所有的父类大家都知道 其中Object中方法Equals 有两种 obje
  • 【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~

    文章目录 真的来咯 爆炸信息窗口 设计思路 模块准备 删除好友警告 源代码 这时你可能会问 批量获取表情包 结束语 专栏 Python零基础入门篇 Python网络蜘蛛 Python数据分析 Django基础入门宝典 小玩意儿 Web前端学
  • c#方法参数:in

    方法参数in只能读入 不能在方法内修改 它和ref一样也需要在作为实参时就已经进行了初始化 而且同ref一样 无论定义方法还是调用方法都需要加上in关键字 class Program static void Add in int num1
  • 等级测评——定级、等级划分及测评时间

    定级 在等级保护中 定级这个步骤很关键 首先我们需要知道我们这个资产是什么样的一个级别 一级二级三级 因为不同的级别表示着我们要对这个资产做相应的保护 那么我们这个定级是怎么么定级呢 参考的又是什么标准呢 首先我们需要先确认定级对象 这个对
  • R----stringr包介绍学习

    1 stringr介绍 stringr包被定义为一致的 简单易用的字符串工具集 所有的函数和参数定义都具有一致性 比如 用相同的方法进行NA处理和0长度的向量处理 字符串处理虽然不是R语言中最主要的功能 却也是必不可少的 数据清洗 可视化等
  • Verilog中$timeformat的用法

    Verilog中 timeformat的用法 更新历史 20200807 首次发布 语法 timeformat的语法如下 timeformat units number precision number suffix string mini
  • (转发)西门子S7-1200PLC之间TCP通信实例步骤

    1 软件组态 新建两个CPU 在组态界面的网络视图手绘连接两个PLC的以太网口 如下 2 在两个CPU以太网口的属性中设置IP地址 设置同一网段 方便调试 3 在PLC 1程序块中添加个背景数据块 新建接收数组跟发送数组 以方便存放接收或发
  • mysql本机地址_mysql连接时用的IP地址是不是电脑本机上的IP地址呢!

    展开全部 是root用户的话 IP就是或 lt 127 0 0 1 gt 只是代表使用本机 不是代表本机IP地址 操作方法如下62616964757a686964616fe58685e5aeb931333433623737 1 首先 利用N
  • 【工具类】比较优雅的在工具类中,用泛型方法获取枚举的值

    目录 痛点 解决 优化更灵活的泛型 痛点 在代码中 经常用到枚举 也经常用到枚举获取code 获取type 通常我们写的代码如下 public enum Status YES 1 是 NO 2 否 private int code priv
  • 科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

    科技云报道原创 近年来 在云计算和网络安全产业的蓬勃发展下 我国云安全行业市场规模呈现高速增长态势 在网络安全市场总体规模中占比不断上升 据统计 近5年我国云安全市场保持高速增长 2021年我国云安全市场规模达到了117 7亿元 2022年
  • 移除wordpress前端自带的js和css

    wordpress在其wp head和wp foot函数中 会自动加载一些js和css 但这些js和css往往在我们实际的使用中却无法用到 这就造成了一些资源的浪费 会将我们的网站速度拖慢 我们之前发布了一篇文章清理header的文章 但是
  • lightGBM筛选特征及建模(系列文章二)

    新网银行杯 数据科学竞赛记录 之前写过一篇参加这个比赛过程中用xgboost的调参的文章 今天再记录一下用lightGBM作为特征筛选模型以及训练数据的过程 1 数据准备 新网的这个比赛主办方总共提供了三个数据集 命名分别为 train x
  • redis的持久化

    第一章 redis的持久化 1 1 持久化概述 持久化可以理解为将数据存储到一个不会丢失的地方 Redis 的数据存储在内存中 电脑关闭数据就会丢失 所以放在内存中的数据不是持久化的 而放在磁盘就算是一种持久化 为解决这个问题 redis提
  • visio交换机图标_一个完整的项目工程,交换机需要做哪些配置了?

    交换机是企业组网的重要设备 掌握交换机配置是作为网管的必备技能 这里以三层交换机的配置为例子 说一说配置的步骤 step1 配置管理地址 每个交换机需要配置一个管理地址 方便后期的远程维护 网络中的所有交换机等网络设备 可以使用一个管理VL
  • 3. Python 面向对象编程

    文章目录 Python 面向对象编程 1 3 1 面向对象编程理论 1 3 1 1 对象 1 3 1 2 类 1 3 1 3 面向对象编程的特点 1 3 2 Python 面向对象编程 1 3 2 1 Python 类与对象 1 3 2 2
  • javascript试题

    练习题 1 找到数组 1 2 1 10 4 5 8 中的最大值 至少写出两种方法 var arr 1 2 1 10 4 5 8 第一种 var max1 Math max apply null arr 第二种 var max2 arr so
  • 【计算机网络】湖科大微课堂笔记 p38-40 以太网交换机的生成树协议STP、虚拟局域网VLAN概述和实现机制

    以太网交换机的生成树协议STP 如何提高以太网的可靠性 若出现了链路故障 则可能会无法通信 可以通过添加冗余链路提高以太网可靠性 但是 冗余链路可能会形成网络环路 可能会带来网络风暴 使得帧在网络中反复转发 分别成顺时针和逆时针 可以类比图
  • C++——STL常用类总结笔记

    目录 一 STL发展历程 二 iterator 三 list 四 Vector 五 queue 六 容器 七 操作元素算法 一 STL发展历程 STL Standard Template Library标准模板库 惠普实验室开发的一系列软件