一、相关介绍

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

C++STL——概述相关推荐

  1. 【C++入门】C++ STL概述

    C++STL概述 文章目录 C++STL概述 一.STL基本概念 (1)泛型程序设计 (2)STL中的基本的概念 二.容器概述 (1)顺序容器 (2)关联容器 (3)容器适配器 (4)顺序容器和关联容 ...

  2. STL技术——STL概述和入门

    文章目录 STL技术--STL概述和入门 1.STL简介 2.入门案例 2.1.vecto存放内置数据类型 2.2.vecto存放自定义数据类型 2.3.容器嵌套 STL技术--STL概述和入门 1. ...

  3. 1.1 STL 概述

    综述 STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Mus ...

  4. C++ 标准模板库 STL 概述

    泛型程序设计 C++ 的特点: ​ C++ 的核心优势之一就是便于软件重用,而软件的重用在 C++ 中主要体现在以下两个方面: 面向对象的思想:继承.多态和标准类库 泛型程序设计的思想:模板机制和标准 ...

  5. STL教程(一): 标准模板库--STL概述

    STL是C++通用库,主要由迭代器.算法.容器.仿函数.内存分配器和配接器组成. STL主要的主要功能都被声明在13个头文件中,它们分别是:< algorithm >.< deque ...

  6. 三十分钟掌握STL(Using STL)

    STL概述 STL的一个重要特点是数据结构和算法的分离.尽管这是个简单的概念,但这种分离确实使得STL变得非常通用.例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包 ...

  7. C/C++学习之路: STL

    C/C++学习之路: STL 目录 STL概述 STL三大组件 常用容器 1. STL概述 STL(Standard Template Library,标准模板库),主要出现在 c++中,但是在引入 ...

  8. 短时间让大家对C++ STL有所学习

    STL概述 STL的一个重要特点是数据结构和算法的分离.尽管这是个简单的概念,但这种分离确实使得STL变得非常通用.例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包 ...

  9. 《STL源码剖析》总结

     转载自 :http://blog.csdn.net/liguohanhaha/article/details/52089914 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Co ...

最新文章

  1. CodeChef--EQUAKE
  2. lisp天正图元位置修改_块内图元的坐标定位[已解决]感谢版主
  3. springmvc十五:数据输出
  4. Zabbix linux agent 安装
  5. Firefox 密码管理器 Lockbox 推出 Android 版
  6. 指针数组与数组指针的区别
  7. 160个CrackMe破解思路合集
  8. ev3编程 越野机器人_【EV3基础编程 第四课】机器人编程的基础,先要学这些(下)...
  9. 怎么解决redis雪崩和穿透
  10. 台式计算机m4350,高配商用台式 联想启天M4350跌破五千
  11. World从任意页开始设置页码详细教程
  12. Drupal迁移 | 如何创建一个Drupal 7 到 Drupal 9 的迁移路线图
  13. 做自媒体使用哪款剪辑软件好呢?
  14. 升级iOS 16后续航时间变短了,如何提升续航?
  15. 微信小程序-template模板使用
  16. geometric distribution and exponential distribution(几何分布和指数分布)
  17. 失去黄金时代的趣店,要走多久才能成功转型?
  18. JavaScript利用Date对象实现倒计时效果
  19. JVM基础及JVM调优及常见参数详解
  20. Java单体应用 - 架构模式 - 03.设计模式-10.装饰器模式

热门文章

  1. Idea 设置Eclipse快捷键(常用)
  2. #10172. 「一本通 5.4 练习 1」涂抹果酱 题解
  3. ribbon源码(1) 概述
  4. oracle vm中的xp添加共享文件夹
  5. [LeetCode] 4Sum II 四数之和之二
  6. ArcGIS Engine开发之旅09--几何对象和空间参考
  7. HDU5697 刷题计划 dp+最小乘积生成树
  8. 复习知识点:UITableView和UICollectionView的常用属性
  9. PAT1069. The Black Hole of Numbers
  10. Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg