C++STL——概述

一、相关介绍

STL

  • 标准模板库
  • 在编写代码的过程中有一些程序经常会被用到,而且需求特别稳定,所以C++中把这些常用的模板做了统一的规范,慢慢的就形成了STL
  • 提供三种类型的组件: 容器、迭代器和算法,它们都支持泛型程序设计标准

容器

  • 顺序容器(vector、list、deque):通过元素在容器中的位置顺序存储和访问元素
  • 关联容器(set、map、multiset、multimap):通过键(Key)存储和读取元素
  • 容器适配器(stack、queue、priority_queue)

迭代器

  • 一种检查容器内元素并遍历元素的数据类型
  • 每种容器类型都定义了自己的迭代器类型
  • 包括:双向迭代器、随机迭代器

二、容器

【顺序容器】

  • 顺序容器中元素排列顺序与其值无关,而仅仅由元素添加到容器里的次序决定
  • 容器内的元素类型必须至少满足2个条件:可复制和可赋值
  • 所有的迭代器范围都是左闭右开区间,[beg,end) 包括beg,但不包括end

标准库定义了三种顺序容器:vectorlistdeque

vector——连续存储的元素,单向的

list——由节点组成的不连续存储的双向链表

deque——连续存储的元素,双向的

它们的区别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。

如下图:

【关联容器】

  • 独特之处在于支持键的使用
  • 支持通过键来高效地查找和读取元素

标准库定义了两种关联容器:set,map

set——仅含一个键,并有效地支持关于某个键是否存在的查询

map——元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的元素

一般来说,如果希望有效的存储不同值的集合,那么set容器比较合适,而map容器则更适用于需要存储(乃至修改)每个键所关联值的情况。

在做某种文本处理时,可使用set保存要忽略的单词。而字典则是map的一种很好的应用:单词本身是键,而它的解释说明则是值。

mapset类型的对象所包含的元素都具有不同的键,不允许同一个键添加第二个元素。如果一个键必须对应多个实例,则需要使用multimapmultiset类型。

【容器适配器】

  • 不是第一类容器
  • 没有提供与元素的保存形式有关的真正数据结构实现
  • 适配器都是建立在某个顺序容器之上的
  • 适配器不支持迭代器
  • 优点:能够使程序员选择一种合适的底层数据结构

STL提供了三种容器适配器:stack,queue,priority_queue。

statck——可以建立在vector,list,deque任何一种容器之上
queue——要求关联容器提供front操作,所以只有list和deque满足
priority_queue——要求提供随机访问功能 ,所有只有vector和deque满足

  • stack类允许在底层数据结构的一端执行插入和删除操作(先入后出)。堆栈能够用任何顺序容器实现:vector、list、deque。
  • queue类允许在底层数据结构的末尾插入元素,也允许从前面插入元素(先入先出)。队列能够用STL数据结构的list和deque实现,默认情况下是用deque实现的。
  • priority_queue类,能够按照有序的方式在底层数据结构中执行插入操作,也能从底层数据结构的前面执行删除操作。priority_queue能够用STL的序列容器vector和deque实现。默认情况下使用vector作为底层容器的。当元素添加到priority_queue时,它们按优先级顺序插入。这样,具有最高优先级的元素,就是从priority_queue中首先被删除的元素。通常这是利用堆排序来实现的。堆排序总是将最大值(即优先级最高的元素)放在数据结构的前面。这种数据结构称为(heap)。

 

三、迭代器

 

一、迭代器的变化

和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 
在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 

二、迭代器的实现

迭代器是一个对象,vector的迭代器是封装了数组下标;list、map、set的迭代器是封装了元素节点的指针。 
还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n),2是set中元素的值不可改变。

 

【小问题】

set是基于红黑树实现的,那么set的迭代器begin()、end()是指向哪里的呢? 
一个测试程序:

#include<iostream>
#include<set>
using namespace std;
int main(){set<int> myset;myset.insert(4);myset.insert(7);myset.insert(2);myset.insert(0);myset.insert(4);set<int>::iterator it;for(it = myset.begin(); it != myset.end(); it++){cout<< *it;   //输出结果是:0247}
}

红黑树首先是二叉搜索树,所以begin()迭代器指向红黑树的最左边的节点,end()迭代器指向红黑树的最右边的节点。另外这个小程序还说明了重复插入无效。

 

(1)STL中迭代器容器中都要注意的地方(vector中已经提到):
1)任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)
2)begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
3)迭代器的时效性,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果

(2)list的迭代器是双向迭代器(只能++   --,没有偏移功能)而不是像vector那样的随机迭代器(和指针几乎一样的所有功能)

在list中,由于其内存是非连续的,因此不能像vector那样,用[]操作符取值,只能用迭代器。

(3)list和vector的区别,本质区别:list是链式存储,vector在内存中是连续区别的,有本质区别而导致下面区别

1)list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素,而list是不可以的

2) list的插入和删除效率很高,所以list有push_front、pop_front、sort而vector中这些操作的效率太低了,所以STL中没有写这些功能

与vector相比,list除了有push_back()//在尾部插入 和 insert()之外,还有push_front()//即在链表的头部插入

3)list的一些特有的函数remove、reverse、unique、splice、merge功能(这些连deque中都没有的)

转载于:https://www.cnblogs.com/xzxl/p/7277261.html

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

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

相关文章

固态硬盘可靠性_您可以通过使用较少的总容量来提高硬盘的可靠性吗?

固态硬盘可靠性Your computer has a massive hard drive that you significantly underuse. Would decreasing the size of the primary partition actually increase the lifespan of the drive? 您的计算机具有大量未充分使用的巨大硬盘驱动器。 减小主分区的大小是否会真正…

接收上传的multi-file的文件(四)

构建工程 为例创建一个springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依赖。为例能够上传文件在服务器&#xff0c;你需要在web.xml中加入标签做相关的配置&#xff0c;但在sringboot 工程中&#xff0c;它已经为你自动做了&#xff0c;所…

数据库读写分离 - MyBatis

2019独角兽企业重金招聘Python工程师标准>>> 由于项目中数据量较大&#xff0c;访问量也较高&#xff0c;故在数据库的设计上&#xff0c;采用读写分离思想&#xff0c;达到性能要求&#xff01; 简单科普一下实现读写分离的思路 配置及加载数据库信息&#xff0c;即…

MySQL-03:数据表操作基本命令笔记

目录 数据表 1、创建表 2、删除表 3、清空表 4、修改表 5、基本数据类型 数据表 1、创建表 create table 表名(列名 类型 是否可以为空&#xff0c;列名 类型 是否可以为空 )ENGINEInnoDB DEFAULT CHARSETutf8 是否可空&#xff0c;null表示空&#xff0c;非字符串n…

java 怎么调试到第三方库的内部,在有源码的情况下

第一步&#xff0c; 把第三方库加到workspace : https://stackoverflow.com/questions/370814/how-to-set-a-breakpoint-in-eclipse-in-a-third-party-library The most sure-fire way to do this (and end up with something thats actually useful) is to download the sou…

t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏

t-mobile频段Attackers may have compromised three percent of T-Mobile’s 77 million customers on Monday, revealing personal information like addresses, phone numbers, and account numbers. 周一&#xff0c;攻击者可能泄露了T-Mobile 7700万客户中的3&#xff05;&…

第二篇 第三章防火防烟分区检查(一)

仓库面积可以增加3倍 就是乘以4 要一定条件 : 第二篇 第三章防火防烟分区检查&#xff08;一&#xff09; 21分钟处 该题比较有代表性 停车库 耐火等级允许最大面积 民用建筑防火分区 防烟分区的划分    防火卷帘控制器的测试 防火阀 装在通风,空调系统中 只有连在风机主管…

高斯数学

伟大的数学家高斯在9岁那年&#xff0c;用很短的时间完成了从1到100的累加。那原本是老师给学生们出的难题&#xff0c;希望他们能老老实实地待在教室里。高斯的方法很简单&#xff0c;他发现这是50个101的求和&#xff1a;100&#xff0b;1、99&#xff0b;2、98&#xff0b;3…

Ant Design Blazor 发布 0.13.0,正式支持.NET 7!

时隔3个月&#xff0c;Ant Design Blazor 发布新功能版本 0.13.0&#xff0c;并正式支持.NET 7!大家快去访问 antblazor.com 体验吧&#xff01;&#x1f525; 新增 .NET 7 目标框架支持。#2810 ElderJames&#x1f525; 重构 Mentions 组件&#xff0c;修复定位和隐藏问题。#2…

gitlab 分支操作笔记\新建远程分支\抓取远程分支\复制远程\删除分支

密码重新输入与保存 git config --global http.emptyAuth truegit config --global credential.helper store 1.不复制远程&#xff0c;直接新建远程分支。&#xff08;非正规操作&#xff09; git init //初始化 git remote add origin http://****/*****/taskboard.git…

如何在Xbox One或PlayStation 4上为Skyrim特别版安装Mods

The Elder Scrolls V: Skyrim Special Edition is now available on PlayStation 4 and Xbox One, and for the first time, “mods” are available to console gamers. Elder Scrolls V&#xff1a;Skyrim特别版现已在PlayStation 4和Xbox One上可用&#xff0c;并且首次向主…

微软宣布:PowerBI 已经与 Office 整合,一切更简单,变革又来了

很多人认为 Office 是 Office&#xff0c;PowerBI 是 PowerBI&#xff0c;怎么在 PPT 中显示 PowerBI 呢&#xff1f;这种问题以后将再不会存在。微软已经宣布&#xff0c;PowerBI 已经与 Office 深度整合&#xff0c;在未来的企业中&#xff0c;PowerBI 将与 Word&#xff0c;…

066:ORM查询条件详解-startswith和endswith:

ORM查询条件详解-startswith和endswith&#xff1a; startswith&#xff1a;判断某个字段的值是否是以某个值开始的。大小写敏感。示例代码如下&#xff1a; articles1 Article.objects.filter(title__startswith"fuck") 以上代码的意思是提取所有标题以 fuck 字符串…

前端工程师面试题汇总

HTML Doctype作用&#xff1f;严格模式与混杂模式如何区分&#xff1f;它们有何意义? HTML5 为什么只需要写 <!DOCTYPE HTML>&#xff1f; 行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; 页面导入样式时&#xff0c;使用lin…

MySQL-04:数据内容操作-增删改查-基本命令笔记

1、增 insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 (列名,列名...) select (列名,列名...) from 表 2、删 delete from 表 delete from 表 where id&#xff1d;1 and name&…

火狐和chrome_Firefox,Chrome和Edge都将支持WebAuthn的硬件两因素身份验证

火狐和chromeLogging into Gmail or Facebook could soon mean plugging in a USB device, potentially making phishing a thing of the past. 登录Gmail或Facebook可能很快就意味着要插入USB设备&#xff0c;这可能使网络钓鱼成为过去。 That’s thanks to WebAuthn, a new o…

Could not delete .........May be locked by another process.

问题 原因&#xff1a;默认的设置是文件修改后立即发布&#xff0c;这样的设置是在你每个保存文件时都会触发&#xff0c;如果tomcat已经在运行&#xff0c;这样频繁的操作也会造成文件锁死 解决&#xff1a; Tomcat 右键clean 转载于:https://www.cnblogs.com/feiZhou/p/93…

flask的基础1

1.python 现阶段三大主流web框架Django Tornado Flask的对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架 2.Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属…

python实现批量压缩文件夹

前段时间碰到一个需要把目录下文件夹压缩的项目&#xff0c;但是度娘里没找到&#xff0c;只好自己写脚本了。 #coding:utf-8 import os filePath raw_input("请输入路径&#xff1a;") if filePath "":os._exit() #需要退出ds list(os.walk(filePath…

单元测试01:nunit 安装与代码测试

1.nunit 下载与安装 a.下载 下载地址&#xff1a; http://nunit.org/download/ b.添加到系统环境变量 解压下载包后&#xff0c;添加两个路径到环境变量&#xff0c;如&#xff1a; D:\nunitD:\nunit\nunit-console 2.建立测试项目 a.建立class project b.project 里re…